import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  Query,
  UploadedFile,
  UseGuards,
  UseInterceptors,
} from "@nestjs/common"
import { FileInterceptor } from "@nestjs/platform-express"
import {
  ApiBearerAuth,
  ApiBody,
  ApiConsumes,
  ApiOperation,
  ApiResponse,
  ApiTags,
} from "@nestjs/swagger"
import { contractFileConfig } from "src/common/file-upload/client-contract-document.config"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { ClientContractService } from "./client-contract.service"
import { CreateClientCompanyContractDto } from "../dto/create-client-contract.dto"
import { ClientCompanyContractFilterDto } from "../dto/filter-client-contract.dto"
import { UpdateClientCompanyContractDto } from "../dto/update-client-contract.dto"
import { ClientCompanyContract } from "../entities/client-contract.entity"

@ApiTags("Client Company Contracts")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
@Controller("contracts")
export class ClientContractController {
  constructor(private readonly contractService: ClientContractService) {}

  @Post()
  @UseInterceptors(FileInterceptor("contract_document", contractFileConfig))
  @ApiConsumes("multipart/form-data")
  @ApiBody({ type: CreateClientCompanyContractDto })
  @ApiOperation({ summary: "Create a new contract with document" })
  @ApiResponse({
    status: 201,
    description: "The contract has been successfully created.",
    type: ClientCompanyContract,
  })
  create(
    @Body() createContractDto: CreateClientCompanyContractDto,
    @UploadedFile() file?: Express.Multer.File,
  ) {
    return this.contractService.create(createContractDto, file)
  }

  @Get()
  @ApiOperation({ summary: "Get all contracts with pagination and search" })
  @ApiResponse({
    status: 200,
    description: "Return all contracts with pagination and search",
    type: [ClientCompanyContract],
  })
  findAll(@Query() query: ClientCompanyContractFilterDto) {
    return this.contractService.findAll(query)
  }

  @Get(":id")
  @ApiOperation({ summary: "Get a contract by id" })
  @ApiResponse({ status: 200, description: "Return the contract" })
  findOne(@Param("id") id: number) {
    return this.contractService.findOne(id)
  }

  @Patch(":id")
  @UseInterceptors(FileInterceptor("contract_document", contractFileConfig))
  @ApiConsumes("multipart/form-data")
  @ApiOperation({ summary: "Update a contract" })
  @ApiBody({ type: UpdateClientCompanyContractDto })
  @ApiResponse({
    status: 200,
    description: "The contract has been successfully updated.",
    type: ClientCompanyContract,
  })
  @ApiResponse({ status: 404, description: "Contract not found" })
  update(
    @Param("id") id: number,
    @Body() updateContractDto: UpdateClientCompanyContractDto,
    @UploadedFile() file?: Express.Multer.File,
  ) {
    return this.contractService.update(id, updateContractDto, file)
  }

  @Delete(":id")
  @ApiOperation({ summary: "Delete a contract" })
  @ApiResponse({
    status: 200,
    description: "The contract has been successfully deleted.",
  })
  @ApiResponse({ status: 404, description: "Contract not found" })
  remove(@Param("id") id: number) {
    return this.contractService.remove(id)
  }
}
