package controller;

import java.io.IOException;
import java.sql.SQLException;
import java.util.List;
import javax.servlet.RequestDispatcher;
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 model.Subject;
import service.SubjectService;
import service.impl.SubjectServiceImpl;

//@WebServlet("/subject/*")
public class SubjectServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    private final SubjectService subjectService = new SubjectServiceImpl();
    private final service.FacultyService facultyService = new service.impl.FacultyServiceImpl();

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        doGet(request, response);
    }

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

        try {
            switch (action) {
                case "/new":
                    showNewForm(request, response);
                    break;
                case "/insert":
                    insertSubject(request, response);
                    break;
                case "/delete":
                    deleteSubject(request, response);
                    break;
                case "/edit":
                    showEditForm(request, response);
                    break;
                case "/update":
                    updateSubject(request, response);
                    break;
                case "/list":
                default:
                    listSubjects(request, response);
                    break;
            }
        } catch (SQLException e) {
            throw new ServletException("Database error in SubjectServlet", e);
        }
    }

    private void listSubjects(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        List<Subject> subjects = subjectService.getAllSubjects();
        request.setAttribute("listSubject", subjects);
        request.getRequestDispatcher("/pages/subject-list.jsp").forward(request, response);
    }

    private void showNewForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, SQLException {
        // 1. Fetch the list of faculties from the database
        List<model.Faculty> faculties = facultyService.getAllFaculty();

        // 2. Set it as an attribute named "listFaculty" (matching your c:forEach)
        request.setAttribute("listFaculty", faculties);

        // 3. Forward to the form
        request.getRequestDispatcher("/pages/subject-form.jsp").forward(request, response);
    }

    private void showEditForm(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        Long id = Long.parseLong(request.getParameter("id"));
        Subject subject = subjectService.getById(id);

        if (subject == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND, "Subject not found");
            return;
        }

        // 1. Fetch faculties so the dropdown appears
        List<model.Faculty> faculties = facultyService.getAllFaculty();

        // 2. Set both the subject and the faculty list
        request.setAttribute("subject", subject);
        request.setAttribute("listFaculty", faculties);

        request.setAttribute("subject", subject);
        request.getRequestDispatcher("/pages/subject-form.jsp").forward(request, response);
    }

    private void insertSubject(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        String name = request.getParameter("name");
        int semester = Integer.parseInt(request.getParameter("semester"));
        int credits = Integer.parseInt(request.getParameter("credits"));

        String facultyIdStr = request.getParameter("facultyid");
        Long facultyId = (facultyIdStr != null) ? Long.parseLong(facultyIdStr) : null;

        Subject subject = new Subject(null, name, semester, credits, facultyId);
        subjectService.save(subject);

        response.sendRedirect(request.getContextPath() + "/subject/list");
    }

    private void updateSubject(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Long id = Long.parseLong(request.getParameter("id"));
        String name = request.getParameter("name");
        int semester = Integer.parseInt(request.getParameter("semester"));
        int credits = Integer.parseInt(request.getParameter("credits"));

        String facultyIdStr = request.getParameter("facultyid");
        Long facultyId = (facultyIdStr != null) ? Long.parseLong(facultyIdStr) : null;

        Subject subject = new Subject(id, name, semester, credits, facultyId);
        subjectService.update(subject);

        response.sendRedirect(request.getContextPath() + "/subject/list");
    }

    private void deleteSubject(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Long id = Long.parseLong(request.getParameter("id"));
        subjectService.delete(id);
        response.sendRedirect(request.getContextPath() + "/subject/list");
    }
}