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