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

/**
 * Item del Checklist de Inspección
 */
export interface ChecklistItem {
  item: string;
  categoria: string;
  estado: 'OK' | 'DEFECTO_MENOR' | 'DEFECTO_CRITICO' | 'NO_APLICA';
  observacion?: string;
}

/**
 * Foto de Inspección
 */
export interface FotoInspeccion {
  url: string;
  descripcion?: string;
  categoria?: string;
}

@Entity({ schema: 'compliance', name: 'inspecciones_pre_viaje' })
@Index('idx_inspeccion_viaje', ['viajeId'])
@Index('idx_inspeccion_unidad', ['unidadId'])
@Index('idx_inspeccion_fecha', ['tenantId', 'fechaInspeccion'])
export class InspeccionPreViaje {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Viaje y unidad
  @Column({ name: 'viaje_id', type: 'uuid' })
  viajeId: string;

  @Column({ name: 'unidad_id', type: 'uuid' })
  unidadId: string;

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

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

  // Fecha
  @Column({ name: 'fecha_inspeccion', type: 'timestamptz' })
  fechaInspeccion: Date;

  // Resultado general
  @Column({ type: 'boolean', default: false })
  aprobada: boolean;

  // Items checklist
  @Column({ name: 'checklist_items', type: 'jsonb' })
  checklistItems: ChecklistItem[];

  // Defectos encontrados
  @Column({ name: 'defectos_encontrados', type: 'text', array: true, nullable: true })
  defectosEncontrados: string[] | null;

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

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

  // Firma
  @Column({ name: 'firma_operador', type: 'text', nullable: true })
  firmaOperador: string | null;

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

  // Evidencias
  @Column({ type: 'jsonb', nullable: true })
  fotos: FotoInspeccion[] | null;

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

  // Helpers
  get totalDefectos(): number {
    return this.defectosCriticos + this.defectosMenores;
  }

  get tieneDefectosCriticos(): boolean {
    return this.defectosCriticos > 0;
  }

  get puedeViajar(): boolean {
    return this.aprobada && this.defectosCriticos === 0;
  }

  get tieneFirma(): boolean {
    return !!this.firmaOperador;
  }

  get itemsConDefecto(): ChecklistItem[] {
    return this.checklistItems.filter(
      item => item.estado === 'DEFECTO_MENOR' || item.estado === 'DEFECTO_CRITICO'
    );
  }

  get porcentajeAprobacion(): number {
    const total = this.checklistItems.filter(i => i.estado !== 'NO_APLICA').length;
    const aprobados = this.checklistItems.filter(i => i.estado === 'OK').length;
    return total > 0 ? (aprobados / total) * 100 : 0;
  }
}
