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

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

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

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

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

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

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

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

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

  @ApiProperty({ required: true })
  @IsNotEmpty({ message: 'لطفا تاریخ موردنظر جهت سرویس دهی را تعیین نمایید' })
  date: string;

  @ApiProperty({ required: true })
  @IsNotEmpty({ message: 'لطفا زمان موردنظر جهت سرویس دهی را تعیین نمایید' })
  time: string;

  @ApiProperty({ required: true })
  @IsNotEmpty({ message: 'لطفا شماره کیلومتر خودرو را وارد نمایید' })
  kilometers: number;

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

  @ApiProperty({ required: true })
  @IsOptional()
  maxKilometersDay: number;

  @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;
}
