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

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

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

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

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

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

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

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

  @ApiProperty({
    required: false,
    enum: OrderClientType,
    example: OrderClientType.site,
  })
  @IsOptional()
  @IsIn(Object.values(OrderClientType))
  clientType?: OrderClientType;

  /**
   * Requirements for time delivery
   */
  @ApiProperty({ required: true })
  @ValidateIf(
    (p) => +p.shippingType === OrderShippingType.inPerson || p.isService,
  )
  @IsNotEmpty({ message: 'لطفا تاریخ سرویس/تحویل را مشخص نمایید' })
  requestJalaliDate: string;

  @ApiProperty({ required: true })
  @ValidateIf(
    (p) => +p.shippingType === OrderShippingType.inPerson || p.isService,
  )
  @IsNotEmpty({ message: 'لطفا ساعت سرویس/تحویل را تعیین نمایید' })
  requestTime: string;

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

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

  /**
   * Requirements for bank
   */
  @ApiProperty({ required: true })
  @IsNotEmpty({
    message: 'لطفا تعیین نمایید از کیف پول خود میخواهید استفاده نمایید یا خیر',
  })
  useWallet: boolean;

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

  @ApiProperty({
    required: false,
    enum: PaymentGateway,
    example: PaymentGateway.meli,
  })
  @IsOptional()
  @IsIn(Object.values(PaymentGateway))
  paymentGateway: PaymentGateway;

  /**
   * Requirements for server
   */
  @ApiProperty({ required: true })
  @ValidateIf((p) => p.isService)
  @IsNotEmpty({ message: 'لطفا شماره کیلومتر خودرو را وارد نمایید' })
  kilometerNumber: number;

  @ApiProperty({ required: true })
  @ValidateIf((p) => p.isService)
  @IsNotEmpty({ message: 'لطفا حداقل کیلومتر روزانه خودرو را وارد نمایید' })
  minKilometersDay: number;

  @ApiProperty({ required: false })
  @ValidateIf((p) => p.isService)
  @IsOptional()
  maxKilometersDay?: number;

  @ApiProperty({ required: true })
  @ValidateIf((p) => p.isService)
  @IsNotEmpty({ message: 'خودروی خود را انتخاب نمایید' })
  carId: number;
}
