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

/**
 * Tipo de Recargo
 */
export enum TipoRecargo {
  FUEL_SURCHARGE = 'FUEL_SURCHARGE',
  DETENTION = 'DETENTION',
  MANIOBRAS = 'MANIOBRAS',
  CUSTODIA = 'CUSTODIA',
  ESCOLTA = 'ESCOLTA',
  PERNOCTA = 'PERNOCTA',
  ESTADIAS = 'ESTADIAS',
  FALSO_FLETE = 'FALSO_FLETE',
  SEGURO_ADICIONAL = 'SEGURO_ADICIONAL',
  OTRO = 'OTRO',
}

@Entity({ schema: 'billing', name: 'recargos_catalogo' })
@Index('idx_recargo_tenant', ['tenantId'])
@Index('idx_recargo_codigo', ['tenantId', 'codigo'], { unique: true })
export class RecargoCatalogo {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  // Identificación
  @Column({ type: 'varchar', length: 50 })
  codigo: string;

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

  @Column({ type: 'enum', enum: TipoRecargo })
  tipo: TipoRecargo;

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

  // Monto
  @Column({ name: 'es_porcentaje', type: 'boolean', default: false })
  esPorcentaje: boolean;

  @Column({ type: 'decimal', precision: 15, scale: 4 })
  monto: number;

  @Column({ type: 'varchar', length: 3, default: 'MXN' })
  moneda: string;

  // Aplicación
  @Column({ name: 'aplica_automatico', type: 'boolean', default: false })
  aplicaAutomatico: boolean;

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

  // 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
  calcularRecargo(base: number): number {
    if (this.esPorcentaje) {
      return base * (this.monto / 100);
    }
    return this.monto;
  }

  get descripcionMonto(): string {
    if (this.esPorcentaje) {
      return `${this.monto}%`;
    }
    return `$${this.monto.toFixed(2)} ${this.moneda}`;
  }
}
