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;
}
}