import { ApiProperty, PartialType } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
    IsArray,
    IsBoolean,
    IsIn,
    IsNumber,
    IsOptional,
    IsString,
    ValidateNested,
} from 'class-validator';
import { CreateEmpresaDto } from './create-empresa.dto';
import { TimbradoEmpresaDto } from './create-timbrado.dto';

class ActividadEconomicaItem {
  @ApiProperty({ example: 1110 })
  @IsString()
  codactividad: string;

  @ApiProperty({ example: 'Actividad Economica' })
  @IsString()
  desc_actividad: string;

  @ApiProperty({ example: true })
  @IsBoolean()
  principal: boolean;
}

class ConfiguracionPreciosDto {
  @ApiProperty({ example: 'general', description: 'Tipo de lista principal' })
  @IsOptional()
  @IsString()
  @IsIn(['general', 'cliente', 'zona', 'canal'])
  tipo_lista_principal?: string;

  @ApiProperty({ example: 'PYG', description: 'Moneda principal' })
  @IsOptional()
  @IsString()
  moneda_principal?: string;

  @ApiProperty({ example: true, description: 'Permitir múltiples listas' })
  @IsOptional()
  @IsBoolean()
  permitir_multiples_listas?: boolean;

  @ApiProperty({
    example: false,
    description: 'Aplicar descuentos automáticos',
  })
  @IsOptional()
  @IsBoolean()
  aplicar_descuentos_automaticos?: boolean;

  @ApiProperty({ example: 'normal', description: 'Tipo de redondeo' })
  @IsOptional()
  @IsString()
  @IsIn(['normal', 'superior', 'inferior', 'ninguno'])
  redondeo_precios?: string;

  @ApiProperty({ example: 2, description: 'Decimales en precios' })
  @IsOptional()
  @IsNumber()
  decimales_precio?: number;

  @ApiProperty({
    example: true,
    description: 'Validar stock al mostrar precios',
  })
  @IsOptional()
  @IsBoolean()
  validar_stock_mostrar_precios?: boolean;

  @ApiProperty({
    example: false,
    description: 'Mostrar precios sin stock disponible',
  })
  @IsOptional()
  @IsBoolean()
  mostrar_precios_sin_stock?: boolean;
}
export class UpdateEmpresaDto extends PartialType(CreateEmpresaDto) {
  @ApiProperty({
    example: 'https://bucket.example.com/logos/empresa.png',
    required: false,
  })
  @IsOptional()
  @IsString()
  logo?: string;
  @ApiProperty({
    required: false,
    type: [ActividadEconomicaItem],
    example: [
      {
        codactividad: 1110,
        desc_actividad: 'Actividad Economica',
        principal: true,
      },
      {
        codactividad: 1121,
        desc_actividad: 'Actividad Economica',
        principal: false,
      },
    ],
  })
  @IsOptional()
  @IsArray()
  @ValidateNested({ each: true })
  @Type(() => ActividadEconomicaItem)
  actividad_economicas?: ActividadEconomicaItem[];

  @ApiProperty()
  @ValidateNested()
  @Type(() => TimbradoEmpresaDto)
  timbrado: TimbradoEmpresaDto;

  @ApiProperty({
    description: 'Configuración de precios de la empresa',
    type: ConfiguracionPreciosDto,
    required: false,
  })
  @IsOptional()
  @ValidateNested()
  @Type(() => ConfiguracionPreciosDto)
  configuracion_precios?: ConfiguracionPreciosDto;

  @IsOptional()
  @IsBoolean()
  orden_requiere_aprobacion?: boolean;

  @IsOptional()
  @IsNumber()
  orden_monto_aprobacion?: number;

  @ApiProperty({
    description:
      'Permite facturar un presupuesto ACEPTADO directamente, sin convertirlo antes en Orden de Venta.',
    required: false,
  })
  @IsOptional()
  @IsBoolean()
  presupuesto_facturar_sin_ov?: boolean;

  @ApiProperty({
    description: 'Texto libre opcional que sobreescribe la actividad económica mostrada en el KuDE (factura/NC). No afecta el XML enviado al SET.',
    required: false,
    example: 'Comercio al por menor de productos alimenticios',
  })
  @IsOptional()
  @IsString()
  actividad_economica_kude?: string;

  @ApiProperty({
    description:
      'Si false, la empresa opera en modo manual: los documentos (FC, NC) se aprueban localmente sin enviarse al middleware SIFEN, y la cancelación se aplica como reverso directo. Solo modificable por superadmin.',
    required: false,
    example: true,
  })
  @IsOptional()
  @IsBoolean()
  sifen_activo?: boolean;

  @ApiProperty({
    description: 'Obligación IVA activa. Define el flag IMPUTA AL IVA del export de Marangatu.',
    required: false,
    example: true,
  })
  @IsOptional()
  @IsBoolean()
  imputa_iva?: boolean;

  @ApiProperty({
    description: 'Obligación IRE activa. Define el flag IMPUTA AL IRE del export de Marangatu.',
    required: false,
    example: true,
  })
  @IsOptional()
  @IsBoolean()
  imputa_ire?: boolean;

  @ApiProperty({
    description: 'Obligación IRP-RSP activa. Define el flag IMPUTA AL IRP-RSP del export de Marangatu.',
    required: false,
    example: false,
  })
  @IsOptional()
  @IsBoolean()
  imputa_irp_rsp?: boolean;
}
