import {
  BaseEntity,
  Column,
  Entity,
  Index,
  JoinColumn,
  ManyToOne,
  PrimaryGeneratedColumn,
} from 'typeorm';
import { CarEntity } from '../../car/entities/car.entity';
import { UserEntity } from '../../user/entities/user.entity';
import { BooleanTransformer } from '../../../utils/transformers/BooleanTransformer';

export enum InsuranceInquiryClient {
  site = 'site',
  app = 'app',
  panel = 'panel',
  system = 'system',
}

@Index('fk_insurance_inquires_cars1_idx', ['carId'], {})
@Index('fk_insurance_inquires_users1_idx', ['userId'], {})
@Entity('insurance_third_party_inquires')
export class InsuranceThirdPartyInquiryEntity extends BaseEntity {
  @PrimaryGeneratedColumn({ type: 'int', name: 'id' })
  id: number;

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

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

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

  @Column('varchar', { name: 'nationalCode', length: 45 })
  nationalCode: string;

  @Column('varchar', { name: 'companyName', length: 45 })
  companyName: string;

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

  @Column('date', { name: 'startedAt' })
  startedAt: string;

  @Column('date', { name: 'expiredAt' })
  expiredAt: string;

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

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

  @Column('tinyint', {
    name: 'hasDamage',
    width: 1,
    default: () => "'0'",
    transformer: new BooleanTransformer(),
  })
  hasDamage: boolean;

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

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

  @Column('int', { name: 'lifeDamageCount', default: () => "'0'" })
  lifeDamageCount: number;

  @Column('int', { name: 'financialDamageCount', default: () => "'0'" })
  financialDamageCount: number;

  @Column('int', { name: 'driverDamageCount', default: () => "'0'" })
  driverDamageCount: number;

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

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

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

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

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

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

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

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

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

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

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