package controller;

import model.Faculty;
import model.Student;
import model.Subject;
import service.FacultyService;
import service.ProfessorService;
import service.StudentService;
import service.SubjectService;
import service.impl.FacultyServiceImpl;
import service.impl.ProfessorServiceImpl;
import service.impl.StudentServiceImpl;
import service.impl.SubjectServiceImpl;

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.*;
import java.util.stream.Collectors;

//@WebServlet("/student/*")
public class StudentServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    private final StudentService studentService = new StudentServiceImpl();
    private final FacultyService facultyService = new FacultyServiceImpl();
    private final ProfessorService professorService = new ProfessorServiceImpl();
    private final SubjectService subjectService = new SubjectServiceImpl();

    @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":
                    insertStudent(request, response);
                    break;
                case "/delete":
                    deleteStudent(request, response);
                    break;
                case "/edit":
                    showEditForm(request, response);
                    break;
                case "/update":
                    updateStudent(request, response);
                    break;
                case "/list":
                default:
                    listStudent(request, response);
                    break;
            }
        } catch (SQLException ex) {
            throw new ServletException("Database error: " + ex.getMessage(), ex);
        }
    }

    private void listStudent(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException, ServletException {
        List<Student> listStudent = studentService.getAllStudent();
        request.setAttribute("listStudent", listStudent);
        request.getRequestDispatcher("/pages/student-list.jsp").forward(request, response);
    }

    private void showNewForm(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        try {
            request.setAttribute("faculties", facultyService.getAllFaculty());
            request.setAttribute("allSubjects", subjectService.getAllSubjects());
            request.getRequestDispatcher("/pages/student-form.jsp").forward(request, response);
        } catch (SQLException e) {
            response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
        }
    }

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

        if (existingStudent == null) {
            response.sendError(HttpServletResponse.SC_NOT_FOUND);
            return;
        }

        request.setAttribute("student", existingStudent);
        request.setAttribute("faculties", facultyService.getAllFaculty());
        request.getRequestDispatcher("/pages/student-form.jsp").forward(request, response);
    }

    private void insertStudent(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Student student = parseStudentFromRequest(request);
        studentService.save(student);
        response.sendRedirect(request.getContextPath() + "/student/list");
    }

    private void updateStudent(HttpServletRequest request, HttpServletResponse response)
            throws SQLException, IOException {
        Student student = parseStudentFromRequest(request);
        student.setId(Long.parseLong(request.getParameter("id")));
        studentService.update(student);
        response.sendRedirect(request.getContextPath() + "/student/list");
    }

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

    private Student parseStudentFromRequest(HttpServletRequest request) {
        String name = request.getParameter("name");
        String surname = request.getParameter("surname");
        String location = request.getParameter("location");
        int indeks = Integer.parseInt(request.getParameter("studentindex"));
        long facultyId = Long.parseLong(request.getParameter("facultyid"));

        return new Student(null, name, surname, location, indeks, facultyId);
    }
}