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


export class OrdenPagoProveedorDetalleDto {
  @ApiProperty({ description: 'ID de la cuenta por pagar a cancelar' })
  @IsUUID()
  @IsNotEmpty()
  cuenta_pagar_id: string;

  @ApiProperty({ description: 'ID del medio de pago' })
  @IsUUID()
  @IsNotEmpty()
  medio_pago_id: string;

  @ApiProperty({ description: 'Monto aplicado a la cuenta' })
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0.01)
  monto: number;

  @ApiPropertyOptional({ description: 'Monto en moneda original' })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  monto_moneda?: number;

  @ApiPropertyOptional({ description: 'Moneda del pago en este detalle (opcional, usa moneda cabecera por defecto)' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

  @ApiPropertyOptional({ description: 'Cotización aplicada para el monto en moneda' })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 6 })
  @Min(0)
  cotizacion?: number;

  @ApiPropertyOptional({ description: 'Referencia del pago en esta cuenta' })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  referencia?: string;

  @ApiPropertyOptional({ description: 'Observaciones del detalle' })
  @IsOptional()
  @IsString()
  observaciones?: string;

  // Datos específicos por medio de pago

  @ApiPropertyOptional({ description: 'Número de cheque (cuando el medio es cheque)' })
  @IsOptional()
  @IsString()
  @MaxLength(30)
  numero_cheque?: string;

  @ApiPropertyOptional({ description: 'Banco emisor del cheque' })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  banco_emisor?: string;

  @ApiPropertyOptional({ description: 'Fecha de emisión del cheque (ISO)' })
  @IsOptional()
  @IsDateString()
  fecha_emision_cheque?: string;

  @ApiPropertyOptional({ description: 'Fecha de vencimiento del cheque (ISO)' })
  @IsOptional()
  @IsDateString()
  fecha_vencimiento_cheque?: string;

  @ApiPropertyOptional({ description: 'Titular del cheque' })
  @IsOptional()
  @IsString()
  @MaxLength(150)
  titular_cheque?: string;

  @ApiPropertyOptional({ description: 'Cuenta bancaria de origen (para transferencias y depósitos)' })
  @IsOptional()
  @IsUUID()
  cuenta_bancaria_id?: string;

  @ApiPropertyOptional({ description: 'Número de operación o referencia bancaria (para transferencias)' })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  numero_operacion?: string;
}

export class CreateOrdenPagoProveedorDto {
  @ApiProperty({ description: 'Sucursal para validar numeración y reglas de caja' })
  @IsUUID()
  @IsNotEmpty()
  sucursal_id: string;

  @ApiProperty({ description: 'Proveedor al que se paga' })
  @IsUUID()
  @IsNotEmpty()
  proveedor_id: string;

  @ApiPropertyOptional({ description: 'Sesión de caja (obligatoria si la sucursal lo exige)' })
  @IsOptional()
  @IsUUID()
  sesion_caja_id?: string;

  @ApiPropertyOptional({ description: 'Moneda de la orden de pago' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

  @ApiPropertyOptional({ description: 'Cotización aplicada a la orden' })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 6 })
  @Min(0)
  cotizacion?: number;

  @ApiPropertyOptional({ description: 'Fecha de pago de la orden' })
  @IsOptional()
  @IsDateString()
  fecha_pago?: string;

  @ApiPropertyOptional({ description: 'Referencia general de la orden' })
  @IsOptional()
  @IsString()
  @MaxLength(100)
  referencia?: string;

  @ApiPropertyOptional({ description: 'Observaciones generales' })
  @IsOptional()
  @IsString()
  observaciones?: string;

  @ApiProperty({ type: [OrdenPagoProveedorDetalleDto] })
  @IsArray()
  @ArrayMinSize(1)
  @ValidateNested({ each: true })
  @Type(() => OrdenPagoProveedorDetalleDto)
  detalles: OrdenPagoProveedorDetalleDto[];
}

export class AnularOrdenPagoProveedorDto {
  @ApiPropertyOptional({ description: 'Motivo de anulación' })
  @IsOptional()
  @IsString()
  @MaxLength(500)
  motivo?: string;
}
