package us.deans.parrot;

import java.io.IOException;
import java.io.PrintWriter;

//import java.sql.Connection;
//import java.sql.PreparedStatement;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.sql.Statement;

import java.util.ArrayList;
import java.util.Map;

//import javax.naming.Context;
//import javax.naming.InitialContext;
//import javax.naming.NamingException;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

//import javax.sql.DataSource;

import us.deans.parrot.dataprovider.DataManager;
import us.deans.parrot.dataprovider.WpTitleRecord;
import us.deans.parrot.dataprovider.WpPostRecord;

// import org.apache.log4j.Logger;
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;

public class TestAppController extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private ParrotManager appConfig;

	// private Logger logger = Logger.getLogger(this.getClass());			// (old log4j)
	private Logger logger = LogManager.getLogger(this.getClass());			// root logger
	private Logger log2 = LogManager.getLogger("fileLog");

	private DataManager data;
	//private DataSource ds1;
	//private Connection dc1 = null;
	//private Statement st1;
	//private ResultSet rs1;

	private ArrayList<WpTitleRecord> dset = null;

    public TestAppController() {
        super();
    }

    public void init(ServletConfig config) throws ServletException {

    	super.init(config);

    	logger.debug(">> initializing TestAppController (Parrot Pete saying 'Ello.')");

    	ServletContext ctx = null;
    	String configFile = "";

    	// get configuration file through the servlet context.
    	try {
    		ctx = getServletContext();
    		configFile = ctx.getRealPath("/WEB-INF/parrot.properties");
    	}
    	catch (Exception ex) {
    		ex.printStackTrace();
    	}

    	/* get data source through the initial context.
    	try {
    		Context initContext = new InitialContext();
    		Context envContext = (Context)initContext.lookup("java:comp/env");
    		ds1 = (DataSource)envContext.lookup("jdbc/CMS1-WP1");
    	}
    	catch (NamingException e) {
    		e.printStackTrace();
    	} */

    	appConfig = ParrotManager.getInstance();
    	appConfig.init(configFile);

		DataManager data = (DataManager) this.getServletConfig().getServletContext().getAttribute("data_model");

    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		doPost(request, response);

	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		String category = request.getParameter("job").trim();

		switch (category) {

			case "list-bullet" 		:
			case "list-short"		:
			case "list-long" 		: storyList(request, response, category); break;

			case "detail-bullet"	:
			case "detail-short" 	:
			case "detail-long" 		: storyload(request, response); break;

			case "reshtml"			: resumeload(request, response, category); break;
			case "resword"			:
			case "respdf"			: resumeload(request, response, category); break;


			case "checkwa" 			: checkapp(request, response); break;
			case "checkdb1" 		: checkdb(response); break;
			case "checkvars" 		: check_variables(response); break;

		}


/*
		// check web application (if you get here then assume it's working and redirect to success page).
		if (request.getParameter("job").trim().equalsIgnoreCase("checkwa"))
			checkapp(request, response);

		// check database connection using JDNI
		if (request.getParameter("job").trim().equalsIgnoreCase("checkdb1"))
			checkdb(response);

		// check system variables
		if (request.getParameter("job").trim().equalsIgnoreCase("checkvars")) {
			check_variables(response);
		}
*/

	}

	public void storyList(HttpServletRequest request, HttpServletResponse response, String category) {

		log2.debug(">> list of " + category + " stories.");

		String SQL = "";
		switch (category) {

			case "list-bullet" 	: SQL = appConfig.getSQL_ListBullets(); break;
			case "list-short" 	: SQL = appConfig.getSQL_ListShortStories(); break;
			case "list-long" 	: SQL = appConfig.getSQL_ListLongStories(); break;
			default 		    : SQL = appConfig.getSQL_ListBullets(); break;
		}

		dset = data.getStoryList(SQL);
		request.setAttribute("stories", dset);
		dset = null;
		data = null;

		log2.debug("got " + dset.size() + " records of data, redirecting to view now...");

		RequestDispatcher dispatcher = request.getRequestDispatcher("views/short-stories.jsp");
		try {
			dispatcher.forward(request, response);
		} catch (ServletException | IOException e) {
			logger.debug("dispatcher.forward - not working. See stack trace...");
			e.printStackTrace();
		}



	}
 
	public void storyload(HttpServletRequest request, HttpServletResponse response) {

		logger.debug(">> show short story.");

		String SQL = appConfig.getSQL_ViewStory();
		// get parameter value from request object and translate to integer
		String strArg = request.getParameter("storyid").trim();
		if (strArg.startsWith("'")) {
			strArg = strArg.substring(1, strArg.length() - 1);
		}
		Integer storyId = Integer.parseInt(strArg);

		logger.debug(SQL + " : " + storyId);

		WpPostRecord drec = new WpPostRecord();

		drec = data.getStory(SQL, storyId);

		request.setAttribute("short_story", drec);

		RequestDispatcher dispatcher = request.getRequestDispatcher("views/short-story.jsp");
		try {
			dispatcher.forward(request, response);
		} catch (ServletException | IOException e) {
			logger.debug("dispatcher.forward - not working. See stack trace...");
			e.printStackTrace();
		}


	}

	public void resumeload(HttpServletRequest request, HttpServletResponse response, String category) {

		switch (category) {
			case "reshtml"	:
				RequestDispatcher dispatcher = request.getRequestDispatcher("/Resume?jsp");
				try {
					dispatcher.forward(request, response);
				} catch (ServletException | IOException e) {
					logger.debug("dispatcher.forward - not working. See stack trace...");
					e.printStackTrace();
				}
				break;
			case "resword"	: break;
			case "respdf"	: break;
		}

		logger.debug(">> loading resume...");

	}

//  uses the response and request objects to redirect to a JSP page
	public void checkapp(HttpServletRequest request, HttpServletResponse response) {

		logger.debug(">> checking web app...");

		// forward the request to the JSP
		RequestDispatcher dispatcher = request.getRequestDispatcher("/appcheck.html");

		try {
			dispatcher.forward(request, response);
		} catch (ServletException | IOException e) {
			logger.debug("dispatcher.forward - not working. See stack trace...");
			e.printStackTrace();
		}

		logger.debug(">> app check complete.");

	}
	
//  uses the response object to print the result directly to the client.
	public void checkdb(HttpServletResponse response) throws IOException{

		logger.debug(">> checking data source.");

		// streams the answer directly to the client.
		response.setContentType("text/html");
		PrintWriter out = response.getWriter();
		String rsp_msg = data.checkdb();
		out.println(rsp_msg);

		logger.debug(">> data source check complete... [" + rsp_msg + "]" );

	}
	
	
//  uses the response object to print the result directly to the client.
	private void check_variables(HttpServletResponse response) {

		logger.debug(">> checking variables...");

		// streams the answer directly to the client.
		response.setContentType("text/html");
		PrintWriter out;
		try {
			out = response.getWriter();
			out.println("Variables...");

			Map<String, String> variables = System.getenv();

			for ( Map.Entry<String, String> entry : variables.entrySet()) {

				String name = entry.getKey();
				String value = entry.getValue();
				out.println(name + " : " + value + "<br>");

			}

		} catch (IOException e) {
			e.printStackTrace();
		}

		logger.debug(">> variable check complete.");

	}
}
