import { ApiProperty } from '@nestjs/swagger';
import { Type } from 'class-transformer';
import {
  IsIn,
  IsNotEmpty,
  IsOptional,
  ValidateIf,
  ValidateNested,
} from 'class-validator';
import {
  OrderPaymentMethod,
  OrderPaymentStatus,
  OrderShippingType,
  OrderStatus,
} from '../entities/order.entity';

export class ProductItem {
  @ApiProperty()
  @IsNotEmpty({ message: 'لطفا محصول موردنظر را انتخاب نمایید' })
  productId: string;

  @ApiProperty()
  @IsNotEmpty({ message: 'لطفا تعداد اقلام محصولات موردنظر را وارد نمایید' })
  quantity: number;
}

export class AddOrderDto {
  @ApiProperty({ type: [ProductItem] })
  @IsNotEmpty({ message: 'لطفا اقلام محصولات موردنظر را وارد نمایید' })
  @ValidateNested({ each: true })
  @Type(() => ProductItem)
  productItems: ProductItem[];

  @ApiProperty({ required: true })
  @IsNotEmpty({ message: 'مشتری موردنظر، انتخاب نشده است' })
  userId: string;

  @ApiProperty({ required: true })
  @ValidateIf((p) => +p.shippingType !== OrderShippingType.inPerson)
  @IsNotEmpty({ message: 'لطفا آدرس  را وارد نمایید' })
  addressId: number;

  @ApiProperty({ required: true })
  @IsNotEmpty({ message: 'لطفا نحوه ارسال  را وارد نمایید' })
  shippingType: number;

  @ApiProperty({ required: false })
  @IsOptional()
  adminDiscountPercent: number;

  @ApiProperty({ required: false })
  @IsOptional()
  couponCode: string;

  @ApiProperty({ required: true })
  @IsNotEmpty({
    message:
      ' لطفا تعیین نمایید برای سفارش موردنظر نیاز به فاکتور دارید یا خیر',
  })
  isRequiredFactor: boolean;

  @ApiProperty({
    required: true,
    enum: OrderPaymentMethod,
    example: OrderPaymentMethod.online,
  })
  @IsNotEmpty({ message: 'لطفا نوع پرداخت (آنلاین / حضوری) را انتخاب نمایید' })
  @IsIn(Object.values(OrderPaymentMethod))
  paymentMethod: OrderPaymentMethod;

  @ApiProperty({ required: true, enum: OrderStatus })
  @IsNotEmpty({ message: 'لطفا وضعیت سفارش موردنظر را تعیین نمایید' })
  @IsIn(Object.values(OrderStatus))
  orderStatusCode: OrderStatus;

  @ApiProperty({ required: true, enum: OrderPaymentStatus })
  @IsNotEmpty({ message: 'لطفا وضعیت پرداخت سفارش موردنظر را تعیین نمایید' })
  @IsIn(Object.values(OrderPaymentStatus))
  paymentStatusCode: OrderPaymentStatus;

  @ApiProperty({ required: false })
  @IsOptional()
  customerOrderComment?: string;

  @ApiProperty({ required: false })
  @IsOptional()
  createdAt?: string;
}
