import {
  Body,
  Controller,
  Get,
  Post,
  Req,
  Param,
  Query,
  Patch,
  Put,
  UseGuards,
  Delete,
  UploadedFile,
  UseInterceptors,
} from "@nestjs/common"
import { FileInterceptor } from "@nestjs/platform-express"
import { Request } from "express"
import { CompanyService } from "./company.service"
import { ApiBearerAuth, ApiConsumes, ApiTags } from "@nestjs/swagger"
import { logoConfig } from "../../common/file-upload/logo.config"
import { CreateCompanySettingDto } from "./dto/create-company-settings.dto"
import { CreateCompanyDto } from "./dto/create-company.dto"
import { RegisterCompanyDto } from "./dto/register-company.dto"
import { UpdateCompanyDto } from "./dto/update-company.dto"
import { CompanyFiltersDto } from "./dto/company-filters.dto"
import { AuthGuardMiddleware } from "../../middleware/auth-guard.middleware"

@Controller("companies")
@ApiTags("Companies")
export class CompanyController {
  constructor(private readonly companyService: CompanyService) {}

  @Post()
  createCompany(@Body() createCompanyDto: CreateCompanyDto) {
    return this.companyService.createCompany(createCompanyDto)
  }

  @Post("register")
  registerCompany(@Body() registerCompanyDto: RegisterCompanyDto) {
    return this.companyService.registerCompany(registerCompanyDto)
  }

  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @Get()
  findAll(@Query() filters: CompanyFiltersDto) {
    return this.companyService.findAll(filters)
  }

  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @ApiConsumes("multipart/form-data")
  @UseInterceptors(FileInterceptor("logo", logoConfig))
  @Post("settings/company-settings")
  saveCompanySettings(
    @Body() saveCompanySettingsDto: CreateCompanySettingDto,
    @UploadedFile() logo: Express.Multer.File,
    @Req() request: Request,
  ) {
    return this.companyService.saveCompanySettings(
      saveCompanySettingsDto,
      request.headers["authorization"],
      logo,
    )
  }

  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @Get("settings/company-settings")
  getCompanySettings(@Req() request: Request) {
    return this.companyService.getCompanySettings(
      request.headers["authorization"],
    )
  }

  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @Patch("active-inactive/:id")
  activeInactive(@Param("id") id: string, @Req() request: Request) {
    return this.companyService.activeInactive(
      +id,
      request.headers["authorization"],
    )
  }

  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @Get(":id")
  findOne(@Param("id") id: string) {
    return this.companyService.findOne(+id)
  }

  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @Put(":id")
  updateCompany(
    @Param("id") id: string,
    @Body() updateCompanyDto: UpdateCompanyDto,
    @Req() request: Request,
  ) {
    return this.companyService.updateCompany(
      +id,
      updateCompanyDto,
      request.headers["authorization"],
    )
  }

  @UseGuards(AuthGuardMiddleware)
  @ApiBearerAuth("access-token")
  @Delete(":id")
  deleteCompany(@Param("id") id: string, @Req() request: Request) {
    return this.companyService.deleteCompany(
      +id,
      request.headers["authorization"],
    )
  }
}
