import {
  Controller,
  Get,
  Post,
  Body,
  Param,
  Delete,
  Put,
  UseGuards,
  Query,
  UseInterceptors,
  UploadedFiles,
  ParseIntPipe,
} from "@nestjs/common"
import { CreateTeamMemberDto } from "../dto/team-members/create-team-member.dto"
import { UpdateTeamMemberDto } from "../dto/team-members/update-team-member.dto"
import { ApiBearerAuth, ApiBody, ApiConsumes, ApiTags } from "@nestjs/swagger"
import { TeamMemberService } from "./team-member.service"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { FindAllTeamMemberDto } from "../dto/find-all-team-member.dto"
import { FileFieldsInterceptor } from "@nestjs/platform-express"
import { teamMemberFileUploadConfig } from "src/common/file-upload/team-member-upload.config"
import { UnassignedDriversQueryDto } from "../dto/team-members/unassigned-driver.dto"

@Controller("team-member")
@ApiTags("Team Member")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
export class TeamMemberController {
  constructor(private readonly teamMemberService: TeamMemberService) {}

  // Create a new Team Member
  @Post("create")
  @UseInterceptors(
    FileFieldsInterceptor(
      [
        { name: "profile_photo", maxCount: 1 },
        { name: "document_files", maxCount: 5 },
      ],
      teamMemberFileUploadConfig,
    ),
  )
  @ApiConsumes("multipart/form-data")
  @ApiBody({ type: CreateTeamMemberDto })
  async createTeamMember(
    @Body() createTeamMemberDto: CreateTeamMemberDto,
    @UploadedFiles()
    files: {
      profile_photo?: Express.Multer.File[]
      document_files?: Express.Multer.File[]
    },
  ) {
    const profilePhoto = files.profile_photo?.[0]
    const documentFiles = files.document_files

    return await this.teamMemberService.createTeamMember(
      createTeamMemberDto,
      profilePhoto,
      documentFiles,
    )
  }

  // Get all Team Members
  @Get("list")
  async findAllDepartments(@Query() teamMenerDto: FindAllTeamMemberDto) {
    return this.teamMemberService.findAllTeamMembers(teamMenerDto)
  }

  // Get a specific Team Member by ID
  @Get("list/:id")
  async findOne(@Param("id") id: number) {
    return await this.teamMemberService.findOneTeamMember(id)
  }

  // Update a Team Member by ID
  @Put("update/:id")
  @UseInterceptors(
    FileFieldsInterceptor(
      [
        { name: "profile_photo", maxCount: 1 },
        { name: "document_files", maxCount: 10 },
      ],
      teamMemberFileUploadConfig,
    ),
  )
  @ApiConsumes("multipart/form-data")
  async update(
    @Param("id") id: number,
    @Body() updateData: UpdateTeamMemberDto,
    @UploadedFiles()
    files: {
      profile_photo?: Express.Multer.File[]
      document_files?: Express.Multer.File[]
    },
  ) {
    const profilePhoto = files.profile_photo?.[0]
    const documentFiles = files.document_files

    return await this.teamMemberService.updateTeamMember(
      id,
      updateData,
      profilePhoto,
      documentFiles,
    )
  }

  // Delete a Team Member by ID
  @Delete("delete/:id")
  async remove(@Param("id") id: number) {
    return await this.teamMemberService.remove(id)
  }

  @Delete(":teamMemberId/id-proof/:idProofId")
  async deleteIdProof(
    @Param("teamMemberId") teamMemberId: number,
    @Param("idProofId") idProofId: number,
  ) {
    return await this.teamMemberService.deleteIdProof(teamMemberId, idProofId)
  }

  @Get("reporting-by-role/:roleId")
  async getReportingTeamMembersByRole(
    @Param("roleId", ParseIntPipe) roleId: number,
  ) {
    return this.teamMemberService.getReportingTeamMembersByRole(roleId)
  }

  @Get("drivers-by-role")
  async getDriversByRole() {
    return this.teamMemberService.getDriversByRole()
  }

  @Get("dispatchers-by-role")
  async getDispatchersByRole() {
    return this.teamMemberService.getDispatchersByRole()
  }

  @Get("unassigned-drivers")
  async getUnassignedDrivers(@Query() query: UnassignedDriversQueryDto) {
    return this.teamMemberService.getUnassignedDrivers(query)
  }

  @Get("languages-dropdown")
  async getLanguagesDropdown() {
    return this.teamMemberService.getLanguagesDropdown()
  }
}
