import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  CreateDateColumn,
  Index,
} from 'typeorm';
import { EstadoGasto } from './carga-combustible.entity';

/**
 * Tipo de Gasto de Viaje
 */
export enum TipoGasto {
  COMBUSTIBLE = 'COMBUSTIBLE',
  PEAJE = 'PEAJE',
  VIATICO = 'VIATICO',
  HOSPEDAJE = 'HOSPEDAJE',
  ALIMENTOS = 'ALIMENTOS',
  ESTACIONAMIENTO = 'ESTACIONAMIENTO',
  MULTA = 'MULTA',
  MANIOBRA = 'MANIOBRA',
  REPARACION_MENOR = 'REPARACION_MENOR',
  OTRO = 'OTRO',
}

@Entity({ schema: 'fuel', name: 'gastos_viaje' })
@Index('idx_gasto_viaje', ['viajeId'])
@Index('idx_gasto_operador', ['operadorId'])
@Index('idx_gasto_estado', ['tenantId', 'estado'])
export class GastoViaje {
  @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;

  // Gasto
  @Column({ name: 'tipo_gasto', type: 'enum', enum: TipoGasto })
  tipoGasto: TipoGasto;

  @Column({ type: 'varchar', length: 500 })
  descripcion: string;

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

  // Comprobante
  @Column({ name: 'tiene_factura', type: 'boolean', default: false })
  tieneFactura: boolean;

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

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

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

  // Ubicación
  @Column({ type: 'varchar', length: 200, nullable: true })
  lugar: string | null;

  @Column({ type: 'decimal', precision: 10, scale: 7, nullable: true })
  latitud: number | null;

  @Column({ type: 'decimal', precision: 10, scale: 7, nullable: true })
  longitud: number | null;

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

  // Estado
  @Column({ type: 'enum', enum: EstadoGasto, default: EstadoGasto.PENDIENTE })
  estado: EstadoGasto;

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

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

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

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

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

  // Helpers
  get esDeducible(): boolean {
    return this.tieneFactura;
  }

  get requiereAprobacion(): boolean {
    return this.estado === EstadoGasto.PENDIENTE;
  }
}
