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

/**
 * Tipo de Anomalía en Rendimiento
 */
export enum TipoAnomaliaRendimiento {
  BAJO_RENDIMIENTO = 'BAJO_RENDIMIENTO',
  CONSUMO_EXCESIVO = 'CONSUMO_EXCESIVO',
  POSIBLE_ROBO = 'POSIBLE_ROBO',
  FALLA_MECANICA = 'FALLA_MECANICA',
  RUTA_INEFICIENTE = 'RUTA_INEFICIENTE',
}

@Entity({ schema: 'fuel', name: 'control_rendimiento' })
@Index('idx_rendimiento_unidad', ['unidadId'])
@Index('idx_rendimiento_fecha', ['tenantId', 'fechaInicio'])
export class ControlRendimiento {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

  // Período
  @Column({ name: 'fecha_inicio', type: 'date' })
  fechaInicio: Date;

  @Column({ name: 'fecha_fin', type: 'date' })
  fechaFin: Date;

  // Métricas
  @Column({ name: 'km_recorridos', type: 'int' })
  kmRecorridos: number;

  @Column({ name: 'litros_consumidos', type: 'decimal', precision: 12, scale: 3 })
  litrosConsumidos: number;

  @Column({ name: 'rendimiento_real', type: 'decimal', precision: 6, scale: 2 })
  rendimientoReal: number;

  @Column({ name: 'rendimiento_esperado', type: 'decimal', precision: 6, scale: 2, nullable: true })
  rendimientoEsperado: number | null;

  @Column({ name: 'variacion_porcentaje', type: 'decimal', precision: 5, scale: 2, nullable: true })
  variacionPorcentaje: number | null;

  // Costos
  @Column({ name: 'costo_total_combustible', type: 'decimal', precision: 15, scale: 2, nullable: true })
  costoTotalCombustible: number | null;

  @Column({ name: 'costo_por_km', type: 'decimal', precision: 8, scale: 4, nullable: true })
  costoPorKm: number | null;

  // Alertas
  @Column({ name: 'tiene_anomalia', type: 'boolean', default: false })
  tieneAnomalia: boolean;

  @Column({ name: 'tipo_anomalia', type: 'varchar', length: 50, nullable: true })
  tipoAnomalia: string | null;

  @Column({ name: 'descripcion_anomalia', type: 'text', nullable: true })
  descripcionAnomalia: string | null;

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

  // Helpers
  get eficiencia(): string {
    if (!this.rendimientoEsperado) return 'SIN_REFERENCIA';
    const ratio = this.rendimientoReal / this.rendimientoEsperado;
    if (ratio >= 0.95) return 'OPTIMO';
    if (ratio >= 0.85) return 'ACEPTABLE';
    if (ratio >= 0.75) return 'BAJO';
    return 'CRITICO';
  }

  get diasPeriodo(): number {
    const inicio = new Date(this.fechaInicio);
    const fin = new Date(this.fechaFin);
    return Math.ceil((fin.getTime() - inicio.getTime()) / (1000 * 60 * 60 * 24)) + 1;
  }
}
