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

@Entity({ schema: 'billing', name: 'fuel_surcharge' })
@Index('idx_fuel_surcharge_fecha', ['tenantId', 'fechaInicio', 'fechaFin'])
export class FuelSurcharge {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

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

  // Precios de referencia
  @Column({ name: 'precio_diesel_referencia', type: 'decimal', precision: 10, scale: 4, nullable: true })
  precioDieselReferencia: number | null;

  @Column({ name: 'precio_diesel_actual', type: 'decimal', precision: 10, scale: 4, nullable: true })
  precioDieselActual: number | null;

  // Surcharge
  @Column({ name: 'porcentaje_surcharge', type: 'decimal', precision: 5, scale: 2 })
  porcentajeSurcharge: number;

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

  // Helpers
  get vigente(): boolean {
    const hoy = new Date();
    const inicio = new Date(this.fechaInicio);
    const fin = new Date(this.fechaFin);
    return this.activo && hoy >= inicio && hoy <= fin;
  }

  get variacionPrecio(): number | null {
    if (!this.precioDieselReferencia || !this.precioDieselActual) return null;
    return ((this.precioDieselActual - this.precioDieselReferencia) / this.precioDieselReferencia) * 100;
  }

  calcularRecargo(montoBase: number): number {
    return montoBase * (this.porcentajeSurcharge / 100);
  }

  get descripcionPeriodo(): string {
    const inicio = new Date(this.fechaInicio).toLocaleDateString('es-MX');
    const fin = new Date(this.fechaFin).toLocaleDateString('es-MX');
    return `${inicio} - ${fin}`;
  }
}
