import {
  Controller,
  Get,
  Post,
  Body,
  Put,
  Param,
  Delete,
  Query,
  Req,
  UseGuards,
} from "@nestjs/common"
import { LeaveRequestsService } from "./leave-requests.service"
import { CreateLeaveRequestDto } from "./dto/create-leave-request.dto"
import { UpdateLeaveRequestDto } from "./dto/update-leave-request.dto"
import { UpdateLeaveRequestStatusDto } from "./dto/update-leave-request-status.dto"
import { LeaveRequestFiltersDto } from "./dto/leave-request-filters.dto"
import { ApiBearerAuth, ApiTags } from "@nestjs/swagger"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"

@Controller("leave-requests")
@ApiTags("Leave Requests")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
export class LeaveRequestsController {
  constructor(private readonly leaveRequestsService: LeaveRequestsService) {}

  @Post()
  create(
    @Body() createLeaveRequestDto: CreateLeaveRequestDto,
    @Req() request: Request,
  ) {
    return this.leaveRequestsService.create(
      createLeaveRequestDto,
      request.headers["authorization"],
    )
  }

  @Get()
  findAll(@Query() query: LeaveRequestFiltersDto, @Req() request: Request) {
    return this.leaveRequestsService.findAll(
      query,
      request.headers["authorization"],
    )
  }

  @Get("my-leave-requests")
  findMyLeaveRequests(
    @Query() query: LeaveRequestFiltersDto,
    @Req() request: Request,
  ) {
    return this.leaveRequestsService.findMyLeaveRequests(
      query,
      request.headers["authorization"],
    )
  }

  @Get(":id")
  findOne(@Param("id") id: string) {
    return this.leaveRequestsService.findOne(+id)
  }

  @Put(":id")
  update(
    @Param("id") id: string,
    @Body() updateLeaveRequestDto: UpdateLeaveRequestDto,
    @Req() request: Request,
  ) {
    return this.leaveRequestsService.update(
      +id,
      updateLeaveRequestDto,
      request.headers["authorization"],
    )
  }

  @Delete(":id")
  remove(@Param("id") id: string, @Req() request: Request) {
    return this.leaveRequestsService.remove(
      +id,
      request.headers["authorization"],
    )
  }

  @Put("status/:id")
  updateStatus(
    @Param("id") id: string,
    @Body() updateStatusDto: UpdateLeaveRequestStatusDto,
    @Req() request: Request,
  ) {
    return this.leaveRequestsService.updateStatus(
      +id,
      updateStatusDto,
      request.headers["authorization"],
    )
  }
}
