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

export enum FormaPagoMobile {
  EFECTIVO = 'efectivo',
  CHEQUE = 'cheque',
  TRANSFERENCIA = 'transferencia',
}

export class ImputacionMobileDto {
  @ApiProperty({ description: 'Cuota de factura a imputar' })
  @IsUUID()
  factura_cuota_id: string;

  @ApiProperty({ example: 150000, description: 'Monto a imputar a esta cuota' })
  @IsNumber()
  monto: number;
}

export class ChequeMobileDto {
  @ApiProperty({ description: 'Banco emisor (UUID)' })
  @IsUUID()
  banco_id: string;

  @ApiProperty({ example: '00012345', description: 'Número de cheque (8 caracteres alfanuméricos)' })
  @IsString()
  @IsNotEmpty()
  numero: string;

  @ApiPropertyOptional({ example: 'Bancop', description: 'Nombre del banco emisor (4-20 chars)' })
  @IsOptional()
  @IsString()
  banco_emisor?: string;

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

  @ApiPropertyOptional({ example: '2026-05-29' })
  @IsOptional()
  @IsString()
  fecha_emision?: string;

  @ApiPropertyOptional({ example: '2026-06-29' })
  @IsOptional()
  @IsString()
  fecha_vencimiento?: string;

  @ApiPropertyOptional({ example: false })
  @IsOptional()
  @IsBoolean()
  diferido?: boolean;
}

export class TransferenciaMobileDto {
  @ApiProperty({ description: 'Banco destino (UUID)' })
  @IsUUID()
  banco_id: string;

  @ApiProperty({ example: 'OP-123456' })
  @IsString()
  @IsNotEmpty()
  numero_operacion: string;

  @ApiPropertyOptional({ example: '2026-05-29' })
  @IsOptional()
  @IsString()
  fecha?: string;
}

export class GeoMobileDto {
  @ApiProperty({ example: -25.2865 })
  @IsNumber()
  lat: number;

  @ApiProperty({ example: -57.347 })
  @IsNumber()
  lng: number;

  @ApiPropertyOptional({ example: 12.5 })
  @IsOptional()
  @IsNumber()
  accuracy?: number;
}

export class CrearCobroMobileDto {
  @ApiProperty({ description: 'Cliente al que se le cobra' })
  @IsUUID()
  cliente_id: string;

  @ApiProperty({ description: 'Sucursal del cobro (define numeración del recibo)' })
  @IsUUID()
  sucursal_id: string;

  @ApiPropertyOptional({ description: 'Sesión de caja abierta del cobrador (se autoresuelve si se omite)' })
  @IsOptional()
  @IsUUID()
  sesion_caja_id?: string;

  @ApiPropertyOptional({ description: 'Moneda del cobro (default: principal de la empresa)' })
  @IsOptional()
  @IsUUID()
  moneda_id?: string;

  @ApiPropertyOptional({ example: 7500, description: 'Cotización aplicada si la moneda difiere de la factura' })
  @IsOptional()
  @IsNumber()
  cotizacion?: number;

  @ApiProperty({ type: [ImputacionMobileDto], description: 'Cuotas a cubrir (multi-factura)' })
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ImputacionMobileDto)
  imputaciones: ImputacionMobileDto[];

  @ApiProperty({ enum: FormaPagoMobile })
  @IsEnum(FormaPagoMobile)
  forma_pago: FormaPagoMobile;

  @ApiPropertyOptional({ type: ChequeMobileDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => ChequeMobileDto)
  cheque?: ChequeMobileDto;

  @ApiPropertyOptional({ type: TransferenciaMobileDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => TransferenciaMobileDto)
  transferencia?: TransferenciaMobileDto;

  @ApiPropertyOptional({ type: GeoMobileDto })
  @IsOptional()
  @ValidateNested()
  @Type(() => GeoMobileDto)
  geo?: GeoMobileDto;

  @ApiPropertyOptional({ example: 'Cobro en ruta' })
  @IsOptional()
  @IsString()
  observacion?: string;
}
