import {
  Body,
  Controller,
  Delete,
  Get,
  HttpCode,
  HttpStatus,
  Param,
  Post,
  Put,
  UseGuards,
} from '@nestjs/common';
import { ApiBearerAuth, ApiQuery, ApiTags } from '@nestjs/swagger';
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 { 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 { CreateServiceTimeDto } from './dto/create-service-time.dto';
import { UpdateServiceTimeDto } from './dto/update-service-time.dto';

import { ServiceTimeService } from './service-time.service';

@ApiTags('service time')
@Controller('service-times')
export class ServiceTimeController {
  constructor(private serviceTimeService: ServiceTimeService) {}

  /**
   * -------------------------------------------------------
   * POST /serviceTimes/admin
   */
  @Post('admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.ADD_SERVICE_TIME)
  @HttpCode(HttpStatus.CREATED)
  async addTime(@Body() dto: CreateServiceTimeDto) {
    const data = await this.serviceTimeService.addTime(dto);
    return successfulResult(['محدوده زمانی جدید، باموفقیت اضافه شد'], data);
  }

  /**
   * -------------------------------------------------------
   * PUT /serviceTimes/1/admin
   */
  @Put(':id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.UPDATE_SERVICE_TIME)
  async updateTime(@Param('id') id: number, @Body() dto: UpdateServiceTimeDto) {
    await this.serviceTimeService.updateTime(id, dto);
    return successfulResult(['محدوده زمانی موردنظر، باموفقیت ویرایش شد']);
  }

  /**
   * -------------------------------------------------------
   * GET /serviceTimes/admin
   */
  @Get('admin')
  @ApiQuery({ name: 'time_range', required: false })
  @ApiQuery({ name: 'is_active', required: false })
  @ApiQuery({ name: 'date', required: false })
  @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_SERVICE_TIME)
  async TimeList(
    @Page() page,
    @Limit() limit,
    @Sort() sorts,
    @Filter([
      ['time_range', 'timeRange'],
      ['is_active', 'isActive'],
      ['date', 'createdAt', 'DATE'],
    ])
    filters,
  ) {
    const data = await this.serviceTimeService.timeList(
      page,
      limit,
      filters,
      sorts,
    );
    return successfulResult([], data);
  }

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

  /**
   * -------------------------------------------------------
   * DELETE /serviceTime/1/admin
   */
  @Delete('/:id/admin')
  @ApiBearerAuth()
  @UseGuards(JwtAuthGuard, PermissionsGuard)
  @Permissions(PermissionsType.DELETE_SERVICE_TIME)
  async deleteServiceTime(@Param('id') id: number) {
    await this.serviceTimeService.deleteServiceTime(id);
    return successfulResult(['زمان سرویس دهی موردنظر با موفقیت حذف شد']);
  }
}
