package edu.ncsu.csc.itrust.action;

import edu.ncsu.csc.itrust.beans.OphthalmologyOVRecordBean;
import edu.ncsu.csc.itrust.dao.DAOFactory;
import edu.ncsu.csc.itrust.dao.mysql.OphthalmologyOVRecordDAO;
import edu.ncsu.csc.itrust.enums.TransactionType;
import edu.ncsu.csc.itrust.exception.FormValidationException;
import edu.ncsu.csc.itrust.exception.ITrustException;
import edu.ncsu.csc.itrust.validate.OphthalmologyOVValidator;

/**
 * Used for add ophthalmology office visit page (addOphalmologyOVRecord.jsp). 
 * 
 * Very similar to {@link AddObstetricsAction}
 */
public class AddOphthalmologyOVAction {
	/**ophthalmologyOVDAO is the DAO that retrieves the ophthalmology office
	 *  visit records from the database*/
	private OphthalmologyOVRecordDAO ophthalmologyOVDAO;
	/**loggedInMID is the HCP that is logged in.*/
    private long loggedInMID;
    /**loggingAction is used to write to the log.*/
    private EventLoggingAction loggingAction;

    /**
     * AddOphthalmologyOVAction is the constructor for this action class. It simply initializes the
     * instance variables.
     * @param factory The factory used to get the obstetricsDAO.
     * @param loggedInMID The MID of the logged in user.
     */
	public AddOphthalmologyOVAction(DAOFactory factory, long loggedInMID) {
		this.ophthalmologyOVDAO = factory.getOphthalmologyOVRecordDAO();
		this.loggedInMID = loggedInMID;
		this.loggingAction = new EventLoggingAction(factory);
	}
	
	/**
	 * Adds a new ophthalmology office visit record.
	 * @param p OphthalmologyOVRecordBean containing the info for the record to be created.
	 * @throws FormValidationException if the patient is not successfully validated.
	 * @throws ITrustException thrown if the database encounters an issue.
	 */
	public void addOphthalmologyOV(OphthalmologyOVRecordBean p) 
			throws FormValidationException, ITrustException {
		if(p != null){
			//Validate the bean
			new OphthalmologyOVValidator().validate(p);
			
			//Add the ophthalmology office visit record to the database
			ophthalmologyOVDAO.addOphthalmologyOVRecord(p);
			
			//Log the transaction
			loggingAction.logEvent(TransactionType.parse(8300), loggedInMID, 
					p.getMid(), "Ophthalmology Office Visit " +  p.getOid() + " added");
		} else {
			throw new ITrustException("Cannot add a null Ophthalmology Office Visit.");
		}
	}
}