package controller;

import DAO.impl.StudentSubjectDAOImpl;
import model.StudentSubject;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.List;

@WebServlet("/enrollment/*")
public class StudentSubjectServlet extends HttpServlet {
    private final StudentSubjectDAOImpl dao = new StudentSubjectDAOImpl();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getPathInfo();
        try {
            switch (action) {
                case "/insert":
                    insertEnrollment(request, response);
                    break;
                case "/update":
                    updateEnrollment(request, response);
                    break;
            }
        } catch (SQLException e) {
            throw new ServletException(e);
        }
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String action = request.getPathInfo();
        if (action == null) action = "/list";

        try {
            switch (action) {
                case "/new":
                    showNewForm(request, response);
                    break;
                case "/edit":
                    showEditForm(request, response);
                    break;
                case "/delete":
                    deleteEnrollment(request, response);
                    break;
                case "/list":
                default:
                    listEnrollments(request, response);
                    break;
            }
        } catch (SQLException e) {
            throw new ServletException(e);
        }
    }

    private void listEnrollments(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        List<StudentSubject> list = dao.getAll();
        request.setAttribute("enrollments", list);
        request.getRequestDispatcher("/pages/enrollment-list.jsp").forward(request, response);
    }

    private void showNewForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Just forward to form; fields will be empty/default
        request.getRequestDispatcher("/pages/enrollment-form.jsp").forward(request, response);
    }

    private void showEditForm(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        Long ss_id = Long.parseLong(request.getParameter("ss_id"));
        StudentSubject existing = dao.getById(ss_id);
        request.setAttribute("enrollment", existing);
        request.getRequestDispatcher("/pages/enrollment-form.jsp").forward(request, response);
    }

    private void insertEnrollment(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Long student_id = Long.parseLong(request.getParameter("student_id"));
        Long subject_id = Long.parseLong(request.getParameter("subject_id"));
        int absences = Integer.parseInt(request.getParameter("absences_count"));

        StudentSubject ss = new StudentSubject(student_id, subject_id, LocalDate.now(), absences, "ENROLLED");
        dao.save(ss);
        response.sendRedirect(request.getContextPath() + "/enrollment/list");
    }

    private void updateEnrollment(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Long ss_id = Long.parseLong(request.getParameter("ss_id"));
        String status = request.getParameter("status");
        int absences = Integer.parseInt(request.getParameter("absences_count"));

        String gradeStr = request.getParameter("final_grade");
        Integer final_grade = (gradeStr != null && !gradeStr.isEmpty()) ? Integer.parseInt(gradeStr) : null;

        StudentSubject ss = new StudentSubject();
        ss.setSs_id(ss_id);
        ss.setStatus(status);
        ss.setAbsences_count(absences);
        ss.setFinal_grade(final_grade);

        dao.update(ss);
        response.sendRedirect(request.getContextPath() + "/enrollment/list");
    }

    private void deleteEnrollment(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Long ss_id = Long.parseLong(request.getParameter("ss_id"));
        dao.delete(ss_id);
        response.sendRedirect(request.getContextPath() + "/enrollment/list");
    }
}