import {
  Body,
  Controller,
  Get,
  Post,
  Query,
  Req,
  Res,
  UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
import { PaymentService } from './payment.service';
import { Page } from 'src/utils/decorators/page.decorator';
import { Limit } from 'src/utils/decorators/limit.decorator';
import { Sort } from 'src/utils/decorators/sort.decorator';
import { Filter } from 'src/utils/decorators/filter.decorator';
import { JwtAuthGuard } from '../auth/jwt/jwt.guard';
import { PermissionsGuard } from '../auth/permission/permissions.guard';
import { PermissionsType } from '../role/entities/permission.entity';
import { Permissions } from '../auth/permission/permissions.decorator';
import { successfulResult } from 'src/utils';
import { PaymentStatus, PaymentType } from './entities/payment.entity';
import { Request, Response } from 'express';

@ApiTags('Payment')
@Controller('payments')
export class PaymentController {
  constructor(private paymentService: PaymentService) {}

  /**
   * -------------------------------------------------------
   * GET /payments/admin
   */
  @Get('admin')
  @ApiQuery({ name: 'user_id', required: false })
  @ApiQuery({ name: 'order_id', required: false })
  @ApiQuery({ name: 'status', required: false, enum: PaymentStatus })
  @ApiQuery({ name: 'type', required: false, enum: PaymentType })
  @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' })
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_PAYMENT)
  async getAll(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([
      ['user_id', 'userId'],
      ['order_id', 'orderId'],
      ['status', 'paymentStatus'],
      ['type', 'paymentType'],
      ['date', 'createdAt', 'DATE'],
    ])
    filters,
  ) {
    const list = await this.paymentService.getAll(page, limit, filters, sorts);
    return successfulResult([], list);
  }

  /**
   * -------------------------------------------------------
   * GET /payments/zarinpal/verify
   */
  @Get('zarinpal/verify')
  async verifyZarinpal(
    @Query('Authority') authority: string,
    @Query('Status') status: string,
    @Res() res: Response,
  ) {
    const redirectUrl = await this.paymentService.verifyZarinpal(
      authority,
      status,
    );

    // http://example.com/pay-redirect?Status=success&Message=انجامشد
    return res.redirect(redirectUrl);
  }

  /**
   * -------------------------------------------------------
   * POST /payments/meli/verify
   */
  @Post('meli/verify')
  async verifyMeli(
    @Body('ResCode') code: string,
    @Body('token') authority: string,
    @Res() res: Response,
    @Req() req: Request,
  ) {
    console.log('meli verify req.body', req.body);
    console.log('meli verify req.query', req.query);

    const redirectUrl = await this.paymentService.verifyMeli(authority, code);

    // http://example.com/pay-redirect?Status=success&Message=انجامشد
    return res.redirect(redirectUrl);
  }

  /**
   * -------------------------------------------------------
   * POST /payments/snapp-pay/verify
   */
  @Post('snapp-pay/verify')
  async verifySnappPay(
    @Query('transactionId') businessPartnerCode: string,
    @Query('state') state: string,
    // @Query('amount') amount: string,
    @Res() res: Response,
    @Req() req: Request,
  ) {
    console.log('POST /payments/snapp-pay/verify', req.query);

    const redirectUrl = await this.paymentService.verifySnappPay(
      businessPartnerCode,
      state,
    );

    // http://example.com/pay-redirect?Status=success&Message=انجامشد
    return res.redirect(redirectUrl);
  }
}
