import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
  IsArray,
  IsDateString,
  IsEnum,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Min,
  ValidateNested,
} from 'class-validator';
import { Type } from 'class-transformer';

export enum TipoMovimiento {
  INGRESO = 'INGRESO',
  EGRESO = 'EGRESO',
}

/**
 * Qué cubre un pago imputado a una importación. Define contra qué cuenta va el
 * asiento; ver docs/plan-importaciones-fase2-contable.md.
 */
export enum TipoPagoImportacion {
  /** Anticipo o cancelación al proveedor del exterior → Importaciones en curso. */
  PROVEEDOR = 'PROVEEDOR',
  /** Anticipo al despachante → Anticipos de despacho, se aplica después. */
  DESPACHO = 'DESPACHO',
}

export class TesMovimientoDetalleDto {
  @ApiProperty({ description: 'ID de la categoría' })
  @IsUUID()
  categoria_id: string;

  @ApiProperty({ example: 50000 })
  @IsNumber()
  @Min(0)
  monto: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  descripcion?: string;

  @ApiPropertyOptional({ description: 'Cuenta contable de destino para esta línea' })
  @IsOptional()
  @IsUUID()
  cuenta_contable_id?: string;
}

export class CreateTesMovimientoDto {
  @ApiProperty({ description: 'ID de la cuenta de tesorería' })
  @IsUUID()
  cuenta_id: string;

  @ApiProperty({ enum: TipoMovimiento })
  @IsEnum(TipoMovimiento)
  tipo: TipoMovimiento;

  @ApiProperty({ example: '2026-04-20' })
  @IsDateString()
  fecha: string;

  @ApiProperty({ example: 150000 })
  @IsNumber()
  @Min(0)
  monto: number;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  descripcion?: string;

  @ApiPropertyOptional({ description: 'Número de referencia / comprobante' })
  @IsOptional()
  @IsString()
  referencia?: string;

  @ApiPropertyOptional({
    description:
      'Embarque de importación al que se imputa este pago. Con él, la contrapartida ' +
      'del asiento sale del concepto de mapeo del tipo de pago y no de la categoría.',
  })
  @IsOptional()
  @IsUUID()
  embarque_id?: string;

  @ApiPropertyOptional({
    enum: TipoPagoImportacion,
    description: 'Obligatorio si se informa embarque_id. Un solo pago de cada tipo por importación.',
  })
  @IsOptional()
  @IsEnum(TipoPagoImportacion)
  tipo_pago_importacion?: TipoPagoImportacion;

  @ApiProperty({ type: [TesMovimientoDetalleDto] })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => TesMovimientoDetalleDto)
  categorias: TesMovimientoDetalleDto[];
}

export class ConfirmarTesMovimientoDto {
  // DTO vacío — la acción se identifica solo por el permiso y el endpoint
}

export class AnularTesMovimientoDto {
  @ApiProperty({ example: 'Error de registro' })
  @IsString()
  @IsNotEmpty()
  motivo_anulacion: string;
}
