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

export enum TipoVendedorCobrador {
  VENDEDOR = 'vendedor',
  COBRADOR = 'cobrador',
  AMBOS = 'ambos',
}

/**
 * Cómo se contabiliza la comisión de esta persona. Ver
 * `contabilidad/services/regimen-comision.ts`: sin declarar se asienta sin IVA,
 * que es como funcionó siempre.
 */
export enum RegimenComision {
  /** Es empleado: la comisión es remuneración, sin IVA ni comprobante. */
  EMPLEADO = 'EMPLEADO',
  /** Factura su servicio y el porcentaje calculado ya incluye el IVA. */
  EXTERNO_IVA_INCLUIDO = 'EXTERNO_IVA_INCLUIDO',
  /** Factura su servicio y el IVA se suma sobre el porcentaje calculado. */
  EXTERNO_IVA_ADICIONAL = 'EXTERNO_IVA_ADICIONAL',
}

export class CreateVendedorCobradorDto {
  @ApiProperty({ description: 'Tipo: vendedor, cobrador o ambos', enum: TipoVendedorCobrador })
  @IsEnum(TipoVendedorCobrador)
  tipo: TipoVendedorCobrador;

  @ApiProperty({ description: 'Nombre del vendedor/cobrador' })
  @IsString()
  nombre: string;

  @ApiPropertyOptional({ description: 'Apellido del vendedor/cobrador' })
  @IsOptional()
  @IsString()
  apellido?: string;

  @ApiPropertyOptional({ description: 'Código interno' })
  @IsOptional()
  @IsString()
  codigo?: string;

  @ApiPropertyOptional({ description: 'Documento de identidad' })
  @IsOptional()
  @IsString()
  documento?: string;

  @ApiPropertyOptional({ description: 'Teléfono de contacto' })
  @IsOptional()
  @IsString()
  telefono?: string;

  @ApiPropertyOptional({ description: 'Email de contacto' })
  @IsOptional()
  @IsString()
  email?: string;

  @ApiPropertyOptional({ description: 'Dirección' })
  @IsOptional()
  @IsString()
  direccion?: string;

  @ApiPropertyOptional({ description: 'ID del usuario asociado' })
  @IsOptional()
  @IsUUID()
  usuario_id?: string;

  @ApiPropertyOptional({ description: 'ID de la zona de cobranza' })
  @IsOptional()
  @IsUUID()
  zona_id?: string;

  @ApiPropertyOptional({ description: 'Porcentaje de comisión general (0-100)' })
  @IsOptional()
  @IsNumber()
  comision_porcentaje?: number;

  @ApiPropertyOptional({ description: 'Comisión fija por operación' })
  @IsOptional()
  @IsNumber()
  comision_fija?: number;

  @ApiPropertyOptional({ description: 'Porcentaje de comisión por ventas (0-100)' })
  @IsOptional()
  @IsNumber()
  comision_venta?: number;

  @ApiPropertyOptional({ description: 'Porcentaje de comisión por cobranza (0-100)' })
  @IsOptional()
  @IsNumber()
  comision_cobranza?: number;

  @ApiPropertyOptional({ description: 'Meta mensual de ventas/cobranzas' })
  @IsOptional()
  @IsNumber()
  meta_mensual?: number;

  @ApiPropertyOptional({ description: 'Estado activo/inactivo', default: true })
  @IsOptional()
  @IsBoolean()
  active?: boolean;

  @ApiPropertyOptional({
    description: 'Cómo se contabiliza su comisión. Sin definir: sin IVA, como un empleado.',
    enum: RegimenComision,
  })
  @IsOptional()
  @IsEnum(RegimenComision)
  regimen_comision?: RegimenComision;

  @ApiPropertyOptional({ description: 'Empleado RRHH vinculado (para llevar sus comisiones a la nómina)' })
  @IsOptional()
  @IsUUID()
  empleado_id?: string;
}
