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

/**
 * Tipo de Carga de Combustible
 */
export enum TipoCargaCombustible {
  VALE = 'VALE',
  TARJETA = 'TARJETA',
  EFECTIVO = 'EFECTIVO',
  FACTURA_DIRECTA = 'FACTURA_DIRECTA',
}

/**
 * Tipo de Combustible
 */
export enum TipoCombustible {
  DIESEL = 'DIESEL',
  GASOLINA_MAGNA = 'GASOLINA_MAGNA',
  GASOLINA_PREMIUM = 'GASOLINA_PREMIUM',
  GAS_LP = 'GAS_LP',
  GAS_NATURAL = 'GAS_NATURAL',
}

/**
 * Estado del Gasto
 */
export enum EstadoGasto {
  PENDIENTE = 'PENDIENTE',
  APROBADO = 'APROBADO',
  RECHAZADO = 'RECHAZADO',
  PAGADO = 'PAGADO',
}

@Entity({ schema: 'fuel', name: 'cargas_combustible' })
@Index('idx_carga_unidad', ['unidadId'])
@Index('idx_carga_viaje', ['viajeId'])
@Index('idx_carga_fecha', ['tenantId', 'fechaCarga'])
export class CargaCombustible {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

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

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

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

  // Carga
  @Column({ name: 'tipo_carga', type: 'enum', enum: TipoCargaCombustible })
  tipoCarga: TipoCargaCombustible;

  @Column({ name: 'tipo_combustible', type: 'varchar', length: 20 })
  tipoCombustible: string;

  @Column({ type: 'decimal', precision: 10, scale: 3 })
  litros: number;

  @Column({ name: 'precio_litro', type: 'decimal', precision: 10, scale: 4 })
  precioLitro: number;

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

  // Odómetro
  @Column({ name: 'odometro_carga', type: 'int', nullable: true })
  odometroCarga: number | null;

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

  // Ubicación
  @Column({ name: 'estacion_id', type: 'uuid', nullable: true })
  estacionId: string | null;

  @Column({ name: 'estacion_nombre', type: 'varchar', length: 200, nullable: true })
  estacionNombre: string | null;

  @Column({ name: 'estacion_direccion', type: 'text', nullable: true })
  estacionDireccion: 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;

  // Vale/Factura
  @Column({ name: 'numero_vale', type: 'varchar', length: 50, nullable: true })
  numeroVale: string | null;

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

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

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

  // Aprobación
  @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;

  // Evidencia
  @Column({ name: 'foto_ticket_url', type: 'text', nullable: true })
  fotoTicketUrl: string | null;

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

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

  // Helpers
  get costoPorLitro(): number {
    return this.litros > 0 ? this.total / this.litros : 0;
  }
}
