import {
  Body,
  Controller,
  Get,
  Param,
  Post,
  Put,
  UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
import { JwtAuthGuard } from 'src/modules/auth/jwt/jwt.guard';
import { successfulResult } from 'src/utils';
import { Filter } from 'src/utils/decorators/filter.decorator';
import { Permissions } from '../auth/permission/permissions.decorator';
import { PermissionsGuard } from '../auth/permission/permissions.guard';
import { PermissionsType } from '../role/entities/permission.entity';
import { CooperationService } from './cooperation.service';
import { ReplyCooperationDto } from './dto/reply-cooperation.dto';
import { UpdateCooperationDto } from './dto/update-cooperation.dto';

@ApiTags('Cooperation')
@Controller('cooperations')
export class CooperationController {
  constructor(private cooperationService: CooperationService) {}

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

  /**
   * -------------------------------------------------------
   * GET /cooperations/admin
   */
  @Get('admin')
  @ApiQuery({ name: 'fan', required: false })
  @ApiQuery({ name: 'is_readed', required: false, description: '1 | 0' })
  @ApiQuery({ name: 'date', required: false })
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_COOPERATION)
  async list(
    @Filter(['fan', ['is_readed', 'isReade'], ['date', 'createdAt', 'DATE']])
    filters,
  ) {
    const data = await this.cooperationService.getAll(filters);
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   * Put cooperations/1/admin
   */
  @Put(':id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_COOPERATION)
  async updateById(@Param('id') id: number, @Body() dto: UpdateCooperationDto) {
    await this.cooperationService.updateById(id, dto);
    return successfulResult(['درخواست همکاری، با موفقیت آپدیت شد']);
  }

  /**
   * -------------------------------------------------------
   * Post cooperations/1/reply/admin
   * Reply to cooperations
   */
  @Post(':id/reply/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.ADD_COOPERATION)
  async replyById(@Param('id') id: number, @Body() dto: ReplyCooperationDto) {
    await this.cooperationService.replyById(id, dto);
    return successfulResult(['پاسخ شما با موفقیت ارسال شد']);
  }
}
