import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import {
  IsBoolean,
  IsIn,
  IsNumber,
  IsOptional,
  IsString,
  IsUUID,
  Min,
} from 'class-validator';

export type TipoComprobanteIntereses = 'FACTURA' | 'NOTA_DEBITO' | 'NINGUNO';
export type ImputacionOrden = 'INTERES_PRIMERO' | 'CAPITAL_PRIMERO';
export type IvaModo = 'INCLUIDO' | 'POR_FUERA';

export class UpsertConfigInteresesDto {
  @ApiProperty({
    enum: ['FACTURA', 'NOTA_DEBITO', 'NINGUNO'],
    default: 'FACTURA',
    description:
      'NOTA_DEBITO queda reservado hasta que se implemente ND-e en el ERP',
  })
  @IsIn(['FACTURA', 'NOTA_DEBITO', 'NINGUNO'])
  tipo_comprobante: TipoComprobanteIntereses;

  @ApiProperty({ enum: [0, 5, 10], default: 10 })
  @IsIn([0, 5, 10])
  iva_porcentaje: number;

  @ApiProperty({
    enum: ['INCLUIDO', 'POR_FUERA'],
    default: 'INCLUIDO',
    description:
      'INCLUIDO: la tasa de mora ya contiene IVA (la factura desglosa por dentro). ' +
      'POR_FUERA: el IVA se suma sobre el monto cobrado al cliente. ' +
      'Decisión contractual según el pagaré firmado.',
  })
  @IsIn(['INCLUIDO', 'POR_FUERA'])
  iva_modo: IvaModo;

  @ApiPropertyOptional({
    description: 'Producto/servicio usado como ítem en la factura de intereses',
  })
  @IsOptional()
  @IsUUID()
  producto_servicio_id?: string | null;

  @ApiPropertyOptional({
    description:
      'Numeración (timbrado + punto de expedición) usada para emitir la factura de intereses. Obligatoria si tipo_comprobante=FACTURA. La sucursal queda implícita en la numeración.',
  })
  @IsOptional()
  @IsUUID()
  numeracion_id?: string | null;

  @ApiProperty({ default: true })
  @IsBoolean()
  pausar_en_demanda: boolean;

  @ApiProperty({ default: true })
  @IsBoolean()
  pausar_en_incobrable: boolean;

  @ApiProperty({
    enum: ['INTERES_PRIMERO', 'CAPITAL_PRIMERO'],
    default: 'INTERES_PRIMERO',
  })
  @IsIn(['INTERES_PRIMERO', 'CAPITAL_PRIMERO'])
  imputacion_orden: ImputacionOrden;
}

export class PreviewInteresQueryDto {
  @ApiProperty({ description: 'UUID de la cuota a evaluar' })
  @IsUUID()
  factura_cuota_id: string;

  @ApiPropertyOptional({
    description:
      'Monto a exonerar (si se piensa aplicar autorización). Default: 0',
  })
  @IsOptional()
  @IsNumber()
  @Min(0)
  monto_exonerado?: number;
}

export class RegistrarInteresCobradoDto {
  @IsUUID()
  factura_cuota_id: string;

  @IsUUID()
  recibo_cobro_id: string;

  @IsNumber()
  @Min(0)
  monto_exonerado: number;

  @IsOptional()
  @IsUUID()
  autorizacion_descuento_id?: string | null;

  @IsOptional()
  @IsString()
  observacion?: string;
}
