import {
  Entity,
  PrimaryGeneratedColumn,
  Column,
  Index,
  ManyToOne,
  JoinColumn,
} from 'typeorm';
import { CartaPorte } from './carta-porte.entity';

@Entity({ schema: 'compliance', name: 'mercancias_carta_porte' })
@Index('idx_mercancia_carta', ['cartaPorteId'])
export class MercanciaCartaPorte {
  @PrimaryGeneratedColumn('uuid')
  id: string;

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

  @Column({ name: 'carta_porte_id', type: 'uuid' })
  cartaPorteId: string;

  @ManyToOne(() => CartaPorte, (cp) => cp.mercancias)
  @JoinColumn({ name: 'carta_porte_id' })
  cartaPorte: CartaPorte;

  // Bienes transportados
  @Column({ name: 'bienes_transp', type: 'varchar', length: 10 })
  bienesTransp: string;

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

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

  @Column({ name: 'clave_unidad', type: 'varchar', length: 10 })
  claveUnidad: string;

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

  // Dimensiones
  @Column({ name: 'peso_en_kg', type: 'decimal', precision: 14, scale: 3 })
  pesoEnKg: number;

  @Column({ name: 'largo_cm', type: 'decimal', precision: 10, scale: 2, nullable: true })
  largoCm: number | null;

  @Column({ name: 'ancho_cm', type: 'decimal', precision: 10, scale: 2, nullable: true })
  anchoCm: number | null;

  @Column({ name: 'alto_cm', type: 'decimal', precision: 10, scale: 2, nullable: true })
  altoCm: number | null;

  // Valor
  @Column({ name: 'valor_mercancia', type: 'decimal', precision: 15, scale: 2, nullable: true })
  valorMercancia: number | null;

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

  // Material peligroso
  @Column({ name: 'material_peligroso', type: 'boolean', default: false })
  materialPeligroso: boolean;

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

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

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

  // Fracción arancelaria (comercio exterior)
  @Column({ name: 'fraccion_arancelaria', type: 'varchar', length: 10, nullable: true })
  fraccionArancelaria: string | null;

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

  // Pedimentos
  @Column({ type: 'text', array: true, nullable: true })
  pedimentos: string[] | null;

  // Guías
  @Column({ type: 'text', array: true, nullable: true })
  guias: string[] | null;

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

  // Helpers
  get esPeligroso(): boolean {
    return this.materialPeligroso;
  }

  get volumenM3(): number | null {
    if (!this.largoCm || !this.anchoCm || !this.altoCm) return null;
    return (this.largoCm * this.anchoCm * this.altoCm) / 1000000; // cm³ to m³
  }

  get tieneComercioExterior(): boolean {
    return !!this.fraccionArancelaria || !!this.uuidComercioExt;
  }
}
