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

/**
 * Estado HOS (Hours of Service)
 * NOM-087-SCT-2-2017
 */
export enum EstadoHos {
  DRIVING = 'DRIVING',       // Conduciendo
  ON_DUTY = 'ON_DUTY',       // En servicio (no conduciendo)
  SLEEPER = 'SLEEPER',       // En litera
  OFF_DUTY = 'OFF_DUTY',     // Fuera de servicio
}

@Entity({ schema: 'compliance', name: 'hos_logs' })
@Index('idx_hos_operador', ['operadorId'])
@Index('idx_hos_fecha', ['tenantId', 'fecha'])
@Index('idx_hos_viaje', ['viajeId'])
export class HosLog {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Operador y viaje
  @Column({ name: 'operador_id', type: 'uuid' })
  operadorId: string;

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

  // Log
  @Column({ type: 'date' })
  fecha: Date;

  @Column({ name: 'hora_inicio', type: 'time' })
  horaInicio: string;

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

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

  // Estado
  @Column({ type: 'enum', enum: EstadoHos })
  estado: EstadoHos;

  // Ubicación
  @Column({ type: 'decimal', precision: 10, scale: 7, nullable: true })
  latitud: number | null;

  @Column({ type: 'decimal', precision: 10, scale: 7, nullable: true })
  longitud: number | null;

  @Column({ name: 'ubicacion_descripcion', type: 'varchar', length: 200, nullable: true })
  ubicacionDescripcion: string | null;

  // Odómetro
  @Column({ name: 'odometro_inicio', type: 'int', nullable: true })
  odometroInicio: number | null;

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

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

  // Certificado
  @Column({ name: 'certificado_por_operador', type: 'boolean', default: false })
  certificadoPorOperador: boolean;

  @Column({ name: 'certificado_fecha', type: 'timestamptz', nullable: true })
  certificadoFecha: Date | null;

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

  // Helpers
  get duracionHoras(): number {
    return (this.duracionMinutos || 0) / 60;
  }

  get kmRecorridos(): number | null {
    if (this.odometroInicio && this.odometroFin) {
      return this.odometroFin - this.odometroInicio;
    }
    return null;
  }

  get esConduccion(): boolean {
    return this.estado === EstadoHos.DRIVING;
  }

  get esDescanso(): boolean {
    return this.estado === EstadoHos.OFF_DUTY || this.estado === EstadoHos.SLEEPER;
  }
}
