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

/**
 * Estado del Anticipo
 */
export enum EstadoAnticipo {
  SOLICITADO = 'SOLICITADO',
  APROBADO = 'APROBADO',
  ENTREGADO = 'ENTREGADO',
  COMPROBANDO = 'COMPROBANDO',
  LIQUIDADO = 'LIQUIDADO',
  RECHAZADO = 'RECHAZADO',
}

@Entity({ schema: 'fuel', name: 'anticipos_viaticos' })
@Index('idx_anticipo_viaje', ['viajeId'])
@Index('idx_anticipo_operador', ['operadorId'])
@Index('idx_anticipo_estado', ['tenantId', 'estado'])
export class AnticipoViatico {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

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

  // Anticipo
  @Column({ name: 'monto_solicitado', type: 'decimal', precision: 12, scale: 2 })
  montoSolicitado: number;

  @Column({ name: 'monto_aprobado', type: 'decimal', precision: 12, scale: 2, nullable: true })
  montoAprobado: number | null;

  @Column({ name: 'monto_comprobado', type: 'decimal', precision: 12, scale: 2, default: 0 })
  montoComprobado: number;

  @Column({ name: 'monto_reintegro', type: 'decimal', precision: 12, scale: 2, default: 0 })
  montoReintegro: number;

  // Conceptos desglosados
  @Column({ name: 'combustible_estimado', type: 'decimal', precision: 12, scale: 2, nullable: true })
  combustibleEstimado: number | null;

  @Column({ name: 'peajes_estimado', type: 'decimal', precision: 12, scale: 2, nullable: true })
  peajesEstimado: number | null;

  @Column({ name: 'viaticos_estimado', type: 'decimal', precision: 12, scale: 2, nullable: true })
  viaticosEstimado: number | null;

  // Estado
  @Column({ type: 'varchar', length: 20, default: EstadoAnticipo.SOLICITADO })
  estado: string;

  // Fechas
  @Column({ name: 'fecha_solicitud', type: 'timestamptz', default: () => 'NOW()' })
  fechaSolicitud: Date;

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

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

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

  // Aprobaciones
  @Column({ name: 'aprobado_por', type: 'uuid', nullable: true })
  aprobadoPor: string | null;

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

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

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

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

  @Column({ name: 'created_by_id', type: 'uuid' })
  createdById: string;

  // Helpers
  get saldoPendiente(): number {
    const aprobado = this.montoAprobado || 0;
    return aprobado - this.montoComprobado;
  }

  get porcentajeComprobado(): number {
    const aprobado = this.montoAprobado || 0;
    return aprobado > 0 ? (this.montoComprobado / aprobado) * 100 : 0;
  }

  get requiereReintegro(): boolean {
    return this.montoReintegro > 0;
  }
}
