import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  Index,
} from 'typeorm';

/**
 * Tipo de Documento
 */
export enum TipoDocumento {
  LICENCIA = 'LICENCIA',
  INE = 'INE',
  CURP = 'CURP',
  RFC = 'RFC',
  NSS = 'NSS',
  TARJETA_CIRCULACION = 'TARJETA_CIRCULACION',
  POLIZA_SEGURO = 'POLIZA_SEGURO',
  VERIFICACION = 'VERIFICACION',
  PERMISO_SCT = 'PERMISO_SCT',
  CERTIFICADO_FISICO = 'CERTIFICADO_FISICO',
  ANTIDOPING = 'ANTIDOPING',
  OTRO = 'OTRO',
}

/**
 * Tipo de Entidad
 */
export enum TipoEntidadDocumento {
  UNIDAD = 'UNIDAD',
  REMOLQUE = 'REMOLQUE',
  OPERADOR = 'OPERADOR',
}

@Entity({ schema: 'fleet', name: 'documentos_flota' })
@Index('idx_documento_entidad', ['entidadTipo', 'entidadId'])
@Index('idx_documento_tipo', ['tenantId', 'tipoDocumento'])
export class DocumentoFlota {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column({ name: 'tenant_id', type: 'uuid' })
  tenantId: string;

  // Referencia polimórfica
  @Column({ name: 'entidad_tipo', type: 'varchar', length: 20 })
  entidadTipo: TipoEntidadDocumento;

  @Column({ name: 'entidad_id', type: 'uuid' })
  entidadId: string;

  // Documento
  @Column({ name: 'tipo_documento', type: 'enum', enum: TipoDocumento })
  tipoDocumento: TipoDocumento;

  @Column({ type: 'varchar', length: 200 })
  nombre: string;

  @Column({ name: 'numero_documento', type: 'varchar', length: 100, nullable: true })
  numeroDocumento: string;

  @Column({ type: 'text', nullable: true })
  descripcion: string;

  // Vigencia
  @Column({ name: 'fecha_emision', type: 'date', nullable: true })
  fechaEmision: Date;

  @Column({ name: 'fecha_vencimiento', type: 'date', nullable: true })
  fechaVencimiento: Date;

  @Column({ name: 'dias_alerta_vencimiento', type: 'int', default: 30 })
  diasAlertaVencimiento: number;

  // Archivo
  @Column({ name: 'archivo_url', type: 'text', nullable: true })
  archivoUrl: string;

  @Column({ name: 'archivo_nombre', type: 'varchar', length: 255, nullable: true })
  archivoNombre: string;

  @Column({ name: 'archivo_tipo', type: 'varchar', length: 50, nullable: true })
  archivoTipo: string;

  @Column({ name: 'archivo_tamano_bytes', type: 'bigint', nullable: true })
  archivoTamanoBytes: number;

  // Estado
  @Column({ type: 'boolean', default: false })
  verificado: boolean;

  @Column({ name: 'verificado_por', type: 'uuid', nullable: true })
  verificadoPor: string;

  @Column({ name: 'verificado_fecha', type: 'timestamptz', nullable: true })
  verificadoFecha: Date;

  // Activo
  @Column({ type: 'boolean', default: true })
  activo: boolean;

  // Auditoría
  @CreateDateColumn({ name: 'created_at', type: 'timestamptz' })
  createdAt: Date;

  @Column({ name: 'created_by_id', type: 'uuid' })
  createdById: string;

  @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
  updatedAt: Date;
}
