import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  Index,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { FacturaTransporte } from './factura-transporte.entity';
import { RecargoCatalogo } from './recargo-catalogo.entity';

@Entity({ schema: 'billing', name: 'lineas_factura' })
@Index('idx_linea_factura', ['facturaId'])
export class LineaFactura {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  @Column({ name: 'factura_id', type: 'uuid' })
  facturaId: string;

  @ManyToOne(() => FacturaTransporte, (factura) => factura.lineas)
  @JoinColumn({ name: 'factura_id' })
  factura: FacturaTransporte;

  // Secuencia
  @Column({ type: 'int' })
  linea: number;

  // Concepto
  @Column({ type: 'text' })
  descripcion: string;

  @Column({ name: 'clave_producto_sat', type: 'varchar', length: 10, nullable: true })
  claveProductoSat: string | null;

  @Column({ name: 'unidad_sat', type: 'varchar', length: 10, nullable: true })
  unidadSat: string | null;

  // Cantidades
  @Column({ type: 'decimal', precision: 12, scale: 4 })
  cantidad: number;

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

  @Column({ type: 'decimal', precision: 15, scale: 2, default: 0 })
  descuento: number;

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

  // Impuestos
  @Column({ name: 'iva_tasa', type: 'decimal', precision: 5, scale: 2, default: 16 })
  ivaTasa: number;

  @Column({ name: 'iva_monto', type: 'decimal', precision: 15, scale: 2, nullable: true })
  ivaMonto: number | null;

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

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

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

  @ManyToOne(() => RecargoCatalogo)
  @JoinColumn({ name: 'recargo_id' })
  recargo: RecargoCatalogo | null;

  // Helpers
  get importeNeto(): number {
    return this.importe - this.descuento;
  }

  get importeConIva(): number {
    return this.importeNeto + (this.ivaMonto || 0);
  }

  calcularImporte(): number {
    return this.cantidad * this.precioUnitario;
  }

  calcularIva(): number {
    return this.importeNeto * (this.ivaTasa / 100);
  }
}
