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

@Entity("transactions")
export class Transaction {
  @PrimaryGeneratedColumn()
  id: number

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

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

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

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

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

  @Column({ type: "varchar", length: 10, default: "usd" })
  currency: string

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

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

  @Column({
    name: "stripe_invoice_id",
    type: "varchar",
    length: 255,
    nullable: true,
  })
  stripe_invoice_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(() => Subscription, (sub) => sub.id)
  @JoinColumn({ name: "subscription_id" })
  subscription: Subscription

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