import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  ParseIntPipe,
  Patch,
  Post,
  Query,
  UseGuards,
} from "@nestjs/common"
import { ApiBearerAuth, ApiOperation, ApiTags } from "@nestjs/swagger"
import { AuthGuardMiddleware } from "src/middleware/auth-guard.middleware"
import { ClientsCompaniesService } from "./clients-companies.service"
import { CreateClientsCompanyDto } from "../dto/create-clients-company.dto"
import { ClientsCompaniesFilterDto } from "../dto/filter-clients-companies.dto"
import { UpdateClientsCompanyDto } from "../dto/update-clients-company.dto"
import { CreateInvoiceSettingsDto } from "../dto/create-invoice-settings.dto"
import { UpdateInvoiceSettingsDto } from "../dto/update-invoice-settings.dto"

@Controller("clients")
@ApiTags("Clients")
@UseGuards(AuthGuardMiddleware)
@ApiBearerAuth("access-token")
export class ClientsCompaniesController {
  constructor(
    private readonly clientsCompaniesService: ClientsCompaniesService,
  ) {}

  @Post()
  create(@Body() createClientsCompanyDto: CreateClientsCompanyDto) {
    return this.clientsCompaniesService.create(createClientsCompanyDto)
  }

  @Get()
  findAll(@Query() filter: ClientsCompaniesFilterDto) {
    return this.clientsCompaniesService.findAll(filter)
  }

  @Get("/dropdown")
  async getCompanyDropdown(@Query() query: ClientsCompaniesFilterDto) {
    return this.clientsCompaniesService.companyDropdownWithPagination(query)
  }

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

  @Patch(":id")
  update(
    @Param("id") id: string,
    @Body() updateClientsCompanyDto: UpdateClientsCompanyDto,
  ) {
    return this.clientsCompaniesService.update(+id, updateClientsCompanyDto)
  }

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

  @Post("invoice-settings")
  @ApiOperation({ summary: "Create invoice settings" })
  createInvoiceSettings(
    @Body() createInvoiceSettingsDto: CreateInvoiceSettingsDto,
  ) {
    return this.clientsCompaniesService.createInvoiceSettings(
      createInvoiceSettingsDto,
    )
  }

  @Get("invoice-settings/:id")
  @ApiOperation({ summary: "Get invoice settings by ID" })
  findOneInvoiceSettings(@Param("id", ParseIntPipe) id: number) {
    return this.clientsCompaniesService.findOneInvoiceSettings(id)
  }

  @Get("invoice-setting/:customer_id")
  @ApiOperation({ summary: "Get invoice settings by customer ID" })
  findOneInvoiceSettingsFromCustomer(
    @Param("customer_id", ParseIntPipe) id: number,
  ) {
    return this.clientsCompaniesService.findOneInvoiceSettingsFromCustomer(id)
  }

  @Patch("invoice-settings/:id")
  @ApiOperation({ summary: "Update invoice settings" })
  updateInvoiceSettings(
    @Param("id", ParseIntPipe) id: number,
    @Body() updateDto: UpdateInvoiceSettingsDto,
  ) {
    return this.clientsCompaniesService.updateInvoiceSettings(id, updateDto)
  }

  @Delete("invoice-settings/:id")
  @ApiOperation({ summary: "Delete invoice settings" })
  removeInvoiceSettings(@Param("id", ParseIntPipe) id: number) {
    return this.clientsCompaniesService.removeInvoiceSettings(id)
  }
}
