/*
* Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license
* Click nbfs://nbhost/SystemFileSystem/Templates/JSP_Servlet/Servlet.java to edit this template
*/
package Controllers.Public;
import Controllers.Manager.UpdateReservation;
import DAO.AccountDAO;
import DAO.ReservationDao;
import DAO.ServiceCategoryDAO;
import Model.Account;
import Model.ServiceCategory;
import java.io.IOException;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import jakarta.servlet.http.HttpSession;
import java.io.PrintWriter;
import java.time.DayOfWeek;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.Period;
import java.sql.Date;
import java.sql.Time;
import java.time.LocalTime;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.mail.MessagingException;
/**
*
* @author Lenovo
*/
@WebServlet(name = "AddReservation", urlPatterns = {"/addreservation"})
public class AddReservation extends HttpServlet {
/**
* Processes requests for both HTTP <code>GET</code> and <code>POST</code>
* methods.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
ReservationDao dao = new ReservationDao();
/*GET RESERVATION DATA*/
//get user id
HttpSession session = request.getSession();
Account account = (Account) session.getAttribute("account");
int userId = account.getId();
//get service id
int serviceId = Integer.parseInt(request.getParameter("serviceid"));
//get schedule data
String[] scheduleData = request.getParameter("selectedslot").split(" ");
//get doctor id
int doctorId = Integer.parseInt(scheduleData[1]);
PrintWriter out = response.getWriter();
// Specify the desired day of the week
DayOfWeek desiredDayOfWeek;
// Get the current date
LocalDateTime currentDate = LocalDateTime.now();
//get exam date
LocalDateTime examDate = currentDate;
switch (scheduleData[2]) {
case "Monday":
desiredDayOfWeek = DayOfWeek.MONDAY;
while (examDate.getDayOfWeek() != desiredDayOfWeek) {
examDate = examDate.plusDays(1);
}
break;
case "Tuesday":
desiredDayOfWeek = DayOfWeek.TUESDAY;
currentDate = LocalDateTime.now();
examDate = currentDate;
while (examDate.getDayOfWeek() != desiredDayOfWeek) {
examDate = examDate.plusDays(1);
}
break;
case "Wednesday":
desiredDayOfWeek = DayOfWeek.WEDNESDAY;
currentDate = LocalDateTime.now();
examDate = currentDate;
while (examDate.getDayOfWeek() != desiredDayOfWeek) {
examDate = examDate.plusDays(1);
}
break;
case "Thursday":
desiredDayOfWeek = DayOfWeek.THURSDAY;
currentDate = LocalDateTime.now();
examDate = currentDate;
while (examDate.getDayOfWeek() != desiredDayOfWeek) {
examDate = examDate.plusDays(1);
}
break;
case "Friday":
desiredDayOfWeek = DayOfWeek.FRIDAY;
currentDate = LocalDateTime.now();
examDate = currentDate;
while (examDate.getDayOfWeek() != desiredDayOfWeek) {
examDate = examDate.plusDays(1);
}
break;
default:
break;
}
//get exam date time
int slot = Integer.parseInt(scheduleData[3]);
LocalTime time = dao.getSlotStartTime(slot);
LocalDate getDate = examDate.toLocalDate();
examDate = getDate.atTime(time);
/*CHECK SLOT'S STATE*/
int slotId = Integer.parseInt(scheduleData[0]);
if (dao.checkIsSlotAVail(slotId) == false) {
request.setAttribute("msg", "This slot is full, please choose another slot");
request.getRequestDispatcher("bookaservice?id=" + serviceId).forward(request, response);
return;
}
/*GET CHILD INFORMATION*/
String childName = request.getParameter("cname");
String gender = request.getParameter("gender");
String relationship = request.getParameter("relationship");
//get and convert child's dob
LocalDate dob = LocalDate.parse(request.getParameter("dob"));
int age = Period.between(dob, LocalDate.now()).getYears();
//check child age condition, from 1 to 16 years old
if (age < 1 || age > 16) {
request.setAttribute("msg", "Date of birth is invalid");
request.getRequestDispatcher("bookaservice?id=" + serviceId).forward(request, response);
return;
}
Date date = java.sql.Date.valueOf(dob);
boolean gen = true;
if ("female".equals(gender.toLowerCase())) {
gen = false;
}
//add data to reservation
boolean result = dao.addNewReservation(userId, serviceId, doctorId, LocalDateTime.now(), examDate, relationship);
if (!result) {
out.println("Error adding reservation");
return;
}
//add attempt to selected slot
result = dao.addSlot(slotId);
if (!result) {
out.println("Error adding slot");
return;
}
//add children information
result = dao.addChildrenInformation(childName, date, gen,relationship);
if (!result) {
out.println("Error adding children informaion");
return;
}
//send email for reservation confirmation and payment guide
String email = account.getEmail();
try {
//set up content
String url = "http://localhost:9999/ChildrenCare/";
String content = "<html><body>";
content += "<p>Your have submited a reservation, please wait for the manager to confirm it</p>";
content += "<p></p>";
content += "</body></html>";
//send email
AccountDAO aDao = new AccountDAO();
aDao.sendEmail(email, content);
} catch (MessagingException ex) {
Logger.getLogger(UpdateReservation.class.getName()).log(Level.SEVERE, null, ex);
}
//load service category
ServiceCategoryDAO sc = new ServiceCategoryDAO();
List<ServiceCategory> serc = sc.getAllServiceCategory();
request.setAttribute("serc", serc);
request.getRequestDispatcher("ReservationCompletion.jsp").forward(request, response);
}
// <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code.">
/**
* Handles the HTTP <code>GET</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Handles the HTTP <code>POST</code> method.
*
* @param request servlet request
* @param response servlet response
* @throws ServletException if a servlet-specific error occurs
* @throws IOException if an I/O error occurs
*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}
/**
* Returns a short description of the servlet.
*
* @return a String containing servlet description
*/
@Override
public String getServletInfo() {
return "Short description";
}// </editor-fold>
}