/**
 * UpdateBankAccountDto - DTO para actualizar cuentas bancarias
 *
 * @module Finance
 */

import {
  IsString,
  IsOptional,
  IsUUID,
  IsEnum,
  IsNumber,
  IsBoolean,
  MaxLength,
  MinLength,
  Min,
  IsObject,
} from 'class-validator';
import { BankAccountType, BankAccountStatus } from '../entities/bank-account.entity';

/**
 * DTO para actualizar una cuenta bancaria.
 * accountNumber y clabe no se pueden cambiar.
 */
export class UpdateBankAccountDto {
  @IsOptional()
  @IsString()
  @MinLength(3, { message: 'El nombre debe tener al menos 3 caracteres' })
  @MaxLength(100, { message: 'El nombre no puede exceder 100 caracteres' })
  name?: string;

  @IsOptional()
  @IsEnum(['checking', 'savings', 'investment', 'credit_line', 'other'], {
    message: 'Tipo de cuenta invalido',
  })
  accountType?: BankAccountType;

  @IsOptional()
  @IsEnum(['active', 'inactive', 'blocked', 'closed'], {
    message: 'Estado invalido',
  })
  status?: BankAccountStatus;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  bankName?: string;

  @IsOptional()
  @IsString()
  @MaxLength(10)
  bankCode?: string;

  @IsOptional()
  @IsString()
  @MaxLength(100)
  branchName?: string;

  @IsOptional()
  @IsString()
  @MaxLength(20)
  branchCode?: string;

  @IsOptional()
  @IsNumber({}, { message: 'El limite de credito debe ser un numero' })
  @Min(0, { message: 'El limite de credito no puede ser negativo' })
  creditLimit?: number;

  @IsOptional()
  @IsNumber({}, { message: 'El saldo minimo debe ser un numero' })
  @Min(0, { message: 'El saldo minimo no puede ser negativo' })
  minimumBalance?: number;

  @IsOptional()
  @IsUUID('4', { message: 'projectId debe ser un UUID valido' })
  projectId?: string;

  @IsOptional()
  @IsUUID('4', { message: 'ledgerAccountId debe ser un UUID valido' })
  ledgerAccountId?: string;

  @IsOptional()
  @IsString()
  @MaxLength(255)
  bankContactName?: string;

  @IsOptional()
  @IsString()
  @MaxLength(50)
  bankContactPhone?: string;

  @IsOptional()
  @IsString()
  @MaxLength(255)
  bankContactEmail?: string;

  @IsOptional()
  @IsBoolean()
  isDefault?: boolean;

  @IsOptional()
  @IsBoolean()
  allowsPayments?: boolean;

  @IsOptional()
  @IsBoolean()
  allowsCollections?: boolean;

  @IsOptional()
  @IsString()
  notes?: string;

  @IsOptional()
  @IsObject()
  metadata?: Record<string, any>;
}
