import { ApiProperty, ApiPropertyOptional, PartialType, OmitType } from '@nestjs/swagger';
import {
  IsEnum,
  IsNotEmpty,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
} from 'class-validator';

export enum TipoCuenta {
  BANCO_CC = 'BANCO_CC',
  BANCO_CA = 'BANCO_CA',
  CAJA_CHICA = 'CAJA_CHICA',
  FONDO_FIJO = 'FONDO_FIJO',
  BILLETERA = 'BILLETERA',
  MONEDA_EXT = 'MONEDA_EXT',
}

export class CreateTesCuentaDto {
  @ApiProperty({ example: 'Cuenta corriente BCP' })
  @IsString()
  @IsNotEmpty()
  nombre: string;

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

  @ApiProperty({ example: 'PYG' })
  @IsString()
  @IsNotEmpty()
  moneda: string;

  @ApiProperty({
    example: 0,
    description:
      'Saldo inicial de la cuenta. Puede ser negativo en cuentas corrientes con sobregiro autorizado.',
  })
  @IsNumber()
  saldo_inicial: number;

  @ApiPropertyOptional({ description: 'ID de cuenta contable vinculada' })
  @IsOptional()
  @IsUUID()
  cuenta_contable_id?: string;

  @ApiPropertyOptional({ description: 'ID del banco' })
  @IsOptional()
  @IsUUID()
  banco_id?: string;

  @ApiPropertyOptional({ example: '1234567890' })
  @IsOptional()
  @IsString()
  numero_cuenta?: string;

  @ApiPropertyOptional({ example: 'AR123456789' })
  @IsOptional()
  @IsString()
  cbu_iban?: string;

  @ApiPropertyOptional({ example: 'Juan Perez' })
  @IsOptional()
  @IsString()
  titular?: string;

  @ApiPropertyOptional({
    example: 100000,
    description:
      'Umbral de alerta. Cuando el saldo cae por debajo de este valor se notifica. Puede ser negativo para alertar al entrar al sobregiro autorizado.',
  })
  @IsOptional()
  @IsNumber()
  saldo_minimo_alerta?: number;
}

export class UpdateTesCuentaDto extends PartialType(OmitType(CreateTesCuentaDto, [] as const)) {}
