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

/**
 * Tipo de Figura de Transporte (catálogo SAT)
 */
export enum TipoFigura {
  OPERADOR = '01',       // Operador/Conductor
  PROPIETARIO = '02',    // Propietario de la mercancía
  ARRENDADOR = '03',     // Arrendador del vehículo
  NOTIFICADO = '04',     // Notificado
}

/**
 * Partes de Transporte
 */
export interface ParteTransporte {
  parteTransporte: string;
}

@Entity({ schema: 'compliance', name: 'figuras_transporte' })
@Index('idx_figura_carta', ['cartaPorteId'])
export class FiguraTransporte {
  @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.figuras)
  @JoinColumn({ name: 'carta_porte_id' })
  cartaPorte: CartaPorte;

  // Tipo de figura
  @Column({ name: 'tipo_figura', type: 'varchar', length: 10 })
  tipoFigura: string;

  // Datos
  @Column({ name: 'rfc_figura', type: 'varchar', length: 13, nullable: true })
  rfcFigura: string | null;

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

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

  // Domicilio (opcional)
  @Column({ type: 'varchar', length: 3, nullable: true })
  pais: string | null;

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

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

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

  // Partes transporte (solo para Propietario/Arrendador)
  @Column({ name: 'partes_transporte', type: 'jsonb', nullable: true })
  partesTransporte: ParteTransporte[] | null;

  // Helpers
  get esOperador(): boolean {
    return this.tipoFigura === TipoFigura.OPERADOR;
  }

  get esPropietario(): boolean {
    return this.tipoFigura === TipoFigura.PROPIETARIO;
  }

  get esArrendador(): boolean {
    return this.tipoFigura === TipoFigura.ARRENDADOR;
  }

  get tipoFiguraDescripcion(): string {
    switch (this.tipoFigura) {
      case TipoFigura.OPERADOR: return 'Operador';
      case TipoFigura.PROPIETARIO: return 'Propietario';
      case TipoFigura.ARRENDADOR: return 'Arrendador';
      case TipoFigura.NOTIFICADO: return 'Notificado';
      default: return 'Desconocido';
    }
  }
}
