import { Entity, PrimaryGeneratedColumn, ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn, Column, OneToMany, DeleteDateColumn, Collection, OneToOne } from "typeorm"
import { Campaign } from "./campaign.entity"
import { Users } from "./users.entity"
import { DraftVersions } from "./draft_versions.entity"
import { DraftComments } from "./draft_comments.entity"
import { CampaignInfluencer } from "./campaign_influencer.entity"
import { DisputeHistory } from "./dispute-history.entity"
import { Expose } from "class-transformer"
import { CampaignPayment } from "./campaign_payment.entity"

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


export enum PAYMENT_STATUS {
    CREDITED = "credited",
    DEBITED = "debited",
    REFUNDED = "refunded"
}

@Entity("campaign_payment_history")
export class CampaignPaymentHistory {
    @PrimaryGeneratedColumn("uuid")
    id: string

    @ManyToOne(() => Users, (user) => user.id)
    @JoinColumn({ name: "user_id" })
    users: Users

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

    @Column({ nullable: true })
    currency: string;

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

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

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

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

    @Column({ type: "decimal", precision: 10, scale: 2, default: 0.00, comment: "STRIPE EXCHANGE RATE" })
    exchange_rate: number

    @Column({ type: "decimal", precision: 10, scale: 2, default: 0.00, comment: "STRIPE TRANSACTION FEE" })
    transaction_fee_usd: number

    @Column({ type: "decimal", precision: 10, scale: 2, default: 0.00, comment: "FINAL AMOUNT IN USD" })
    final_amount_usd: number

    @Column({ type: "enum", enum: PAYMENT_STATUS, nullable: true })
    payment_status: PAYMENT_STATUS

    @ManyToOne(() => CampaignPayment, (payment) => payment.id)
    @JoinColumn({ name: "campaign_payment_id" })
    campaign_payment: CampaignPayment

    @CreateDateColumn({
        type: 'timestamp',
        precision: 0,
        default: () => 'CURRENT_TIMESTAMP',
    })
    created_at: Date;

    @UpdateDateColumn({
        type: 'timestamp',
        precision: 0,
        default: () => 'CURRENT_TIMESTAMP',
        onUpdate: 'CURRENT_TIMESTAMP',
    })
    updated_at: Date;

    @DeleteDateColumn({ type: 'timestamp', nullable: true, precision: 0 })
    deleted_at: Date;

}
