import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Post,
  Put,
  UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
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 { CreatePollItemDto } from './dto/create-poll-item.dto';
import { UpdatePollItemDto } from './dto/update-poll-item.dto';
import { PollService } from './poll.service';

@ApiTags('Poll')
@Controller('polls')
export class PollController {
  constructor(private pollService: PollService) {}

  /**
   * -------------------------------------------------------
   * Show statistic for all polls
   * GET /poll/statistic/admin
   */
  @Get('statistic/admin')
  @ApiQuery({ name: 'is_service', required: false, description: 'e.g. 1' })
  @ApiQuery({ name: 'star', required: false, description: 'e.g. 1' })
  @ApiQuery({
    name: 'date',
    required: false,
    description: 'e.g. gte:2022-04-16[and]lte:2022-04-16',
  })
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_POLL_STATISTICS)
  async statistic(
    @Filter([
      'star',
      ['date', 'createdAt', 'DATE'],
      ['is_service', 'isService'],
    ])
    filters,
  ) {
    const data = await this.pollService.statistic(filters);
    return successfulResult([], data);
  }

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

  /**
   * -------------------------------------------------------
   */
  @Get('items/admin')
  @ApiQuery({
    name: 'title',
    required: false,
    description: 'e.g. like:%abc%',
  })
  @ApiQuery({
    name: 'is_satisfied',
    required: false,
    description: 'e.g. 1',
  })
  @ApiQuery({
    name: 'is_service',
    required: false,
    description: 'e.g. 1',
  })
  @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_POLL)
  async itemList(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([
      'title',
      ['is_satisfied', 'isSatisfied'],
      ['is_service', 'isService'],
    ])
    filters,
  ) {
    const data = await this.pollService.getAllItems(
      page,
      limit,
      filters,
      sorts,
    );
    return successfulResult([], data);
  }

  /**
   * -------------------------------------------------------
   */
  @Post('items/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.ADD_POLL)
  async createItem(@Body() dto: CreatePollItemDto) {
    const newRange = await this.pollService.createItem(dto);
    return successfulResult(['آیتم نظرسنجی جدید با موفقیت ایجاد شد'], newRange);
  }

  /**
   * -------------------------------------------------------
   */
  @Put('items/:id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_POLL)
  async updateItem(@Param('id') id: number, @Body() dto: UpdatePollItemDto) {
    await this.pollService.updateItem(id, dto);
    return successfulResult(['آیتم نظرسنجی مورد نظر با موفقیت آپدیت شد']);
  }

  /**
   * -------------------------------------------------------
   */
  @Delete('items/:id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.DELETE_POLL)
  async deleteItem(@Param('id') id: number) {
    await this.pollService.deleteItem(id);
    return successfulResult(['آیتم نظرسنجی مورد نظر با موفقیت حذف شد']);
  }

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

  /**
   * -------------------------------------------------------
   */
  @Get('admin')
  @ApiQuery({
    name: 'is_service',
    required: false,
    description: 'e.g. 1',
  })
  @ApiQuery({
    name: 'star',
    required: false,
    description: 'e.g. 1',
  })
  @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_POLL)
  async list(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter(['star', ['is_service', 'isService']])
    filters,
  ) {
    const data = await this.pollService.getAll(page, limit, filters, sorts);
    return successfulResult([], data);
  }
}
