import {
  BaseEntity,
  Column,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  OneToMany,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { DrivingOffenseBillEntity } from './driving-offense-bill.entity';
import { CarEntity } from '../../car/entities/car.entity';
import { PaymentEntity } from '../../payment/entities/payment.entity';
import { UserEntity } from '../../user/entities/user.entity';

export enum DrivingOffenseStatus {
  pending = 'pending',
  paid_inquiry = 'paid_inquiry',
  inquired = 'inquired',
  paid_offense = 'paid_offense',
}

export enum DrivingOffenseType {
  basic = 'basic',
  advanced = 'advanced',
}

export enum DrivingOffenseClient {
  site = 'site',
  app = 'app',
  panel = 'panel',
}

@Index('fk_driving_offenses_cars1_idx', ['carId'], {})
@Index('fk_driving_offenses_payments1_idx', ['paymentInquiryId'], {})
@Index('fk_driving_offenses_users1_idx', ['userId'], {})
@Entity('driving_offenses', { schema: 'autotik' })
export class DrivingOffenseEntity extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

  @Column('char', { name: 'userId', length: 36 })
  userId: string;

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

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

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

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

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

  @Column('enum', {
    name: 'type',
    nullable: true,
    enum: DrivingOffenseType,
    default: () => DrivingOffenseType.basic,
  })
  type: DrivingOffenseType | null;

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

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

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

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

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

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

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

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

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

  @Column('enum', {
    name: 'client',
    enum: DrivingOffenseClient,
    default: () => DrivingOffenseClient.site,
  })
  client: DrivingOffenseClient;

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

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

  /**
   * Relations
   */
  @OneToMany(
    () => DrivingOffenseBillEntity,
    (drivingOffenseBills) => drivingOffenseBills.drivingOffense,
  )
  drivingOffenseBills: DrivingOffenseBillEntity[];

  @ManyToOne(() => CarEntity, (cars) => cars.drivingOffenses, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'carId', referencedColumnName: 'id' }])
  car: CarEntity;

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

  @ManyToOne(() => UserEntity, (users) => users.drivingOffenses, {
    onDelete: 'NO ACTION',
    onUpdate: 'NO ACTION',
  })
  @JoinColumn([{ name: 'userId', referencedColumnName: 'id' }])
  user: UserEntity;
}
