package controller;

import DAO.AdviceDAO;
import DAO.impl.AdviceDAOImpl;
import DAO.impl.StudentDAOImpl;
import DAO.impl.ProfessorDAOImpl;
import model.Advice;
import model.Student;
import model.Professor;

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

@WebServlet("/advice/*")
public class AdviceServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;
    private AdviceDAO adviceDAO;
    private StudentDAOImpl studentDAO;
    private ProfessorDAOImpl professorDAO;

    public void init() {
        adviceDAO = new AdviceDAOImpl();
        studentDAO = new StudentDAOImpl();
        professorDAO = new ProfessorDAOImpl();
    }

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

    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 "/insert":
                    insertAdvice(request, response);
                    break;
                case "/delete":
                    deleteAdvice(request, response);
                    break;
                case "/edit":
                    showEditForm(request, response);
                    break;
                case "/update":
                    updateAdvice(request, response);
                    break;
                default:
                    listAdvice(request, response);
                    break;
            }
        } catch (SQLException ex) {
            throw new ServletException(ex);
        }
    }

    private void listAdvice(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException, ServletException {
        List<Advice> listAdvice = adviceDAO.getAll();
        request.setAttribute("listAdvice", listAdvice);
        request.getRequestDispatcher("/pages/advice-list.jsp").forward(request, response);
    }

    private void showNewForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException, SQLException {
        // We need these lists to populate the dropdowns in the form
        List<Student> listStudents = studentDAO.getAll();
        List<Professor> listProfessors = professorDAO.getall();
        request.setAttribute("listStudents", listStudents);
        request.setAttribute("listProfessors", listProfessors);
        request.getRequestDispatcher("/pages/advice-form.jsp").forward(request, response);
    }

    private void showEditForm(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, ServletException, IOException {
        int studentId = Integer.parseInt(request.getParameter("studentId"));
        int professorId = Integer.parseInt(request.getParameter("professorId"));

        Advice existingAdvice = adviceDAO.getById(studentId, professorId);
        request.setAttribute("advice", existingAdvice);

        // Still need lists if we want to show who is being edited
        request.setAttribute("listStudents", studentDAO.getAll());
        request.setAttribute("listProfessors", professorDAO.getall());

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

    private void insertAdvice(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int studentId = Integer.parseInt(request.getParameter("studentId"));
        int professorId = Integer.parseInt(request.getParameter("professorId"));
        String startStr = request.getParameter("startDate");
        Date startDate;
        if (startStr == null || startStr.isEmpty()) {
            startDate = new Date(System.currentTimeMillis());
        } else {
            startDate = Date.valueOf(startStr);
        }
        String endStr = request.getParameter("endDate");
        Date endDate = (endStr != null && !endStr.isEmpty()) ? Date.valueOf(endStr) : null;

        Advice newAdvice = new Advice(studentId, professorId, startDate, endDate);
        adviceDAO.save(newAdvice);
        response.sendRedirect(request.getContextPath() + "/advice/list");
    }

    private void updateAdvice(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int studentId = Integer.parseInt(request.getParameter("studentId"));
        int professorId = Integer.parseInt(request.getParameter("professorId"));
        Date startDate = Date.valueOf(request.getParameter("startDate"));

        String endStr = request.getParameter("endDate");
        Date endDate = (endStr != null && !endStr.isEmpty()) ? Date.valueOf(endStr) : null;

        Advice advice = new Advice(studentId, professorId, startDate, endDate);
        adviceDAO.update(advice);
        response.sendRedirect(request.getContextPath() + "/advice/list");
    }

    private void deleteAdvice(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        int studentId = Integer.parseInt(request.getParameter("studentId"));
        int professorId = Integer.parseInt(request.getParameter("professorId"));
        adviceDAO.delete(studentId, professorId);
        response.sendRedirect(request.getContextPath() + "/advice/list");
    }
}