import {
  Controller,
  Get,
  Post,
  Body,
  Put,
  Param,
  Delete,
  Query,
  Req,
  Patch,
  UseGuards,
} from "@nestjs/common"
import { ProjectsService } from "./projects.service"
import { CreateProjectDto } from "./dto/create-project.dto"
import { UpdateProjectDto } from "./dto/update-project.dto"
import { ProjectFiltersDto } from "./dto/project-filters.dto"
import { AssignPartyDto } from "./dto/assign-party.dto"
import { PartyAssignmentFiltersDto } from "./dto/party-assignment-filters.dto"
import { DeletePartyAssignmentDto } from "./dto/delete-party-assignment.dto"
import { UpdateCompletionPercentageDto } from "./dto/update-completion-percentage.dto"
import { BulkAssignActivitiesDto } from "./dto/bulk-assign-activities.dto"
import { ApiBearerAuth, ApiTags } from "@nestjs/swagger"
import { AuthGuardMiddleware } from "../../middleware/auth-guard.middleware"

@Controller("projects")
@ApiBearerAuth("access-token")
@ApiTags("Projects")
@UseGuards(AuthGuardMiddleware)
export class ProjectsController {
  constructor(private readonly projectsService: ProjectsService) {}

  @Post()
  create(@Body() createProjectDto: CreateProjectDto, @Req() request: Request) {
    return this.projectsService.create(
      createProjectDto,
      request.headers["authorization"],
    )
  }

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

  @Post(":projectId/assign-employee")
  assignEmployee(
    @Param("projectId") projectId: string,
    @Body() body: { employee_id: number },
    @Req() request: Request,
  ) {
    return this.projectsService.assignEmployee(
      +projectId,
      body.employee_id,
      request.headers["authorization"],
    )
  }

  @Get(":projectId/employees")
  getProjectEmployees(
    @Param("projectId") projectId: string,
    @Req() request: Request,
    @Query() query: any,
  ) {
    return this.projectsService.getProjectEmployees(
      +projectId,
      request.headers["authorization"],
      query,
    )
  }

  @Delete(":projectId/assigned-employees/:id")
  removeEmployeeAssignment(
    @Param("projectId") projectId: string,
    @Param("id") id: string,
    @Req() request: Request,
  ) {
    return this.projectsService.removeEmployeeAssignment(
      +projectId,
      +id,
      request.headers["authorization"],
    )
  }

  @Post("party-assignments")
  assignParty(@Body() dto: AssignPartyDto, @Req() request: Request) {
    return this.projectsService.assignParty(
      dto,
      request.headers["authorization"],
    )
  }

  @Get("party-assignments/assigned-parties")
  getAssignedParties(
    @Query() query: PartyAssignmentFiltersDto,
    @Req() request: Request,
  ) {
    return this.projectsService.getAssignedParties(
      query,
      request.headers["authorization"],
    )
  }

  @Delete("party-assignments")
  deletePartyAssignment(
    @Body() dto: DeletePartyAssignmentDto,
    @Req() request: Request,
  ) {
    return this.projectsService.deletePartyAssignment(
      dto,
      request.headers["authorization"],
    )
  }

  @Patch(":id/active-inactive")
  activeInactive(@Param("id") id: string, @Req() request: Request) {
    return this.projectsService.activeInactive(
      +id,
      request.headers["authorization"],
    )
  }

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

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

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

  @Patch(":projectId/completion-percentage")
  updateCompletionPercentage(
    @Param("projectId") projectId: string,
    @Body() updateCompletionPercentageDto: UpdateCompletionPercentageDto,
    @Req() request: Request,
  ) {
    return this.projectsService.updateCompletionPercentage(
      +projectId,
      updateCompletionPercentageDto,
      request.headers["authorization"],
    )
  }

  @Post(":projectId/activities")
  bulkAssignActivities(
    @Param("projectId") projectId: string,
    @Body() bulkAssignActivitiesDto: BulkAssignActivitiesDto,
    @Req() request: Request,
  ) {
    return this.projectsService.bulkAssignActivities(
      +projectId,
      bulkAssignActivitiesDto,
      request.headers["authorization"],
    )
  }

  @Delete(":projectId/activities/:activityTypeId")
  removeActivityFromProject(
    @Param("projectId") projectId: string,
    @Param("activityTypeId") activityTypeId: string,
    @Req() request: Request,
  ) {
    return this.projectsService.removeActivityFromProject(
      +projectId,
      +activityTypeId,
      request.headers["authorization"],
    )
  }
}
