import { Body, Controller, Get, Param, Put, UseGuards } from '@nestjs/common';
import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
import { successfulResult } from 'src/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 { UpdateWithdrawDto } from './dto/update-withdraw.dto';
import { WithdrawStatus } from './entities/withdraw.entity';
import { WithdrawService } from './withdraw.service';

@ApiTags('Withdraw')
@Controller('withdraws')
export class WithdrawController {
  constructor(private withdrawService: WithdrawService) {}

  /**
   * -------------------------------------------------------
   * GET /withdraws/1/admin
   */
  @Get(':id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_WITHDRAW)
  async getById(@Param('id') withdrawId: number) {
    const data = await this.withdrawService.getById(withdrawId);
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * GET /withdraws/admin
   */
  @Get('admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_WITHDRAW)
  @ApiQuery({
    name: 'status',
    required: false,
    description: 'e.g. done',
    enum: WithdrawStatus,
  })
  @ApiQuery({ name: 'user_id', required: false, description: 'e.g. 1' })
  @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 withdrawList(
    @Page()
    page,
    @Limit(50) limit,
    @Sort() sorts,
    @Filter(['status', ['date', 'createdAt', 'DATE'], ['user_id', 'userId']])
    filters,
  ) {
    const list = await this.withdrawService.withdrawList(
      page,
      limit,
      filters,
      sorts,
    );
    return successfulResult([], list);
  }

  /**
   * -------------------------------------------------------
   * PUT /withdraws/1/admin
   */
  @Put(':id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_WITHDRAW)
  async updateWithdraw(
    @Param('id') withdrawId: number,
    @Body() dto: UpdateWithdrawDto,
  ) {
    await this.withdrawService.updateWithdraw(withdrawId, dto);
    return successfulResult([
      'درخواست برداشت وجه کاربر موردنظر با موفقیت تعیین وضعیت شد',
    ]);
  }
}
