Newer
Older
teacher-diary / src / main / java / ru / mcs / diary / lesson / LessonController.java
package ru.mcs.diary.lesson;

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import ru.mcs.diary.auth.CurrentUser;
import ru.mcs.diary.auth.CustomUserDetails;
import ru.mcs.diary.group.GroupService;
import ru.mcs.diary.lesson.dto.LessonCreateRequest;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.Locale;

@Controller
@RequestMapping("/schedule")
@RequiredArgsConstructor
public class LessonController {

    private final LessonService lessonService;
    private final GroupService groupService;

    private static final DateTimeFormatter DAY_FORMATTER = DateTimeFormatter.ofPattern("EEEE, d MMMM", new Locale("ru"));

    @GetMapping
    public String schedule(@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
                           @CurrentUser CustomUserDetails user,
                           Model model) {
        LocalDate currentDate = date != null ? date : LocalDate.now();
        LocalDate weekStart = lessonService.getWeekStart(currentDate);

        model.addAttribute("weekStart", weekStart);
        model.addAttribute("weekEnd", weekStart.plusDays(6));
        model.addAttribute("prevWeek", weekStart.minusWeeks(1));
        model.addAttribute("nextWeek", weekStart.plusWeeks(1));
        model.addAttribute("today", LocalDate.now());
        model.addAttribute("weekLessons", lessonService.getWeekLessons(user.getTeacherId(), weekStart));
        model.addAttribute("dayFormatter", DAY_FORMATTER);
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "schedule");
        model.addAttribute("pageTitle", "Расписание");

        return "schedule/index";
    }

    @GetMapping("/new")
    public String createForm(@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date,
                             @CurrentUser CustomUserDetails user,
                             Model model) {
        LessonCreateRequest request = new LessonCreateRequest();
        request.setDate(date != null ? date : LocalDate.now());

        model.addAttribute("request", request);
        model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "schedule");
        model.addAttribute("pageTitle", "Новое занятие");
        return "schedule/form";
    }

    @PostMapping("/new")
    public String create(@Valid @ModelAttribute("request") LessonCreateRequest request,
                         BindingResult bindingResult,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes,
                         Model model) {
        if (bindingResult.hasErrors()) {
            model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "schedule");
            model.addAttribute("pageTitle", "Новое занятие");
            return "schedule/form";
        }

        try {
            Lesson lesson = lessonService.createLesson(request, user.getTeacherId());
            redirectAttributes.addFlashAttribute("success", "Занятие добавлено");
            return "redirect:/schedule?date=" + lesson.getDate();
        } catch (IllegalArgumentException e) {
            model.addAttribute("error", e.getMessage());
            model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "schedule");
            model.addAttribute("pageTitle", "Новое занятие");
            return "schedule/form";
        }
    }

    @GetMapping("/{id}")
    public String view(@PathVariable Long id,
                       @CurrentUser CustomUserDetails user,
                       Model model) {
        Lesson lesson = lessonService.getLessonWithDetails(id, user.getTeacherId());
        model.addAttribute("lesson", lesson);
        model.addAttribute("statuses", LessonStatus.values());
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "schedule");
        model.addAttribute("pageTitle", "Занятие");
        return "schedule/view";
    }

    @GetMapping("/{id}/edit")
    public String editForm(@PathVariable Long id,
                           @CurrentUser CustomUserDetails user,
                           Model model) {
        Lesson lesson = lessonService.getLesson(id, user.getTeacherId());

        LessonCreateRequest request = new LessonCreateRequest();
        request.setId(lesson.getId());
        request.setGroupId(lesson.getGroup().getId());
        request.setDate(lesson.getDate());
        request.setStartTime(lesson.getStartTime());
        request.setEndTime(lesson.getEndTime());
        request.setTopic(lesson.getTopic());
        request.setHomework(lesson.getHomework());
        request.setNotes(lesson.getNotes());
        request.setStatus(lesson.getStatus());

        model.addAttribute("request", request);
        model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
        model.addAttribute("statuses", LessonStatus.values());
        model.addAttribute("user", user);
        model.addAttribute("activeMenu", "schedule");
        model.addAttribute("pageTitle", "Редактировать занятие");
        return "schedule/form";
    }

    @PostMapping("/{id}/edit")
    public String update(@PathVariable Long id,
                         @Valid @ModelAttribute("request") LessonCreateRequest request,
                         BindingResult bindingResult,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes,
                         Model model) {
        if (bindingResult.hasErrors()) {
            request.setId(id);
            model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
            model.addAttribute("statuses", LessonStatus.values());
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "schedule");
            model.addAttribute("pageTitle", "Редактировать занятие");
            return "schedule/form";
        }

        try {
            lessonService.updateLesson(id, request, user.getTeacherId());
            redirectAttributes.addFlashAttribute("success", "Изменения сохранены");
            return "redirect:/schedule/" + id;
        } catch (IllegalArgumentException e) {
            request.setId(id);
            model.addAttribute("error", e.getMessage());
            model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
            model.addAttribute("statuses", LessonStatus.values());
            model.addAttribute("user", user);
            model.addAttribute("activeMenu", "schedule");
            model.addAttribute("pageTitle", "Редактировать занятие");
            return "schedule/form";
        }
    }

    @PostMapping("/{id}/status")
    public String updateStatus(@PathVariable Long id,
                               @RequestParam LessonStatus status,
                               @CurrentUser CustomUserDetails user,
                               RedirectAttributes redirectAttributes) {
        lessonService.updateStatus(id, status, user.getTeacherId());
        redirectAttributes.addFlashAttribute("success", "Статус обновлён");
        return "redirect:/schedule/" + id;
    }

    @PostMapping("/{id}/delete")
    public String delete(@PathVariable Long id,
                         @CurrentUser CustomUserDetails user,
                         RedirectAttributes redirectAttributes) {
        Lesson lesson = lessonService.getLesson(id, user.getTeacherId());
        LocalDate date = lesson.getDate();
        lessonService.deleteLesson(id, user.getTeacherId());
        redirectAttributes.addFlashAttribute("success", "Занятие удалено");
        return "redirect:/schedule?date=" + date;
    }
}