// feedback/feedback.controller.ts
import {
  Controller,
  Post,
  Patch,
  Delete,
  Get,
  Param,
  Body,
  Query,
  UseGuards,
  Req,
  ParseIntPipe,
} from '@nestjs/common';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { Roles } from '../auth/roles.decorator';
import { RolesGuard } from '../auth/roles.guard';
import { FeedbackService } from './feedback.service';
import { CreateFeedbackDto } from './dto/create-feedback.dto';
import { UpdateFeedbackDto } from './dto/update-feedback.dto';

@Controller('courses/:courseId/feedback')
export class FeedbackController {
  constructor(private service: FeedbackService) {}

  // Public list
  @Get()
  list(
    @Param('courseId', ParseIntPipe) courseId: number,
    @Query('skip') skip = '0',
    @Query('take') take = '1000',
  ) {
    return this.service.listPublic(courseId, Number(skip), Number(take));
  }

  // Learner creates/updates/deletes their feedback
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles('learner', 'admin')
  @Post()
  create(
    @Req() req,
    @Param('courseId', ParseIntPipe) courseId: number,
    @Body() dto: CreateFeedbackDto,
  ) {
    return this.service.create(req.user.id, courseId, dto);
  }

  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles('learner', 'admin')
  @Patch(':id')
  update(
    @Req() req,
    @Param('courseId', ParseIntPipe) courseId: number,
    @Param('id', ParseIntPipe) id: number,
    @Body() dto: UpdateFeedbackDto,
  ) {
    const isAdminOrTrainer = ['trainer', 'admin'].includes(req.user.role);
    return this.service.update(
      req.user.id,
      courseId,
      id,
      dto,
      isAdminOrTrainer,
    );
  }

  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles('learner', 'admin')
  @Delete(':id')
  remove(
    @Req() req,
    @Param('courseId', ParseIntPipe) courseId: number,
    @Param('id', ParseIntPipe) id: number,
  ) {
    const isAdminOrTrainer = ['trainer', 'admin'].includes(req.user.role);
    return this.service.remove(req.user.id, courseId, id, isAdminOrTrainer);
  }
}
