import {
  BadRequestException,
  Body,
  Controller,
  Delete,
  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 { CreateReportDto } from './dto/create-report.dto';
import { ListReportsQueryDto } from './dto/list-reports-query.dto';
import { UpdateReportDto } from './dto/update-report.dto';
import { ReportsService } from './reports.service';

@Controller('reports')
@Roles(UserRole.seo_manager)
export class ReportsController {
  constructor(private readonly reportsService: ReportsService) {}

  @Get('booked-periods')
  getBookedPeriods(
    @Query('clientId') clientId: string,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    if (!clientId) throw new BadRequestException('clientId is required');
    return this.reportsService.getBookedPeriods(clientId, req.user.id, true);
  }

  @Get('admin/booked-periods')
  @Roles(UserRole.super_admin)
  getBookedPeriodsForAdmin(@Query('clientId') clientId: string) {
    if (!clientId) throw new BadRequestException('clientId is required');
    return this.reportsService.getBookedPeriodsForAdmin(clientId);
  }

  @Get()
  list(
    @Query() query: ListReportsQueryDto,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.list(req.user.id, query);
  }

  @Get('admin')
  @Roles(UserRole.super_admin)
  listForAdmin(@Query() query: ListReportsQueryDto) {
    return this.reportsService.listForAdmin(query);
  }
  @Post()
  create(
    @Body() dto: CreateReportDto,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.create(dto, req.user.id);
  }

  @Post('admin')
  @Roles(UserRole.super_admin)
  createForAdmin(
    @Body() dto: CreateReportDto,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.createForAdmin(dto, req.user.id);
  }
  @Patch(':id')
  update(
    @Param('id') id: string,
    @Body() dto: UpdateReportDto,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.update(id, dto, req.user.id);
  }

  @Patch('admin/:id')
  @Roles(UserRole.super_admin)
  updateForAdmin(
    @Param('id') id: string,
    @Body() dto: UpdateReportDto,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.updateForAdmin(id, dto, req.user.id);
  }

  @Delete(':id')
  remove(
    @Param('id') id: string,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.softDelete(id, req.user.id);
  }

  @Delete('admin/:id')
  @Roles(UserRole.super_admin)
  removeForAdmin(
    @Param('id') id: string,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.softDeleteForAdmin(id, req.user.id);
  }

  @Patch(':id/restore')
  restore(
    @Param('id') id: string,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.restore(id, req.user.id);
  }

  @Patch('admin/:id/restore')
  @Roles(UserRole.super_admin)
  restoreForAdmin(
    @Param('id') id: string,
    @Req() req: Request & { user: AuthRequestUser },
  ) {
    return this.reportsService.restoreForAdmin(id, req.user.id);
  }
}
