import { ApiPropertyOptional } from '@nestjs/swagger';
import { IsBoolean, IsIn, IsOptional, IsString, IsUUID, MaxLength } from 'class-validator';
import { CreatePersonaDto } from 'src/personas/dto/create-persona.dto';

/**
 * Tipos de entidad reconocidos.
 * Ver docs/plan-acreedores-proveedores-exterior.md — decisión #1.
 */
export const TIPOS_ENTIDAD_PROVEEDOR = [
  'PROVEEDOR_LOCAL',
  'PROVEEDOR_EXTERIOR',
  'ACREEDOR_VARIO',
] as const;
export type TipoEntidadProveedor = (typeof TIPOS_ENTIDAD_PROVEEDOR)[number];

export class CreateProveedorDto extends CreatePersonaDto {
  @ApiPropertyOptional({ description: 'Ciudad asociada al proveedor en su tabla propia' })
  @IsOptional()
  @IsUUID()
  declare ciudad_id?: string;

  @ApiPropertyOptional({ description: 'Observaciones internas del proveedor' })
  @IsOptional()
  @IsString()
  @MaxLength(1000)
  observaciones?: string;

  @ApiPropertyOptional({ description: 'Timbrado del proveedor (se precarga al facturar una compra)' })
  @IsOptional()
  @IsString()
  @MaxLength(8)
  timbrado?: string;

  @ApiPropertyOptional({ description: 'Fecha de vencimiento del timbrado (YYYY-MM-DD)' })
  @IsOptional()
  @IsString()
  fecha_vencimiento_timbrado?: string;

  // ─── FASE 1 — Acreedores y proveedores del exterior ────────────────────
  @ApiPropertyOptional({
    description:
      'Tipo de entidad. PROVEEDOR_LOCAL (default) | PROVEEDOR_EXTERIOR | ACREEDOR_VARIO. ' +
      'Determina qué cuenta contable pasivo se acredita al facturar/pagar.',
    enum: TIPOS_ENTIDAD_PROVEEDOR,
  })
  @IsOptional()
  @IsIn(TIPOS_ENTIDAD_PROVEEDOR as unknown as string[])
  tipo_entidad?: TipoEntidadProveedor;

  @ApiPropertyOptional({
    description:
      'Override opcional de la cuenta contable pasivo del tercero. ' +
      'Si se define, tiene prioridad sobre el concepto en cont_mapeo_cuentas.',
  })
  @IsOptional()
  @IsUUID()
  cuenta_contable_id?: string;

  @ApiPropertyOptional({ description: 'Código ISO del país (PRY, USA, BRA…)' })
  @IsOptional()
  @IsString()
  @MaxLength(3)
  pais?: string;

  @ApiPropertyOptional({ description: 'Código SWIFT del banco (proveedor del exterior)' })
  @IsOptional()
  @IsString()
  @MaxLength(20)
  swift?: string;

  @ApiPropertyOptional({ description: 'Banco corresponsal (proveedor del exterior)' })
  @IsOptional()
  @IsString()
  @MaxLength(200)
  banco_corresponsal?: string;

  @ApiPropertyOptional({
    description:
      'Marca legacy de proveedor del exterior. Se sincroniza automáticamente con tipo_entidad ' +
      '(PROVEEDOR_EXTERIOR ⇔ true) — se mantiene por compatibilidad con importaciones.',
  })
  @IsOptional()
  @IsBoolean()
  es_extranjero?: boolean;
}
