import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  ManyToOne,
  JoinColumn,
} from "typeorm"
import { User } from "src/modules/users/entity/users.entity"
import { SubscriptionPlan } from "src/modules/subscription-plans/entities/subscription-plan.entity"

@Entity("subscriptions")
export class Subscription {
  @PrimaryGeneratedColumn()
  id: number

  @Column({ name: "user_id", type: "bigint", unsigned: true })
  user_id: number

  @Column({ name: "plan_id", type: "bigint", unsigned: true, nullable: true })
  plan_id: number

  @Column({ type: "varchar", length: 50, default: "trialing" })
  status: string

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

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

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

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

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

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

  @Column({ name: "cancel_at_period_end", type: "tinyint", default: 0 })
  cancel_at_period_end: number

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

  @Column({
    name: "next_plan_id",
    type: "bigint",
    unsigned: true,
    nullable: true,
  })
  next_plan_id: number

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

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

  @CreateDateColumn({ type: "timestamp", nullable: true })
  created_at?: Date

  @UpdateDateColumn({ type: "timestamp", nullable: true })
  updated_at?: Date

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

  @ManyToOne(() => SubscriptionPlan, (plan) => plan.id)
  @JoinColumn({ name: "plan_id" })
  plan: SubscriptionPlan

  @ManyToOne(() => SubscriptionPlan, (plan) => plan.id)
  @JoinColumn({ name: "next_plan_id" })
  next_plan: SubscriptionPlan
}
