package controller;

import model.Professor;
import model.Faculty;
import model.Subject;
import model.University;
import service.ProfessorService;
import service.FacultyService;
import service.SubjectService;
import service.UniversityService;
import service.impl.ProfessorServiceImpl;
import service.impl.FacultyServiceImpl;
import service.impl.SubjectServiceImpl;
import service.impl.UniversityServiceImpl;

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 java.io.IOException;
import java.sql.SQLException;
import java.util.List;

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

    private final ProfessorService professorService = new ProfessorServiceImpl();
    private final SubjectService subjectService = new SubjectServiceImpl();
    private final service.ProfessorSubjectService profSubService = new service.impl.ProfessorSubjectServiceImpl();    private final FacultyService facultyService = new FacultyServiceImpl();
    private final UniversityService universityService = new UniversityServiceImpl();

    @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":
                    insertProfessor(request, response);
                    break;
                case "/delete":
                    deleteProfessor(request, response);
                    break;
                case "/edit":
                    showEditForm(request, response);
                    break;
                case "/update":
                    updateProfessor(request, response);
                    break;
                case "/list":
                default:
                    listProfessor(request, response);
                    break;
            }
        } catch (SQLException e) {
            throw new ServletException("Database error in ProfessorServlet", e);
        }
    }

    private void listProfessor(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, SQLException {
        List<Professor> professors = professorService.getAllProfessors();
        request.setAttribute("listProfessor", professors);
        request.getRequestDispatcher("/pages/professor-list.jsp").forward(request, response);
    }

    private void showNewForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, SQLException {
        List<Faculty> faculties = facultyService.getAllFaculty();
        List<University> universities = universityService.getAllUniversities();
        request.setAttribute("faculties", faculties);
        request.setAttribute("universities", universities);
        request.getRequestDispatcher("/pages/professor-form.jsp").forward(request, response);
    }

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

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

        List<Subject> taughtSubjects = profSubService.getSubjectsForProfessor(id);
        List<Subject> allSubjects = subjectService.getAllSubjects();
        List<Faculty> faculties = facultyService.getAllFaculty();
        List<University> universities = universityService.getAllUniversities();
        request.setAttribute("professor", existingProfessor);
        request.setAttribute("taughtSubjects", taughtSubjects);
        request.setAttribute("allSubjectsList", allSubjects);
        request.setAttribute("faculties", faculties);
        request.setAttribute("universities", universities);
        request.getRequestDispatcher("/pages/professor-form.jsp").forward(request, response);
    }

    private void insertProfessor(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Professor professor = parseProfessorFromRequest(request);
        professorService.save(professor);

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

    private void updateProfessor(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Long id = Long.parseLong(request.getParameter("id"));
        Professor professor = parseProfessorFromRequest(request);
        professor.setId(id);
        professorService.update(professor);
        response.sendRedirect(request.getContextPath() + "/professor/list");
    }

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

    private Professor parseProfessorFromRequest(HttpServletRequest request) {
        String name = request.getParameter("name");
        String surname = request.getParameter("surname");
        int age = Integer.parseInt(request.getParameter("age"));
        long facultyid = Long.parseLong(request.getParameter("facultyid"));
        String universityIdStr = request.getParameter("universityId");

        University university = new University();
        if (universityIdStr != null && !universityIdStr.isEmpty()) {
            university.setId(Long.parseLong(universityIdStr));
        }
        return new Professor(null, name, surname, age, facultyid, university);
    }
}