package ru.mcs.diary.student;
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.parent.ParentService;
import ru.mcs.diary.parent.ParentType;
import ru.mcs.diary.student.dto.StudentCreateRequest;
@Controller
@RequestMapping("/students")
@RequiredArgsConstructor
public class StudentController {
private final StudentService studentService;
private final ParentService parentService;
@GetMapping
public String list(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("students", studentService.getAllStudents(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "students");
model.addAttribute("pageTitle", "Ученики");
return "student/list";
}
@GetMapping("/new")
public String createForm(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("request", new StudentCreateRequest());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "students");
model.addAttribute("pageTitle", "Новый ученик");
return "student/form";
}
@PostMapping("/new")
public String create(@Valid @ModelAttribute("request") StudentCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
model.addAttribute("user", user);
model.addAttribute("activeMenu", "students");
model.addAttribute("pageTitle", "Новый ученик");
return "student/form";
}
try {
Student student = studentService.createStudent(request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Ученик успешно добавлен");
return "redirect:/students/" + student.getId();
} catch (Exception e) {
model.addAttribute("error", e.getMessage());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "students");
model.addAttribute("pageTitle", "Новый ученик");
return "student/form";
}
}
@GetMapping("/{id}")
public String view(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
Model model) {
Student student = studentService.getStudentWithParents(id, user.getTeacherId());
model.addAttribute("student", student);
model.addAttribute("parents", parentService.getAllParents(user.getTeacherId()));
model.addAttribute("parentTypes", ParentType.values());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "students");
model.addAttribute("pageTitle", student.getFullName());
return "student/view";
}
@GetMapping("/{id}/edit")
public String editForm(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
Model model) {
Student student = studentService.getStudent(id, user.getTeacherId());
StudentCreateRequest request = new StudentCreateRequest();
request.setId(student.getId());
request.setLastName(student.getLastName());
request.setFirstName(student.getFirstName());
request.setPatronymic(student.getPatronymic());
request.setPhone(student.getPhone());
request.setBirthDate(student.getBirthDate());
request.setNotes(student.getNotes());
model.addAttribute("request", request);
model.addAttribute("user", user);
model.addAttribute("activeMenu", "students");
model.addAttribute("pageTitle", "Редактировать ученика");
return "student/form";
}
@PostMapping("/{id}/edit")
public String update(@PathVariable Long id,
@Valid @ModelAttribute("request") StudentCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
request.setId(id);
model.addAttribute("user", user);
model.addAttribute("activeMenu", "students");
model.addAttribute("pageTitle", "Редактировать ученика");
return "student/form";
}
studentService.updateStudent(id, request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Изменения сохранены");
return "redirect:/students/" + id;
}
@PostMapping("/{id}/delete")
public String delete(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
studentService.deleteStudent(id, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Ученик удалён");
return "redirect:/students";
}
@PostMapping("/{id}/link-parent")
public String linkParent(@PathVariable Long id,
@RequestParam Long parentId,
@RequestParam ParentType parentType,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
try {
studentService.linkParent(id, parentId, parentType, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Родитель привязан");
} catch (IllegalArgumentException e) {
redirectAttributes.addFlashAttribute("error", e.getMessage());
}
return "redirect:/students/" + id;
}
@PostMapping("/{studentId}/unlink-parent/{parentId}")
public String unlinkParent(@PathVariable Long studentId,
@PathVariable Long parentId,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
studentService.unlinkParent(studentId, parentId, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Связь с родителем удалена");
return "redirect:/students/" + studentId;
}
}