/**
 * CreateAccountingEntryDto - DTO para crear polizas contables
 *
 * @module Finance
 * @rf RF-MAE014-002
 */

import {
  IsString,
  IsNotEmpty,
  IsOptional,
  IsUUID,
  IsDateString,
  IsNumber,
  IsArray,
  ValidateNested,
  ArrayMinSize,
  MaxLength,
} from 'class-validator';
import { Type } from 'class-transformer';

/**
 * Linea de poliza contable
 */
export class AccountingEntryLineDto {
  /**
   * ID de la cuenta contable
   */
  @IsUUID('4', { message: 'accountId debe ser un UUID valido' })
  @IsNotEmpty()
  accountId: string;

  /**
   * Monto al debe
   * @default 0
   */
  @IsNumber({}, { message: 'El monto debe ser un numero' })
  debit: number;

  /**
   * Monto al haber
   * @default 0
   */
  @IsNumber({}, { message: 'El monto debe ser un numero' })
  credit: number;

  /**
   * Descripcion de la linea
   */
  @IsOptional()
  @IsString()
  description?: string;

  /**
   * Referencia (factura, cheque, etc.)
   */
  @IsOptional()
  @IsString()
  @MaxLength(100)
  reference?: string;
}

/**
 * DTO para crear una poliza contable
 */
export class CreateAccountingEntryDto {
  /**
   * Fecha de la poliza (YYYY-MM-DD)
   */
  @IsDateString({}, { message: 'Formato de fecha invalido' })
  @IsNotEmpty({ message: 'La fecha es requerida' })
  entryDate: string;

  /**
   * Tipo de poliza
   * @example 'ingreso'
   */
  @IsString()
  @IsNotEmpty({ message: 'El tipo es requerido' })
  @MaxLength(50)
  entryType: string;

  /**
   * Descripcion de la poliza
   * @example 'Pago de estimacion #15'
   */
  @IsString()
  @IsNotEmpty({ message: 'La descripcion es requerida' })
  description: string;

  /**
   * Referencia externa
   * @example 'EST-2026-015'
   */
  @IsOptional()
  @IsString()
  @MaxLength(100)
  reference?: string;

  /**
   * ID del proyecto relacionado
   */
  @IsOptional()
  @IsUUID('4', { message: 'projectId debe ser un UUID valido' })
  projectId?: string;

  /**
   * Lineas de la poliza (minimo 2)
   */
  @IsArray()
  @ValidateNested({ each: true })
  @ArrayMinSize(2, { message: 'La poliza debe tener al menos 2 lineas' })
  @Type(() => AccountingEntryLineDto)
  lines: AccountingEntryLineDto[];
}
