import {
  Body,
  Controller,
  Get,
  Param,
  Patch,
  Post,
  Query,
  Req,
} from '@nestjs/common';
import type { Request } from 'express';
import { Roles } from '../../common/auth/roles.decorator';
import { UserRole } from '../../generated/prisma/enums';
import { AuthRequestUser } from '../auth/interfaces/auth-request-user.interface';
import { CreateKeywordDto } from './dto/create-keyword.dto';
import { BulkCreateKeywordsDto } from './dto/bulk-create-keywords.dto';
import { UpdateKeywordDto } from './dto/update-keyword.dto';
import { KeywordsService } from './keywords.service';

@Controller()
export class KeywordsController {
  constructor(private readonly keywordsService: KeywordsService) {}

  @Get('keywords')
  @Roles(UserRole.super_admin, UserRole.seo_manager)
  listKeywords(
    @Req() request: Request & { user: AuthRequestUser },
    @Query('clientId') clientId?: string,
    @Query('search') search?: string,
    @Query('page') page?: string,
    @Query('limit') limit?: string,
  ) {
    return this.keywordsService.listAllKeywords({
      clientId,
      search,
      page: page ? parseInt(page, 10) : undefined,
      limit: limit ? parseInt(limit, 10) : undefined,
    }, request.user.role === UserRole.seo_manager ? request.user.id : undefined);
  }

  @Get('clients/:clientId/keywords')
  @Roles(UserRole.super_admin, UserRole.seo_manager)
  listClientKeywords(
    @Param('clientId') clientId: string,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.keywordsService.listClientKeywords(
      clientId,
      request.user.role === UserRole.seo_manager ? request.user.id : undefined,
    );
  }

  @Post('clients/:clientId/keywords')
  @Roles(UserRole.super_admin, UserRole.seo_manager)
  createKeyword(
    @Param('clientId') clientId: string,
    @Body() dto: CreateKeywordDto,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.keywordsService.createKeyword(
      clientId,
      dto,
      request.user?.id,
      request.user.role === UserRole.seo_manager ? request.user.id : undefined,
    );
  }

  @Post('clients/:clientId/keywords/bulk')
  @Roles(UserRole.super_admin, UserRole.seo_manager)
  bulkCreateKeywords(
    @Param('clientId') clientId: string,
    @Body() dto: BulkCreateKeywordsDto,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.keywordsService.bulkCreateKeywords(
      clientId,
      dto,
      request.user?.id,
      request.user.role === UserRole.seo_manager ? request.user.id : undefined,
    );
  }

  @Patch('keywords/:id')
  @Roles(UserRole.super_admin, UserRole.seo_manager)
  updateKeyword(
    @Param('id') id: string,
    @Body() dto: UpdateKeywordDto,
    @Req() request: Request & { user: AuthRequestUser },
  ) {
    return this.keywordsService.updateKeyword(
      id,
      dto,
      request.user?.id,
      request.user.role === UserRole.seo_manager ? request.user.id : undefined,
    );
  }
}
