import {
  Body,
  Controller,
  Get,
  HttpCode,
  HttpStatus,
  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 { Limit } from 'src/utils/decorators/limit.decorator';
import { Page } from 'src/utils/decorators/page.decorator';
import { Sort } from 'src/utils/decorators/sort.decorator';
import { User } from 'src/utils/decorators/user.decorator';
import { Permissions } from '../auth/permission/permissions.decorator';
import { PermissionsGuard } from '../auth/permission/permissions.guard';
import { PermissionsType } from '../role/entities/permission.entity';
import { CreateTicketDto } from './dto/create-ticket.dto';
import { UpdateTicketDto } from './dto/update-ticket.dto';
import { TicketService } from './ticket.service';

@ApiTags('Ticket')
@Controller('tickets')
export class TicketController {
  constructor(private ticketService: TicketService) {}

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

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

  /**
   * -------------------------------------------------------
   * GET /tickets
   */
  @Get('admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_TICKET)
  @ApiQuery({
    name: 'title',
    required: false,
    description: 'e.g. like:%hi%',
  })
  @ApiQuery({
    name: 'category',
    required: false,
  })
  @ApiQuery({
    name: 'is_readed',
    required: false,
  })
  @ApiQuery({
    name: 'is_closed',
    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 getAll(
    @Page() page,
    @Limit(50) limit,
    @Sort() sorts,
    @Filter([
      'title',
      'category',
      ['is_readed', 'isReade'],
      ['is_closed', 'isClose'],
      ['date', 'createdAt', 'DATE'],
    ])
    filters,
  ) {
    const list = await this.ticketService.getAll(page, limit, sorts, filters);
    return successfulResult([], list);
  }

  /**
   * -------------------------------------------------------
   * POST /tickets/reply/admin
   */
  @Post('reply/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.REPLY_TICKET)
  @HttpCode(HttpStatus.CREATED)
  async addTicket(@User('id') userId: string, @Body() dto: CreateTicketDto) {
    const data = await this.ticketService.addTicket(userId, dto);
    return successfulResult(['پیام شما ارسال شد'], data);
  }

  /**
   * -------------------------------------------------------
   * Put tickets/1/admin
   * Update tickets
   */
  @Put(':id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_TICKET)
  async updateById(@Param('id') id: number, @Body() dto: UpdateTicketDto) {
    await this.ticketService.updateById(id, dto);
    return successfulResult(['تیکت با موفقیت آپدیت شد']);
  }

  /**
   * -------------------------------------------------------
   * GET tickets/categories
   */
  @Get('categories')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.GET_TICKET)
  async getCategories() {
    const data = this.ticketService.getCategoryList();
    return successfulResult([], data);
  }
}
