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

export enum TesChequeTipo {
  RECIBIDO = 'RECIBIDO',
  EMITIDO = 'EMITIDO',
}

export enum TesChequeEstado {
  EN_CARTERA = 'EN_CARTERA',
  DIFERIDO = 'DIFERIDO',
  DEPOSITADO = 'DEPOSITADO',
  DEBITADO = 'DEBITADO',
  RECHAZADO = 'RECHAZADO',
  DEVUELTO = 'DEVUELTO',
  ANULADO = 'ANULADO',
}

export class CreateTesChequeDto {
  @ApiProperty({ enum: TesChequeTipo })
  @IsEnum(TesChequeTipo)
  tipo: TesChequeTipo;

  @ApiProperty({ example: '001-12345678' })
  @IsString()
  @IsNotEmpty()
  numero_cheque: string;

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

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

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

  @ApiProperty()
  @IsNumber()
  @IsPositive()
  monto: number;

  @ApiPropertyOptional({ default: 'PYG' })
  @IsOptional()
  @IsString()
  moneda?: string;

  @ApiProperty()
  @IsDateString()
  fecha_emision: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  fecha_vencimiento?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsUUID()
  cuenta_id?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  referencia?: string;
  @ApiPropertyOptional({
    description: 'Cargar igual aunque ya exista un cheque con el mismo número y banco.',
  })
  @IsOptional()
  @IsBoolean()
  confirmar_duplicado?: boolean;

}

export class AcreditarChequeDto {
  @ApiProperty({ description: 'Cuenta de tesorería donde se deposita/debita' })
  @IsUUID()
  cuenta_id: string;

  @ApiPropertyOptional({
    description:
      'Fecha real en que el banco acreditó/debitó el cheque. Si no se envía, se usa la fecha de hoy. No puede ser futura ni anterior a la emisión del cheque.',
  })
  @IsOptional()
  @IsDateString()
  fecha_movimiento?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  referencia?: string;
}

export class RechazarChequeDto {
  @ApiProperty()
  @IsString()
  @IsNotEmpty()
  motivo: string;
}

export class UpdateTesChequeDto {
  @ApiPropertyOptional()
  @IsOptional()
  @IsString()
  numero_cheque?: string;

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

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

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

  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  fecha_emision?: string;

  @ApiPropertyOptional()
  @IsOptional()
  @IsDateString()
  fecha_vencimiento?: string | null;

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

  @ApiProperty({ description: 'Motivo de la corrección (obligatorio para auditoría)' })
  @IsString()
  @IsNotEmpty()
  motivo: string;
}

export class FilterTesChequeDto {
  @IsOptional()
  @IsEnum(TesChequeTipo)
  tipo?: TesChequeTipo;

  @IsOptional()
  @IsEnum(TesChequeEstado)
  estado?: TesChequeEstado;

  @IsOptional()
  @IsUUID()
  cuenta_id?: string;

  @IsOptional()
  proximos_vencer?: string; // 'true' = vence en los próximos 7 días
}
