import {
  Body,
  Controller,
  Delete,
  Get,
  Param,
  Patch,
  Post,
  UseGuards,
} from '@nestjs/common';
import { CurrentUser } from '../../common/decorators/current-user.decorator';
import { Roles } from '../../common/decorators/roles.decorator';
import { JwtAuthGuard } from '../../common/guards/jwt-auth.guard';
import { RolesGuard } from '../../common/guards/roles.guard';
import type { AuthUser } from '../../common/types/auth-user.type';
import { ContractsService } from './contracts.service';
import { CreateContractDto } from './dto/create-contract.dto';
import { UpdateContractDto } from './dto/update-contract.dto';
import { ContractPrintType } from './entities/contract.entity';

@UseGuards(JwtAuthGuard, RolesGuard)
@Roles('super_admin', 'agency_manager', 'agent')
@Controller('contracts')
export class ContractsController {
  constructor(private readonly contractsService: ContractsService) {}

  @Post()
  @Roles('super_admin', 'agency_manager')
  create(
    @Body() data: CreateContractDto,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.createForUser(data, user);
  }

  @Get()
  findAll(@CurrentUser() user: AuthUser) {
    return this.contractsService.findAllForUser(user);
  }

  @Get('dashboard/widgets')
  dashboardWidgets(@CurrentUser() user: AuthUser) {
    return this.contractsService.dashboardWidgets(user);
  }

  @Get(':id')
  findOne(
    @Param('id') id: string,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.findOneForUser(Number(id), user);
  }

  @Patch(':id')
  @Roles('super_admin', 'agency_manager')
  update(
    @Param('id') id: string,
    @Body() data: UpdateContractDto,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.updateForUser(Number(id), data, user);
  }

  @Post(':id/pdf')
  @Roles('super_admin', 'agency_manager')
  generatePdf(
    @Param('id') id: string,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.generatePdfForUser(Number(id), user);
  }

  @Post(':id/sign')
  @Roles('super_admin', 'agency_manager', 'agent')
  sign(
    @Param('id') id: string,
    @Body('signatureUrl') signatureUrl: string,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.signForUser(
      Number(id),
      user,
      signatureUrl,
    );
  }

  @Post(':id/print')
  @Roles('super_admin', 'agency_manager', 'agent')
  preparePrint(
    @Param('id') id: string,
    @Body('printType') printType: ContractPrintType,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.preparePrintForUser(
      Number(id),
      user,
      printType,
    );
  }

  @Post(':id/ocr')
  @Roles('super_admin', 'agency_manager')
  processOcr(
    @Param('id') id: string,
    @Body('ocrData') ocrData: Record<string, any>,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.processOcrForUser(
      Number(id),
      user,
      ocrData,
    );
  }

  @Post(':id/ai-review')
  @Roles('super_admin', 'agency_manager')
  aiReview(
    @Param('id') id: string,
    @Body('aiReview') aiReview: Record<string, any>,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.aiReviewForUser(
      Number(id),
      user,
      aiReview,
    );
  }

  @Patch(':id/archive')
  @Roles('super_admin', 'agency_manager')
  archive(
    @Param('id') id: string,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.archiveForUser(Number(id), user);
  }

  @Delete(':id')
  @Roles('super_admin', 'agency_manager')
  remove(
    @Param('id') id: string,
    @CurrentUser() user: AuthUser,
  ) {
    return this.contractsService.removeForUser(Number(id), user);
  }
}