import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  UseGuards,
  Query,
  Res,
} from "@nestjs/common"
import { InvoicesService } from "./invoices.service"
import { CreateInvoiceDto } from "../dto/create-invoice.dto"
import { UpdateInvoiceDto } from "../dto/update-invoice.dto"
import { ApiBearerAuth, ApiTags } from "@nestjs/swagger"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { FilterInvoiceDto } from "../dto/filter-invoice.dto"
import { ExportExcel } from "src/common/decorators/excel-decorator"
import { Response } from "express"

@ApiTags("Invoices")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
@Controller("invoices")
export class InvoicesController {
  constructor(private readonly invoicesService: InvoicesService) {}

  @Post()
  create(@Body() createInvoiceDto: CreateInvoiceDto) {
    return this.invoicesService.create(createInvoiceDto)
  }

  @Get()
  findAll(@Query() filterInvoiceDto: FilterInvoiceDto) {
    return this.invoicesService.findAll(filterInvoiceDto)
  }

  @Get("excel/export")
  @ExportExcel("Invoice-excel-export")
  async invoiceExcel(
    @Query() filterInvoiceDto: FilterInvoiceDto,
    @Res() res: Response,
  ) {
    const buffer = await this.invoicesService.excelExport(filterInvoiceDto)
    res.end(buffer)
  }

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

  @Patch(":id")
  update(@Param("id") id: string, @Body() updateInvoiceDto: UpdateInvoiceDto) {
    return this.invoicesService.update(+id, updateInvoiceDto)
  }

  @Delete(":id")
  remove(@Param("id") id: string) {
    return this.invoicesService.remove(+id)
  }

  @Post("/download")
  async downloadInvoice(@Body() invoiceData: any, @Res() res: Response) {
    const pdfBuffer = await this.invoicesService.generateInvoicePdf(invoiceData)

    // Use the filename from the request body, or fallback to a default
    const filename = invoiceData.filename || `${invoiceData.invoiceNumber}.pdf`

    console.log("filename", filename)

    res.set({
      "Content-Type": "application/pdf",
      "Content-Disposition": `attachment; filename="${filename}"`,
      "Content-Length": pdfBuffer.length,
    })

    return res.end(pdfBuffer)
  }

  @Post("/print")
  async printInvoice(@Body() invoiceData: any, @Res() res: Response) {
    try {
      const pdfBuffer =
        await this.invoicesService.generateInvoicePdf(invoiceData)

      res.set({
        "Content-Type": "application/pdf",
        "Content-Disposition": "inline; filename=invoice.pdf", // ✅ allow browser to open directly
      })

      return res.send(pdfBuffer) // ✅ send buffer directly
    } catch (err) {
      console.error("Error while printing invoice:", err)
      return res.status(500).send("Failed to generate PDF")
    }
  }
}
