import {
  Controller,
  Get,
  Post,
  Body,
  Param,
  Delete,
  Query,
  Res,
} from '@nestjs/common';
import { IsOptional, IsString, IsNumberString } from 'class-validator';
import type { Response } from 'express';
import { JobsService } from './jobs.service';
import { CreateJobDto } from './dto/create-job.dto';
import { JobsPdfService } from './jobs-pdf.service';
import { JobsExcelService } from './jobs-excel.service';

export class JobFilterQuery {
  @IsOptional()
  @IsString()
  companyName?: string;

  @IsOptional()
  @IsString()
  templateName?: string;

  @IsOptional()
  @IsString()
  stage?: string;

  @IsOptional()
  @IsString()
  startDate?: string;

  @IsOptional()
  @IsString()
  endDate?: string;

  // ✅ Pagination
  @IsOptional()
  @IsNumberString()
  page?: string;

  @IsOptional()
  @IsNumberString()
  limit?: string;
}

@Controller('jobs')
export class JobsController {
  constructor(
    private readonly jobsService: JobsService,
    private readonly jobsPdfService: JobsPdfService,
    private readonly jobsExcelService: JobsExcelService,
  ) {}

  @Post()
  create(@Body() dto: CreateJobDto) {
    return this.jobsService.create(dto);
  }

  @Get('next-job-number')
  async getNextJobNumber() {
    const nextJobNumber = await this.jobsService.getNextJobNumber();
    return { nextJobNumber };
  }

  @Get('export/pdf')
  async exportPdf(@Query() filters: JobFilterQuery, @Res() res: Response) {
    try {
      const jobs = await this.jobsService.findAllWithFilters(filters);
      const buffer = await this.jobsPdfService.generateJobRegisterPdf(jobs);
      const filename = `job-register-${Date.now()}.pdf`;
      res.set({
        'Content-Type': 'application/pdf',
        'Content-Disposition': `attachment; filename="${filename}"`,
        'Content-Length': buffer.length,
      });
      res.end(buffer);
    } catch (err) {
      const error = err as Error; // ✅
      console.error('PDF export error:', error);
      res
        .status(500)
        .json({ message: 'Failed to generate PDF', error: error.message });
    }
  }

  @Get('export/excel')
  async exportExcel(@Query() filters: JobFilterQuery, @Res() res: Response) {
    try {
      const jobs = await this.jobsService.findAllWithFilters(filters);
      const buffer = await this.jobsExcelService.generateJobRegisterExcel(jobs);
      const filename = `job-register-${Date.now()}.xlsx`;
      res.set({
        'Content-Type':
          'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
        'Content-Disposition': `attachment; filename="${filename}"`,
        'Content-Length': buffer.length,
      });
      res.end(buffer);
    } catch (err) {
      const error = err as Error; // ✅
      console.error('Excel export error:', error);
      res
        .status(500)
        .json({ message: 'Failed to generate Excel', error: error.message });
    }
  }

  // ✅ Paginated findAll
  @Get()
  findAll(@Query() query: JobFilterQuery) {
    const page = parseInt(query.page ?? '1', 10);
    const limit = parseInt(query.limit ?? '10', 10);
    return this.jobsService.findAll({ page, limit });
  }

  @Get(':id')
  findOne(@Param('id') id: number) {
    return this.jobsService.findOne(id);
  }

  @Delete(':id')
  remove(@Param('id') id: number) {
    return this.jobsService.remove(id);
  }
}
