import { Controller, Get, Post, Body, Patch, Param, Delete, Query, HttpCode, HttpStatus, UseGuards } from '@nestjs/common';
import { ApiTags, ApiOperation, ApiResponse, ApiParam, ApiQuery } from '@nestjs/swagger';
import { JobsService } from './job.service';
import { Job } from './entity/job.entity';
import { CreateJobDto } from './dto/create-job.dto';
import { UpdateJobDto } from './dto/update-job.dto';
import { QueryJobsDto } from './dto/query-jobs.dto';
import { JwtAuthGuard } from 'common/guards/jwt-auth.guard';
import { Roles } from 'common/decorators/role.decorator';
import { UserRole } from 'common/enum/UserRole.enum';

@ApiTags('jobs')
@Controller({ path: 'jobs', version: '1' })
export class JobsController {
  constructor(private readonly jobsService: JobsService) {}

  @Post()
  @UseGuards(JwtAuthGuard)
  @Roles(UserRole.SUPER_ADMIN)
  @ApiOperation({ summary: 'Create a new job posting' })
  @ApiResponse({ status: HttpStatus.CREATED, description: 'Job created successfully', type: Job })
  create(@Body() createJobDto: CreateJobDto): Promise<Job> {
    return this.jobsService.create(createJobDto);
  }

  @Get()
  @ApiOperation({ summary: 'Get all job postings with optional filtering and sorting' })
  @ApiResponse({ status: HttpStatus.OK, description: 'Jobs retrieved successfully', type: [Job] })
  findAll(@Query() query: QueryJobsDto): Promise<Job[]> {
    return this.jobsService.findAll(query);
  }

  @Get('departments')
  @ApiOperation({ summary: 'Get all unique departments' })
  @ApiResponse({ status: HttpStatus.OK, description: 'Departments retrieved successfully', type: [String] })
  getDepartments(): Promise<string[]> {
    return this.jobsService.getDepartments();
  }

  @Get('department/:department')
  @ApiOperation({ summary: 'Find jobs by department' })
  @ApiParam({ name: 'department', description: 'Department name' })
  @ApiResponse({ status: HttpStatus.OK, description: 'Jobs fetched successfully', type: [Job] })
  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'No jobs found in this department' })
  findByDepartment(@Param('department') department: string): Promise<Job[]> {
    return this.jobsService.findByDepartment(department);
  }

  @Get(':id')
  @ApiOperation({ summary: 'Get a job by ID' })
  @ApiParam({ name: 'id', description: 'Job ID' })
  @ApiResponse({ status: HttpStatus.OK, description: 'Job retrieved successfully', type: Job })
  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
  findOne(@Param('id') id: number): Promise<Job> {
    return this.jobsService.findOne(id);
  }

  @Patch(':id')
  @UseGuards(JwtAuthGuard)
  @Roles(UserRole.SUPER_ADMIN)
  @ApiOperation({ summary: 'Update a job posting' })
  @ApiParam({ name: 'id', description: 'Job ID' })
  @ApiResponse({ status: HttpStatus.OK, description: 'Job updated successfully', type: Job })
  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
  update(@Param('id') id: number, @Body() updateJobDto: UpdateJobDto): Promise<Job> {
    return this.jobsService.update(id, updateJobDto);
  }

  @Delete(':id')
  @UseGuards(JwtAuthGuard)
  @Roles(UserRole.SUPER_ADMIN)
  @HttpCode(HttpStatus.NO_CONTENT)
  @ApiOperation({ summary: 'Delete a job posting' })
  @ApiParam({ name: 'id', description: 'Job ID' })
  @ApiResponse({ status: HttpStatus.NO_CONTENT, description: 'Job deleted successfully' })
  @ApiResponse({ status: HttpStatus.NOT_FOUND, description: 'Job not found' })
  remove(@Param('id') id: string): Promise<void> {
    return this.jobsService.remove(id);
  }
}
