import { Entity, PrimaryGeneratedColumn, ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn, Column, OneToMany, OneToOne } from "typeorm"
import { Campaign } from "./campaign.entity"
import { Users } from "./users.entity"
import { Draft } from "./draft.entity"
import { Posts } from "./posts.entity"
import { RejectCompletionRequest } from "./reject-completion-request.entity"
import { Dispute } from "./dispute.entity"
import { CampaignPayment } from "./campaign_payment.entity"
import { CampaignAiReport } from "./campaign-ai-report.entity"

export enum InfluencerStatus {
    CLOSED = "closed",
    COMPLETION_REQUEST = "completion_request",
    DRAFT_AVAILABLE = "draft_available",
    DRAFTING_DELIVERABLES = "drafting_deliverables",
    POSTING_DELIVERABLES = "posting_deliverables",
    QUOTATION_AVAILABLE = "quotation_available",
    UNCONNTACTED = "uncontacted",
    WAITING_FOR_QUOTATIONS = "waiting_for_quotations",
    ARCHIVED = "archived"
}

export const PRICE_CHANGE_STAGE_LABELS: Record<string, string> = {
    [InfluencerStatus.DRAFTING_DELIVERABLES]: 'Drafting',
    [InfluencerStatus.DRAFT_AVAILABLE]: 'Draft Ready',
    [InfluencerStatus.POSTING_DELIVERABLES]: 'Publishing',
    [InfluencerStatus.COMPLETION_REQUEST]: 'Completion Request',
};

export enum PaymentMode {
    OFFLINE = "offline",
    ONLINE = "online",
}

export enum JobStatus {
    INPROGRESS = "inprogress",
    CLOSED = "closed",
    CANCELLED = 'cancelled'
}

@Entity("campaign_influencers")
export class CampaignInfluencer {
    @PrimaryGeneratedColumn("uuid")
    id: string

    @ManyToOne(() => Campaign, (campaign) => campaign.campaignInfluencers, { onDelete: "CASCADE" })
    @JoinColumn({ name: "campaign_id" })
    campaign: Campaign

    @ManyToOne(() => Users, (influencer) => influencer.campaignInfluencer)
    influencer: Users

    @Column({ type: "enum", enum: InfluencerStatus, default: InfluencerStatus.UNCONNTACTED })
    status: InfluencerStatus

    @Column({ type: "enum", enum: InfluencerStatus, default: InfluencerStatus.UNCONNTACTED })
    influencer_status: InfluencerStatus

    @Column({ type: "varchar", length: 255, nullable: true })
    chat_id: string

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

    @Column({ type: "varchar", length: 255, nullable: true })
    completed_date: string

    @Column({ type: 'enum', enum: JobStatus, nullable: true })
    job_status: string

    @Column({ name: "influencer_budget", type: "decimal", precision: 10, scale: 2, default: 0.00 })
    influencer_budget: number

    @Column({ name: "influencer_budget_usd", type: "decimal", precision: 10, scale: 2, default: 0.00 })
    influencer_budget_usd: number

    @Column({ type: 'boolean', default: false })
    is_budget_changed: boolean

    @Column({ name: "influencer_budget_new", type: "decimal", precision: 10, scale: 2, default: 0.00 })
    influencer_budget_new: number

    @Column({ name: "influencer_budget_usd_new", type: "decimal", precision: 10, scale: 2, default: 0.00 })
    influencer_budget_usd_new: number

    @Column({ type: "varchar", length: 255, nullable: true })
    currency: string

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

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

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

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

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

    @Column({ type: "text", nullable: true })
    message: string

    @Column({ type: "enum", enum: PaymentMode, default: PaymentMode.ONLINE })
    payment_mode: PaymentMode

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

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

    @Column({ name: "post_due_date", type: "date", nullable: true })
    post_due_date: Date

    @Column({ name: "draft_due_date", type: "date", nullable: true })
    draft_due_date: Date

    @Column({ type: "timestamp", nullable: true })
    notification_reminder_at: Date

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

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

    @Column({ type: "timestamp", nullable: true })
    completion_request_at: Date

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

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

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

    @Column({ type: 'decimal', precision: 10, scale: 2, default: 0.00 })
    recommended_score: number;

    @Column({ name: 'ai_score', type: 'decimal', precision: 10, scale: 2, nullable: true })
    ai_score: number;

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

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

    @Column({ name: 'ai_score_pending', type: 'boolean', default: true })
    ai_score_pending: boolean;

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

    @OneToMany(() => Draft, (draft) => draft.campaign_influencer)
    drafts: Draft[];

    @OneToMany(() => Posts, (posts) => posts.campaign_influencer)
    posts: Posts[];

    @OneToMany(() => RejectCompletionRequest, (reject) => reject.campaign_influencer)
    rejectCompletionRequest: RejectCompletionRequest[];

    @OneToOne(() => Dispute, (dispute) => dispute.campaign_influencer)
    dispute: Dispute;

    @OneToOne(() => CampaignPayment, (payment) => payment.campaign_influencer)
    campaignPayment: CampaignPayment;

    @OneToMany(() => CampaignAiReport, (campaignAiReport) => campaignAiReport.campaign_influencer)
    campaignAiReports: CampaignAiReport[];

    @CreateDateColumn()
    createdAt: Date

    @UpdateDateColumn()
    updatedAt: Date
}
