import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  UpdateDateColumn,
  Index,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { Unidad } from './unidad.entity';

/**
 * Tipo de Licencia
 */
export enum TipoLicencia {
  A = 'A',       // Motociclista
  B = 'B',       // Automovilista particular
  C = 'C',       // Chofer particular
  D = 'D',       // Chofer público pasajeros
  E = 'E',       // Chofer público carga
  F = 'F',       // Federal (SCT)
}

/**
 * Estado del Operador
 */
export enum EstadoOperador {
  ACTIVO = 'ACTIVO',
  DISPONIBLE = 'DISPONIBLE',
  EN_VIAJE = 'EN_VIAJE',
  EN_RUTA = 'EN_RUTA',
  DESCANSO = 'DESCANSO',
  VACACIONES = 'VACACIONES',
  INCAPACIDAD = 'INCAPACIDAD',
  SUSPENDIDO = 'SUSPENDIDO',
  BAJA = 'BAJA',
}

@Entity({ schema: 'fleet', name: 'operadores' })
@Index('idx_operador_tenant', ['tenantId'])
@Index('idx_operador_estado', ['tenantId', 'estado'])
export class Operador {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Sucursal
  @Column({ name: 'sucursal_id', type: 'uuid', nullable: true })
  sucursalId: string;

  // Identificación
  @Column({ name: 'numero_empleado', type: 'varchar', length: 20 })
  numeroEmpleado: string;

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

  @Column({ name: 'apellido_paterno', type: 'varchar', length: 100 })
  apellidoPaterno: string;

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

  // Documentos de identidad
  @Column({ type: 'varchar', length: 18, nullable: true })
  curp: string;

  @Column({ type: 'varchar', length: 13, nullable: true })
  rfc: string;

  @Column({ type: 'varchar', length: 15, nullable: true })
  nss: string;

  // Contacto
  @Column({ type: 'varchar', length: 30, nullable: true })
  telefono: string;

  @Column({ name: 'telefono_emergencia', type: 'varchar', length: 30, nullable: true })
  telefonoEmergencia: string;

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

  // Dirección
  @Column({ type: 'text', nullable: true })
  direccion: string;

  @Column({ name: 'codigo_postal', type: 'varchar', length: 10, nullable: true })
  codigoPostal: string;

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

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

  // Datos de nacimiento
  @Column({ name: 'fecha_nacimiento', type: 'date', nullable: true })
  fechaNacimiento: Date;

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

  @Column({ type: 'varchar', length: 50, default: 'Mexicana' })
  nacionalidad: string;

  // Licencia de conducir
  @Column({ name: 'tipo_licencia', type: 'enum', enum: TipoLicencia, nullable: true })
  tipoLicencia: TipoLicencia;

  @Column({ name: 'numero_licencia', type: 'varchar', length: 30, nullable: true })
  numeroLicencia: string;

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

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

  // Certificaciones
  @Column({ name: 'certificado_fisico_vigencia', type: 'date', nullable: true })
  certificadoFisicoVigencia: Date;

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

  @Column({ name: 'capacitacion_materiales_peligrosos', type: 'boolean', default: false })
  capacitacionMaterialesPeligrosos: boolean;

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

  // Estado
  @Column({ type: 'enum', enum: EstadoOperador, default: EstadoOperador.ACTIVO })
  estado: EstadoOperador;

  // Unidad asignada
  @Column({ name: 'unidad_asignada_id', type: 'uuid', nullable: true })
  unidadAsignadaId: string;

  @ManyToOne(() => Unidad)
  @JoinColumn({ name: 'unidad_asignada_id' })
  unidadAsignada: Unidad;

  // Métricas de desempeño
  @Column({ type: 'decimal', precision: 3, scale: 2, default: 5.00 })
  calificacion: number;

  @Column({ name: 'total_viajes', type: 'int', default: 0 })
  totalViajes: number;

  @Column({ name: 'total_km', type: 'int', default: 0 })
  totalKm: number;

  @Column({ type: 'int', default: 0 })
  incidentes: number;

  // Datos bancarios
  @Column({ type: 'varchar', length: 100, nullable: true })
  banco: string;

  @Column({ name: 'cuenta_bancaria', type: 'varchar', length: 30, nullable: true })
  cuentaBancaria: string;

  @Column({ type: 'varchar', length: 18, nullable: true })
  clabe: string;

  // Salario
  @Column({ name: 'salario_base', type: 'decimal', precision: 12, scale: 2, nullable: true })
  salarioBase: number;

  @Column({ name: 'tipo_pago', type: 'varchar', length: 20, nullable: true })
  tipoPago: string;

  // Fechas
  @Column({ name: 'fecha_ingreso', type: 'date', nullable: true })
  fechaIngreso: Date;

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

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

  // 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;

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

  // Helper para nombre completo
  get nombreCompleto(): string {
    return `${this.nombre} ${this.apellidoPaterno}${this.apellidoMaterno ? ' ' + this.apellidoMaterno : ''}`;
  }
}
