import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, CreateDateColumn, JoinColumn, UpdateDateColumn, DeleteDateColumn, OneToMany } from 'typeorm';
import { Users } from './users.entity';
import { Plan } from './plan.entity';
import { CANCELLED } from 'dns';
import { SubscriptionHistory } from './subscription-history.entity';
import { UserPermissions } from './user-permissions.entity';

export enum SubscriptionStatus {
    PENDING = 'pending',
    ACTIVE = 'active',
    DEACTIVE = 'decative',
    CANCELED = 'canceled',
    FAILED = 'failed',
    UPCOMING = 'upcoming',
}
export enum Interval {
    MONTH = 'month',
    YEAR = 'year'
}

@Entity('subscription')
export class Subscription {
    @PrimaryGeneratedColumn('uuid')
    id: string;

    @ManyToOne(() => Users, (user) => user.subscription)
    users: Users;

    @ManyToOne(() => Plan, (plan) => plan.subscription)
    plan: Plan;

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

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

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

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

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

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

    @Column({ type: 'enum', enum: Interval, default: Interval.MONTH })
    interval: string;

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

    @Column({ default: 'online' })
    payment_mode: string;

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

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

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

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

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

    @OneToMany(() => SubscriptionHistory, (sub) => sub.subsciption, { onDelete: 'CASCADE' })
    subscription_history: SubscriptionHistory[];

    @OneToMany(() => UserPermissions, (sub) => sub.subscription)
    userPermissions: UserPermissions[];

    @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;

}