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

@Controller('feedback')
export class FeedbackController {
  constructor(private readonly feedbackService: FeedbackService) {}

  // Feedback einreichen (nur von Schülern)
  @Post()
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Student'])
  create(@Body() createFeedbackDto: CreateFeedbackDto) {
    return this.feedbackService.create(createFeedbackDto);
  }
  @Get()
  getChatInfo() :object {
    return{
      message: 'Feedback API is running'
    }
  }

  // Alle Feedbacks abrufen - NUR FÜR DEN EINGELOGGTEN LEHRER
  @Get('all')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  findAll(@Req() req: Request) {
    const user = req.user as any;
    const teacherId = Number(user.id);
    if (isNaN(teacherId)) {
      throw new BadRequestException('Ungültige Lehrer-ID');
    }
    return this.feedbackService.findByTeacher(teacherId);
  }

  // Einzelnes Feedback abrufen - NUR FÜR LEHRER
  @Get(':id')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  findOne(@Param('id') id: string) {
    return this.feedbackService.findOne(id);
  }

  // Feedbacks nach Lehrer-ID - NUR FÜR LEHRER
  @Get('teacher/:teacherId')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  findByTeacher(@Param('teacherId') teacherId: string) {
    const id = parseInt(teacherId);
    if (isNaN(id)) {
      throw new BadRequestException('Ungültige Lehrer-ID');
    }
    return this.feedbackService.findByTeacher(id);
  }

  // Feedbacks nach Schüler-ID - Authentifizierung erforderlich
  @Get('student/:studentId')
  @UseGuards(JwtAuthGuard)
  findByStudent(@Param('studentId') studentId: string) {
    const id = parseInt(studentId);
    if (isNaN(id)) {
      throw new BadRequestException('Ungültige Schüler-ID');
    }
    return this.feedbackService.findByStudent(id);
  }

  // Feedbacks nach Unterrichtsstunden-ID - Authentifizierung erforderlich
  @Get('lesson/:lessonId')
  @UseGuards(JwtAuthGuard)
  findByLesson(@Param('lessonId') lessonId: string) {
    const id = parseInt(lessonId);
    if (isNaN(id)) {
      throw new BadRequestException('Ungültige Unterrichtsstunden-ID');
    }
    return this.feedbackService.findByLesson(id);
  }

  // Statistiken für einen Lehrer - NUR FÜR LEHRER
  @Get('statistics/teacher/:teacherId')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  getTeacherStatistics(@Param('teacherId') teacherId: string) {
    const id = parseInt(teacherId);
    if (isNaN(id)) {
      throw new BadRequestException('Ungültige Lehrer-ID');
    }
    return this.feedbackService.getTeacherStatistics(id);
  }

  // Statistiken für eine Unterrichtsstunde - NUR FÜR LEHRER
  @Get('statistics/lesson/:lessonId')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  getLessonStatistics(@Param('lessonId') lessonId: string) {
    const id = parseInt(lessonId);
    if (isNaN(id)) {
      throw new BadRequestException('Ungültige Unterrichtsstunden-ID');
    }
    return this.feedbackService.getLessonStatistics(id);
  }

  // Lehrer antwortet auf Feedback - NUR FÜR LEHRER
  @Post(':id/response')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  addTeacherResponse(
    @Param('id') id: string,
    @Body() body: { response: string },
  ) {
    return this.feedbackService.addTeacherResponse(id, body.response);
  }

  // Feedback aktualisieren - NUR FÜR LEHRER
  @Patch(':id')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  update(@Param('id') id: string, @Body() updateFeedbackDto: UpdateFeedbackDto) {
    return this.feedbackService.update(id, updateFeedbackDto);
  }

  // Feedback löschen - NUR FÜR LEHRER
  @Delete(':id')
  @UseGuards(JwtAuthGuard, RolesGuard)
  @Roles(['Lehrer'])
  async remove(@Param('id') id: string) {
    await this.feedbackService.remove(id);
    return { success: true, message: 'Feedback erfolgreich gelöscht' };
  }
}
