package ru.mcs.diary.group;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
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.dto.GroupCreateRequest;
import ru.mcs.diary.student.StudentService;
import ru.mcs.diary.subject.SubjectService;
@Controller
@RequestMapping("/groups")
@RequiredArgsConstructor
public class GroupController {
private final GroupService groupService;
private final SubjectService subjectService;
private final StudentService studentService;
@GetMapping
public String list(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("groups", groupService.getAllGroups(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "groups");
model.addAttribute("pageTitle", "Группы");
return "group/list";
}
@GetMapping("/new")
public String createForm(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("request", new GroupCreateRequest());
model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "groups");
model.addAttribute("pageTitle", "Новая группа");
return "group/form";
}
@PostMapping("/new")
public String create(@Valid @ModelAttribute("request") GroupCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "groups");
model.addAttribute("pageTitle", "Новая группа");
return "group/form";
}
try {
StudyGroup group = groupService.createGroup(request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Группа создана");
return "redirect:/groups/" + group.getId();
} catch (Exception e) {
model.addAttribute("error", e.getMessage());
model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "groups");
model.addAttribute("pageTitle", "Новая группа");
return "group/form";
}
}
@GetMapping("/{id}")
public String view(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
Model model) {
StudyGroup group = groupService.getGroupWithStudents(id, user.getTeacherId());
model.addAttribute("group", group);
model.addAttribute("availableStudents", studentService.getAllStudents(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "groups");
model.addAttribute("pageTitle", group.getName());
return "group/view";
}
@GetMapping("/{id}/edit")
public String editForm(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
Model model) {
StudyGroup group = groupService.getGroup(id, user.getTeacherId());
GroupCreateRequest request = new GroupCreateRequest();
request.setId(group.getId());
request.setName(group.getName());
request.setSubjectId(group.getSubject() != null ? group.getSubject().getId() : null);
request.setPricePerLesson(group.getPricePerLesson());
request.setDescription(group.getDescription());
model.addAttribute("request", request);
model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "groups");
model.addAttribute("pageTitle", "Редактировать группу");
return "group/form";
}
@PostMapping("/{id}/edit")
public String update(@PathVariable Long id,
@Valid @ModelAttribute("request") GroupCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
request.setId(id);
model.addAttribute("subjects", subjectService.getAllSubjects(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "groups");
model.addAttribute("pageTitle", "Редактировать группу");
return "group/form";
}
groupService.updateGroup(id, request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Изменения сохранены");
return "redirect:/groups/" + id;
}
@PostMapping("/{id}/delete")
public String delete(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
groupService.deleteGroup(id, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Группа удалена");
return "redirect:/groups";
}
@PostMapping("/{id}/add-student")
public String addStudent(@PathVariable Long id,
@RequestParam Long studentId,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
try {
groupService.addStudent(id, studentId, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Ученик добавлен в группу");
} catch (IllegalArgumentException e) {
redirectAttributes.addFlashAttribute("error", e.getMessage());
}
return "redirect:/groups/" + id;
}
@PostMapping("/{groupId}/remove-student/{studentId}")
public String removeStudent(@PathVariable Long groupId,
@PathVariable Long studentId,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
groupService.removeStudent(groupId, studentId, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Ученик удалён из группы");
return "redirect:/groups/" + groupId;
}
}