import {
    Entity,
    PrimaryGeneratedColumn,
    Column,
    CreateDateColumn,
    UpdateDateColumn,
    ManyToOne,
    JoinColumn,
    Index,
} from 'typeorm';
import { Campaign } from './campaign.entity';
import { Users } from './users.entity';

export enum AiReportStatus {
    PENDING = 'Pending',
    IN_PROGRESS = 'In_progress',
    COMPLETED = 'Completed',
    FAILED = 'Failed',
}

@Entity('ai_report_log')
@Index('IDX_ai_report_log_campaign_created', ['campaign', 'created_at'])
@Index('IDX_ai_report_log_status_created', ['status', 'created_at'])
@Index('IDX_ai_report_log_user_created', ['user', 'created_at'])
export class AiReportLog {
    @PrimaryGeneratedColumn('uuid')
    id: string;

    @ManyToOne(() => Campaign, { onDelete: 'CASCADE' })
    @JoinColumn({ name: 'campaign_id' })
    campaign: Campaign;

    @ManyToOne(() => Users, { onDelete: 'CASCADE' })
    @JoinColumn({ name: 'user_id' })
    user: Users;

    @Column({
        type: 'enum',
        enum: AiReportStatus,
        default: AiReportStatus.PENDING,
    })
    status: AiReportStatus;

    @Column({ name: 'number_of_applicant', type: 'int', default: 0 })
    number_of_applicant: number;

    @Column({ name: 'request_json', type: 'jsonb', nullable: true })
    request_json: Record<string, any>;

    @Column({ name: 'response_json', type: 'jsonb', nullable: true })
    response_json: Record<string, any>;

    @Column({ name: 'response_id', type: 'varchar', length: 255, nullable: true })
    response_id: string;

    @Column({ name: 'model_name', type: 'varchar', length: 255, nullable: true })
    model_name: string;

    @Column({ name: 'metadata_json', type: 'jsonb', nullable: true })
    metadata_json: Record<string, any>;

    @Column({ name: 'input_token', type: 'int', nullable: true })
    input_token: number;

    @Column({ name: 'output_token', type: 'int', nullable: true })
    output_token: number;

    @Column({ name: 'total_token', type: 'int', nullable: true })
    total_token: number;

    @Column({ name: 'quota_deducted', type: 'boolean', default: false })
    quota_deducted: boolean;

    @Column({ name: 'error_message', type: 'text', nullable: true })
    error_message: string;

    @Column({ name: 'started_at', type: 'timestamp', nullable: true })
    started_at: Date;

    @Column({ name: 'completed_at', type: 'timestamp', nullable: true })
    completed_at: Date;

    @CreateDateColumn({ name: 'created_at' })
    created_at: Date;

    @UpdateDateColumn({ name: 'updated_at' })
    updated_at: Date;
}
