package ru.mcs.diary.parent;
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.dto.ParentCreateRequest;
import ru.mcs.diary.student.StudentParentRepository;
@Controller
@RequestMapping("/parents")
@RequiredArgsConstructor
public class ParentController {
private final ParentService parentService;
private final StudentParentRepository studentParentRepository;
@GetMapping
public String list(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("parents", parentService.getAllParents(user.getTeacherId()));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", "Родители");
return "parent/list";
}
@GetMapping("/new")
public String createForm(@CurrentUser CustomUserDetails user, Model model) {
model.addAttribute("request", new ParentCreateRequest());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", "Новый родитель");
return "parent/form";
}
@PostMapping("/new")
public String create(@Valid @ModelAttribute("request") ParentCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", "Новый родитель");
return "parent/form";
}
try {
Parent parent = parentService.createParent(request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Родитель добавлен");
return "redirect:/parents/" + parent.getId();
} catch (IllegalArgumentException e) {
model.addAttribute("error", e.getMessage());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", "Новый родитель");
return "parent/form";
}
}
@GetMapping("/{id}")
public String view(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
Model model) {
Parent parent = parentService.getParent(id, user.getTeacherId());
model.addAttribute("parent", parent);
model.addAttribute("children", studentParentRepository.findAllByParentId(id));
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", parent.getFullName());
return "parent/view";
}
@GetMapping("/{id}/edit")
public String editForm(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
Model model) {
Parent parent = parentService.getParent(id, user.getTeacherId());
ParentCreateRequest request = new ParentCreateRequest();
request.setId(parent.getId());
request.setLastName(parent.getLastName());
request.setFirstName(parent.getFirstName());
request.setPatronymic(parent.getPatronymic());
request.setEmail(parent.getEmail());
request.setPhone(parent.getPhone());
model.addAttribute("request", request);
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", "Редактировать");
return "parent/form";
}
@PostMapping("/{id}/edit")
public String update(@PathVariable Long id,
@Valid @ModelAttribute("request") ParentCreateRequest request,
BindingResult bindingResult,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes,
Model model) {
if (bindingResult.hasErrors()) {
request.setId(id);
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", "Редактировать");
return "parent/form";
}
try {
parentService.updateParent(id, request, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Изменения сохранены");
return "redirect:/parents/" + id;
} catch (IllegalArgumentException e) {
request.setId(id);
model.addAttribute("error", e.getMessage());
model.addAttribute("user", user);
model.addAttribute("activeMenu", "parents");
model.addAttribute("pageTitle", "Редактировать");
return "parent/form";
}
}
@PostMapping("/{id}/delete")
public String delete(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
parentService.deleteParent(id, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Родитель удалён");
return "redirect:/parents";
}
@PostMapping("/{id}/send-invite")
public String sendInvite(@PathVariable Long id,
@CurrentUser CustomUserDetails user,
RedirectAttributes redirectAttributes) {
try {
parentService.sendInvite(id, user.getTeacherId());
redirectAttributes.addFlashAttribute("success", "Приглашение отправлено");
} catch (Exception e) {
redirectAttributes.addFlashAttribute("error", "Ошибка отправки: " + e.getMessage());
}
return "redirect:/parents/" + id;
}
}