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

export class RequisicionCabeceraDto {
  @ApiProperty({ enum: ['compra', 'gasto'] })
  @IsString()
  @IsIn(['compra', 'gasto'])
  origen_tipo: 'compra' | 'gasto';

  @ApiPropertyOptional({ description: 'Sucursal de operación' })
  @IsOptional()
  @IsUUID()
  sucursal_id?: string;

  @ApiPropertyOptional({ description: 'Fecha de requisición (YYYY-MM-DD)' })
  @IsOptional()
  @IsDateString()
  fecha_requisicion?: string;

  @ApiPropertyOptional({ description: 'Descripción general' })
  @IsOptional()
  @IsString()
  @MaxLength(1500)
  descripcion?: string;
}

export class RequisicionItemDto {
  @ApiPropertyOptional({ description: 'Centro de costo (opcional)' })
  @IsOptional()
  @IsUUID()
  centro_costo_id?: string;

  @ApiPropertyOptional({ description: 'Producto para requisiciones de compra' })
  @IsOptional()
  @IsUUID()
  producto_id?: string;

  @ApiPropertyOptional({ description: 'Tipo de gasto para requisiciones de gasto' })
  @IsOptional()
  @IsUUID()
  tipo_gasto_id?: string;

  @ApiProperty({ description: 'Descripción del ítem' })
  @IsString()
  @IsNotEmpty()
  @MaxLength(500)
  descripcion: string;

  @ApiProperty({ description: 'Cantidad solicitada' })
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0.0001)
  cantidad_solicitada: number;

  @ApiPropertyOptional({
    description:
      'Precio unitario estimado (opcional). Si no se envía, backend usa costo referencial del producto cuando exista.',
    default: 0,
  })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 4 })
  @Min(0)
  precio_unitario?: number;

  @ApiPropertyOptional({ description: 'IVA % (0, 5, 10). Si no se envía, se toma del producto o default 10.', default: 10 })
  @IsOptional()
  @IsNumber({ maxDecimalPlaces: 2 })
  @Min(0)
  porcentaje_iva?: number;
}

export class CreateRequisicionDto {
  @ApiProperty({ type: RequisicionCabeceraDto })
  @ValidateNested()
  @Type(() => RequisicionCabeceraDto)
  cabecera: RequisicionCabeceraDto;

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