import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
  Query,
  Req,
  Res,
  UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
import { User } from 'src/utils/decorators/user.decorator';
import { successfulResult } from '../../utils';
import { Filter } from '../../utils/decorators/filter.decorator';
import { Limit } from '../../utils/decorators/limit.decorator';
import { Page } from '../../utils/decorators/page.decorator';
import { Sort } from '../../utils/decorators/sort.decorator';
import { JwtAuthGuard } from '../auth/jwt/jwt.guard';
import { Permissions } from '../auth/permission/permissions.decorator';
import { PermissionsGuard } from '../auth/permission/permissions.guard';
import { PermissionsType } from '../role/entities/permission.entity';
import { RoleIds, UserEntity } from '../user/entities/user.entity';
import { UserService } from '../user/user.service';
import { AddOrderDto } from './dto/add-order.dto';
import { AddProductDto } from './dto/add-product.dto';
import { CalculatePriceForClientDto } from './dto/calculate-price-for-client.dto';
import { requestShippingDto } from './dto/request-shipping.dto';
import { UpdateOrderItemDto } from './dto/update-order-item.dto';
import { UpdateOrderServiceManDto } from './dto/update-order-service-man.dto';
import { UpdateOrderStatusDto } from './dto/update-order-status.dto';
import { OrderPaymentStatus, OrderStatus } from './entities/order.entity';
import { OrderService } from './order.service';
import { GovernmentOilSaleOrderDto } from './dto/government-oil-sale-order.dto';
import { Access } from 'src/utils/decorators/access.decorator';
import { AddOrderByUserDto } from './dto/add-order-by-user.dto';
import { PayOrderByUserDto } from './dto/pay-order-by-user.dto';
import { SshafDto } from './dto/sshaf.dto';
import { SamtDto } from './dto/samt.dto';

@ApiTags('Order')
@Controller('orders')
export class OrderController {
  constructor(
    private orderService: OrderService,
    private userService: UserService,
  ) {}

  /**
   * -------------------------------------------------------
   * GET /orders/government-oil/remain-days/1/me
   */
  @Get('/government-oil/remain-days/:carId/me')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  async getRemainDaysToNewGovernmentOil(
    @User() user: UserEntity,
    @Param('carId') carId: number,
  ) {
    const data = await this.orderService.getRemainDaysToNewGovernmentOil(
      user,
      carId,
    );
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * GET /orders/service/remain-days/1/me
   */
  @Get('/service/remain-days/:carId/me')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  async getRemainDaysToNewService(
    @User() user: UserEntity,
    @Param('carId') carId: number,
  ) {
    const data = await this.orderService.getRemainDaysToNewService(user, carId);
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   */
  @Post('sshaf/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ORDER)
  async sendSshafList(@Body() dto: SshafDto) {
    await this.orderService.sendSshafList(dto);
    return successfulResult([
      'بررسی ظرفیت روغن و اختصاص آن با موفقیت انجام شد',
    ]);
  }

  /**
   * -------------------------------------------------------
   */
  @Post('samt/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ORDER)
  async sendSamtItem(@Body() dto: SamtDto) {
    await this.orderService.sendSamtItem(dto);
    return successfulResult([
      'بررسی ظرفیت روغن و اختصاص آن با موفقیت انجام شد',
    ]);
  }

  /**
   * -------------------------------------------------------
   */
  @Post('government-oil-allocation/:id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_PRODUCT_ORDER)
  async getAndSetGovernmentOilAllocationByAdmin(@Param('id') orderId: number) {
    await this.orderService.getAndSetGovernmentOilAllocationByAdmin(orderId);
    return successfulResult([
      'بررسی ظرفیت روغن و اختصاص آن با موفقیت انجام شد',
    ]);
  }

  /**
   * -------------------------------------------------------
   */
  @Get('government-oil-allocation/:carId')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  async getGovernmentOilAllocation(
    @User() user: UserEntity,
    @Param('carId') carId: number,
  ) {
    const data = await this.orderService.getGovernmentOilAllocation(
      user,
      carId,
    );
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   */
  @Post('sale-government-oil')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  async governmentOilSaleOrder(
    @User() user: UserEntity,
    @Body() dto: GovernmentOilSaleOrderDto,
  ) {
    const data = await this.orderService.governmentOilSaleOrder(user, dto);
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * calculate-price
   */
  @Post('calculate-price')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  async calculatePrice(
    @User('id') userId: string,
    @Body() dto: CalculatePriceForClientDto,
  ) {
    const data = await this.orderService.calculatePriceForClient(dto, userId);
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * request-shipping
   */
  @Post('request-shipping')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.REQUEST_SHIPPING)
  async requestShippingPeyk(
    @Body() dto: requestShippingDto,
    @User('id') operatorUserId: string,
  ) {
    const result = await this.orderService.requestShippingPeyk(
      dto,
      operatorUserId,
    );
    return successfulResult(
      [`درخواست ${result.shippingMessage} با موفقیت ارسال شد`],
      result,
    );
  }

  /**
   * -------------------------------------------------------
   * shipping-detail
   */
  @Get('shipping-detail/:id')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_DETAIL_SHIPPING)
  async shippingDetail(@Param('id') orderId) {
    const result = await this.orderService.shippingDetail(orderId);
    return successfulResult(
      ['درخواست مشاهده جزئیات با موفقیت انجام شد'],
      result,
    );
  }

  /**
   * -------------------------------------------------------
   */
  @Get('alopeyk-requests')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_DETAIL_SHIPPING)
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  async getAlopeykRequests(@Query('page') page, @Query('limit') limit) {
    const list = await this.orderService.getAlopeykRequests(page, limit);
    return successfulResult([], list);
  }

  /**
   * -------------------------------------------------------
   * shipping-cancel
   */
  @Delete('shipping-cancel/:id')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.CANCEL_SHIPPING)
  async cancelShipping(
    @Param('id') orderId,
    @User('id') operatorUserId: string,
  ) {
    await this.orderService.cancelShipping(orderId, operatorUserId);
    return successfulResult(['حذف درخواست الوپیک با موفقیت انجام شد']);
  }

  /**
   * -------------------------------------------------------
   * add product
   */
  @Post('add-product/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.ADD_PRODUCT_ORDER)
  async addProduct(@Body() dto: AddProductDto) {
    const data = await this.orderService.addProduct(dto);
    return successfulResult(
      ['آیتم موردنظر به این سفارش، باموفقیت اضافه شد'],
      data,
    );
  }

  /**
   * -------------------------------------------------------
   *  update order item ( plus or minus product)
   */
  @Put('update-item/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_PRODUCT_ORDER)
  async updateOrderItem(@Body() dto: UpdateOrderItemDto) {
    await this.orderService.updateOrderItem(dto);
    return successfulResult([
      'تعداد آیتم موردنظر، در این سفارش، باموفقیت تغییر یافت',
    ]);
  }

  /**
   * -------------------------------------------------------
   *  delete order item
   */
  @Delete('order-item/:id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.DELETE_PRODUCT_ORDER)
  async deleteOrderItem(@Param('id') orderItemId: number) {
    await this.orderService.deleteOrderItem(orderItemId);
    return successfulResult(['آیتم موردنظر از این سفارش، باموفقیت حذف شد']);
  }

  /**
   * -------------------------------------------------------
   * show chart of orders
   * GET /orders/statistic/chart/admin
   */
  @Get('statistic/chart/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(
    PermissionsType.GET_ALL_ORDER_STATISTICS,
    PermissionsType.GET_ORDER_STATISTICS,
  )
  @ApiQuery({ name: 'from', required: true })
  @ApiQuery({ name: 'to', required: true })
  @ApiQuery({ name: 'type', required: true, enum: ['daily', 'monthly'] })
  @ApiQuery({ name: 'section', required: false, enum: ['service', 'shop'] })
  async statisticChart(
    @Query('from') from,
    @Query('to') to,
    @Query('type') type,
    @Query('section') section,
    @User('id') userId: number,
    @Access(PermissionsType.GET_ALL_ORDER_STATISTICS) accessAll: boolean,
  ) {
    const data = await this.orderService.statisticChart(
      from,
      to,
      type,
      section,
      userId,
      accessAll,
    );
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * Show orders
   * GET /orders/statistic/admin
   */
  @Get('statistic/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ALL_ORDER_STATISTICS)
  async statistic() {
    const data = await this.orderService.statistic();
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * get service man list
   */
  @Get('/service-man/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.ASSIGN_SERVICE_TO_SERVICEMAN)
  async getActiveServiceMans() {
    const data = await this.userService.getFull({ roleId: RoleIds.ServiceMan });
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * GET /orders/statistic/serviceMan
   */
  @Get('statistic/service-man')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ORDER_STATISTICS_BY_SERVICEMAN)
  async statisticServiceMan(@User('id') serviceManId) {
    const data = await this.orderService.statisticServiceMan(serviceManId);
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * Admin
   * Get report all
   */
  @Get('/report/all/admin')
  @ApiBearerAuth()
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiQuery({ name: 'sort', required: false, description: 'e.g. id:desc' })
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  @ApiQuery({ name: 'generate_excel', required: false })
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ALL_ORDER_STATISTICS)
  async getReportAll(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([['date', 'createdAt', 'DATE']])
    filters,
    @Query('generate_excel') generateExcel: string,
    @Res() res,
  ) {
    const result = await this.orderService.getReportAll(
      page,
      limit,
      sorts,
      filters,
      generateExcel === '1',
    );

    if (generateExcel === '1') {
      return res.set({ 'Content-Type': 'text/xlsx' }).download(`${result}`);
    }

    return res.json({
      success: true,
      messages: [],
      data: result,
    });
  }

  /**
   * -------------------------------------------------------
   * Admin
   * Get report wages
   */
  @Get('/report/wages/admin')
  @ApiBearerAuth()
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiQuery({ name: 'sort', required: false, description: 'e.g. id:desc' })
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  @ApiQuery({ name: 'generate_excel', required: false })
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ALL_ORDER_STATISTICS)
  async getReportWages(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([['date', 'createdAt', 'DATE']])
    filters,
    @Query('generate_excel') generateExcel: string,
    @Res() res,
  ) {
    const result = await this.orderService.getReportWages(
      page,
      limit,
      sorts,
      filters,
      generateExcel === '1',
    );

    if (generateExcel === '1') {
      return res.set({ 'Content-Type': 'text/xlsx' }).download(`${result}`);
    }

    return res.json({
      success: true,
      messages: [],
      data: result,
    });
  }

  /**
   * -------------------------------------------------------
   * Admin
   * Get report shipping
   */
  @Get('/report/shipping/admin')
  @ApiBearerAuth()
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiQuery({ name: 'sort', required: false, description: 'e.g. id:desc' })
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  @ApiQuery({ name: 'generate_excel', required: false })
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ALL_ORDER_STATISTICS)
  async getReportShipping(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([['date', 'createdAt', 'DATE']])
    filters,
    @Query('generate_excel') generateExcel: string,
    @Res() res,
  ) {
    const result = await this.orderService.getReportShipping(
      page,
      limit,
      sorts,
      filters,
      generateExcel === '1',
    );

    if (generateExcel === '1') {
      return res.set({ 'Content-Type': 'text/xlsx' }).download(`${result}`);
    }

    return res.json({
      success: true,
      messages: [],
      data: result,
    });
  }

  /**
   * -------------------------------------------------------
   * Admin
   * Get report unsettled paid
   */
  @Get('/report/unsettled-paid/admin')
  @ApiBearerAuth()
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiQuery({ name: 'sort', required: false, description: 'e.g. id:desc' })
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  @ApiQuery({ name: 'generate_excel', required: false })
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ALL_ORDER_STATISTICS)
  async getReportUnsettledPaid(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([['date', 'createdAt', 'DATE']])
    filters,
    @Query('generate_excel') generateExcel: string,
    @Res() res,
  ) {
    const result = await this.orderService.getReportUnsettledPaid(
      page,
      limit,
      sorts,
      filters,
      generateExcel === '1',
    );

    if (generateExcel === '1') {
      return res.set({ 'Content-Type': 'text/xlsx' }).download(`${result}`);
    }

    return res.json({
      success: true,
      messages: [],
      data: result,
    });
  }

  /**
   * -------------------------------------------------------
   * Admin
   * Get report shopping
   */
  @Get('report/shopping/admin')
  @ApiBearerAuth()
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiQuery({ name: 'category_id', required: false })
  @ApiQuery({ name: 'sort', required: false, description: 'e.g. id:desc' })
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  @ApiQuery({ name: 'generate_excel', required: false })
  @ApiQuery({ name: 'generate_excel_sshaf', required: false })
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ALL_ORDER_STATISTICS)
  async getReportShopping(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([
      ['date', 'createdAt', 'DATE'],
      ['category_id', 'category.id'],
    ])
    filters,
    @Query('generate_excel') generateExcel: string,
    @Query('generate_excel_sshaf') generateExcelSshaf: string,
    @Res() res,
  ) {
    const result = await this.orderService.getReportShopping(
      page,
      limit,
      sorts,
      filters,
      generateExcel === '1',
      generateExcelSshaf === '1',
    );

    if (generateExcel === '1' || generateExcelSshaf === '1') {
      return res.set({ 'Content-Type': 'text/xlsx' }).download(`${result}`);
    }

    return res.json({
      success: true,
      messages: [],
      data: result,
    });
  }

  /**
   * -------------------------------------------------------
   */
  // @Get(':id/pdf/admin')
  // @ApiBearerAuth()
  // @UseGuards(JwtAuthGuard, PermissionsGuard)
  // @Permissions(PermissionsType.Admin)
  // async generatePdf(@Param('id') orderId: number, @Res() res: Response) {
  //   const buffer = await this.orderService.generatePdf(orderId);

  //   res.set({
  //     'Content-Type': 'application/pdf',
  //     'Content-Disposition': `attachment; filename=order_${orderId}.pdf`,
  //     'Content-Length': buffer.length,
  //   });
  //   res.end(buffer);
  // }

  /**
   * -------------------------------------------------------
   */
  @Get(':id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ORDER)
  async getOrderById(@Param('id') orderId: number) {
    const data = await this.orderService.getOrderById(orderId);
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   */
  @Get(':id/service-man')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_SERVICE_BY_SERVICEMAN)
  async getServiceWithIdByServiceMan(
    @User('id') userId: string,
    @Param('id') orderId: number,
  ) {
    const data = await this.orderService.getServiceWithIdByServiceMan(
      userId,
      orderId,
    );
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   */
  @Get('admin')
  @ApiBearerAuth()
  @ApiQuery({ name: 'user_id', required: false })
  @ApiQuery({
    name: 'is_service',
    required: false,
    description: 'e.g. 1 OR 0 ',
  })
  @ApiQuery({ name: 'status', required: false, enum: OrderStatus })
  @ApiQuery({ name: 'order_number', required: false })
  @ApiQuery({ name: 'business_partner_code', required: false })
  @ApiQuery({
    name: 'payment_status',
    required: false,
    enum: OrderPaymentStatus,
  })
  @ApiQuery({ name: 'payment_method', required: false })
  @ApiQuery({ name: 'client_type', required: false })
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiQuery({ name: 'sort', required: false, description: 'e.g. id:desc' })
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_ORDER)
  async getOrders(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([
      ['user_id', 'userId'],
      ['status', 'orderStatusCode'],
      ['payment_status', 'paymentStatusCode'],
      ['is_service', 'isService'],
      ['order_number', 'orderNumber'],
      ['business_partner_code', 'payments.businessPartnerCode'],
      ['payment_method', 'paymentMethodSystemName'],
      ['client_type', 'clientType'],
      ['date', 'createdAt', 'DATE'],
    ])
    filters,
  ) {
    const orderList = await this.orderService.getOrders(
      page,
      limit,
      sorts,
      filters,
    );
    return successfulResult([], orderList);
  }

  /**
   * -------------------------------------------------------
   */
  @Get('service-man')
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_SERVICE_BY_SERVICEMAN)
  @ApiQuery({ name: 'user_id', required: false })
  @ApiQuery({ name: 'status', required: false, enum: OrderStatus })
  @ApiQuery({ name: 'order_number', required: false })
  @ApiQuery({
    name: 'payment_status',
    required: false,
    enum: OrderPaymentStatus,
  })
  @ApiQuery({ name: 'payment_method', required: false })
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiQuery({ name: 'sort', required: false, description: 'e.g. id:desc' })
  @ApiQuery({ name: 'limit', required: false, description: 'Default: 20' })
  @ApiQuery({ name: 'page', required: false, description: 'Default: 1' })
  async getServicesByServiceMan(
    @User('id') userId,
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([
      ['user_id', 'userId'],
      ['status', 'orderStatusCode'],
      ['payment_status', 'paymentStatusCode'],
      ['order_number', 'orderNumber'],
      ['payment_method', 'paymentMethodSystemName'],
      ['date', 'createdAt', 'DATE'],
    ])
    filters,
  ) {
    const orderList = await this.orderService.getServicesByServiceMan(
      userId,
      page,
      limit,
      sorts,
      filters,
    );
    return successfulResult([], orderList);
  }

  /**
   * -------------------------------------------------------
   * add order for user
   */
  @Post('add/me')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  async addByUser(
    @User() user: UserEntity,
    @Body() dto: AddOrderByUserDto,
    @Req() req,
  ) {
    const data = await this.orderService.addByUser(user, dto, req.clientIp);
    return successfulResult(['سفارش جدید برای شما با موفقیت ثبت شد'], data);
  }

  /**
   * -------------------------------------------------------
   */
  @Post('pay/me')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard)
  async payInquiry(@User() user: UserEntity, @Body() dto: PayOrderByUserDto) {
    const data = await this.orderService.payByUser(user, dto);
    return successfulResult(['در حال ارسال به بانک'], data);
  }

  /**
   * -------------------------------------------------------
   * add order for admin
   */
  @Post('add/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.ADD_SHOP_ORDER)
  async add(@User('id') sellerId: string, @Body() dto: AddOrderDto) {
    const data = await this.orderService.add(sellerId, dto);
    return successfulResult(
      ['سفارش جدید برای این کاربر با موفقیت ثبت شد'],
      data,
    );
  }

  /**
   * -------------------------------------------------------
   * update order status
   */
  @Put(':id/status/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_ORDER_STATUS)
  async update(
    @Param('id') orderId,
    @Body() dto: UpdateOrderStatusDto,
    @User('id') operatorUserId: string,
  ) {
    const messages = await this.orderService.updateStatus(
      orderId,
      dto,
      operatorUserId,
    );
    return successfulResult(messages);
  }

  /**
   * -------------------------------------------------------
   * update service
   * assign service to service-man by admin
   */
  @Put('/service-man/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.ASSIGN_SERVICE_TO_SERVICEMAN)
  async updateService(
    @Body() dto: UpdateOrderServiceManDto,
    @User('id') operatorUserId: string,
  ) {
    await this.orderService.updateService(dto, operatorUserId);
    return successfulResult([
      'پیامک اطلاع رسانی به مشتری و سرویسکار منتخب ارسال شد',
    ]);
  }

  /**
   * -------------------------------------------------------
   * update pay status to paid
   */
  @Put('/unsettleds-to-paid/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_ORDER_STATUS)
  async unsettledsToPaid() {
    await this.orderService.unsettledsToPaid();
    return successfulResult([
      'وضعیت تمامی فاکتورهای تسویه نشده به پرداخت شده تغییر یافت.',
    ]);
  }
}
