import {
  BaseEntity,
  Column,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { DrivingOffenseEntity } from './driving-offense.entity';
import { PaymentEntity } from '../../payment/entities/payment.entity';

export enum DrivingOffenseBillStatus {
  unpaid = 'unpaid',
  paid = 'paid',
  done = 'done',
}

@Index(
  'fk_driving_offenses_bills_driving_offense_idx',
  ['drivingOffenseId'],
  {},
)
@Entity('driving_offense_bills')
export class DrivingOffenseBillEntity extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('int', { name: 'drivingOffenseId' })
  drivingOffenseId: number;

  @Column('int', { name: 'paymentId', nullable: true })
  paymentId: number | null;

  @Column('int', { name: 'amount' })
  amount: number;

  @Column('varchar', { name: 'billId', length: 128 })
  billId: string;

  @Column('varchar', { name: 'payId', length: 128 })
  payId: string;

  @Column('varchar', { name: 'paymentKey', nullable: true, length: 128 })
  paymentKey: string | null;

  @Column('varchar', { name: 'city', nullable: true, length: 255 })
  city: string | null;

  @Column('varchar', { name: 'date', nullable: true, length: 128 })
  date: string | null;

  @Column('varchar', { name: 'deliveryType', nullable: true, length: 255 })
  deliveryType: string | null;

  @Column('text', { name: 'location', nullable: true })
  location: string | null;

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

  @Column('varchar', { name: 'typeId', nullable: true, length: 128 })
  typeId: string | null;

  @Column('varchar', { name: 'imageId', nullable: true, length: 255 })
  imageId: string | null;

  @Column('enum', {
    name: 'status',
    enum: DrivingOffenseBillStatus,
    default: () => DrivingOffenseBillStatus.unpaid,
  })
  status: DrivingOffenseBillStatus;

  @Column('datetime', { name: 'createdAt' })
  createdAt: Date;

  @Column('datetime', { name: 'updatedAt' })
  updatedAt: Date;

  /**
   * relations
   */
  @ManyToOne(
    () => DrivingOffenseEntity,
    (drivingOffense) => drivingOffense.drivingOffenseBills,
    { onDelete: 'NO ACTION', onUpdate: 'NO ACTION' },
  )
  @JoinColumn([{ name: 'drivingOffenseId', referencedColumnName: 'id' }])
  drivingOffense: DrivingOffenseEntity;

  @ManyToOne(() => PaymentEntity, (payments) => payments.drivingOffenseBills, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'paymentId', referencedColumnName: 'id' }])
  payment: PaymentEntity;
}
