/// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/04
        /// Approver : Mohamed Elamin
        /// after reviewer select a customer record, btnOpenRecord retrireve that customer data and filled
        /// the customer details and hidden the adoption appliaction then show the customer data
        /// </summary>
        /// <param name="e"></param>
        /// <param name="sender"></param>
        private void btnOpenRecord_Click(object sender, RoutedEventArgs e)
        {
            List <Questionnair> questionnairs = new List <Questionnair>();

            try
            {
                adoptionApplication = (AdoptionApplication)DGViewData.SelectedItem;
                if (adoptionApplication != null)
                {
                    this.customerEmail = adoptionApplication.CustomerEmail;
                    reviewerManager    = new ReviewerManager();
                    customer           = reviewerManager.retrieveCustomerByCustomerName(this.customerEmail);

                    List <CustomerQuestionnar> customerQuestionnars = reviewerManager.retrieveCustomerQuestionnar(this.customerEmail);
                    lblCustomerName.Content = adoptionApplication.CustomerEmail;

                    DGViewQuestionnair.ItemsSource = customerQuestionnars;
                    adoptionApplication            = new AdoptionApplication();

                    ReviewerDecission.Visibility        = Visibility.Hidden;
                    ViewAdoptionApplications.Visibility = Visibility.Hidden;
                    CustomerQustionnair.Visibility      = Visibility.Visible;
                }
                else
                {
                    lblAdoptionApplicationErrorMessage.Content = "Please select a customer";
                }
            }
            catch (Exception)
            {
                lblAdoptionApplicationErrorMessage.Content = "This customer did not fill the questionnar!";
            }
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/03/06
        /// Approver: Mohamed Elamin
        /// Retrieve Questionnaes general questions table
        /// </summary>
        /// <remarks>
        /// Updater: Mohamed Elamin
        /// Updated: 2020/04/21
        /// Update: Fixed comments format.
        /// </remarks>
        /// <param name="adoptionApplication"></param>
        /// <returns>questions</returns>
        /// <returns>True or false depending if the record was inserted</returns>
        public bool insertAdoptionApplication(AdoptionApplication adoptionApplication)
        {
            bool result = false;
            var  conn   = DBConnection.GetConnection();
            var  cmd    = new SqlCommand("sp_add_new_adoptionApplication", conn);

            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.AddWithValue("@CustomerEmail", adoptionApplication.CustomerEmail);
            cmd.Parameters.AddWithValue("@RecievedDate", adoptionApplication.RecievedDate);
            cmd.Parameters.AddWithValue("@Status", adoptionApplication.Status);
            cmd.Parameters.AddWithValue("@AnimalID", adoptionApplication.AnimalID);
            try
            {
                conn.Open();
                if ((int)cmd.ExecuteNonQuery() == 1)
                {
                    result = true;
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(result);
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/04
        /// Approver : Mohamed Elamin
        /// open (Hidden/visible) the reviewer decssion page
        /// </summary>
        /// <param name="e"></param>
        /// <param name="sender"></param>
        private void btnReviewerDecisionView_Click(object sender, RoutedEventArgs e)
        {
            if (DGViewData.SelectedItem != null)
            {
                AdoptionApplication selectedAdoptionApplication = (AdoptionApplication)DGViewData.SelectedItem;
                //adoptionApplication = reviewerManager.retrieveCustomerAdoptionApplicaionByCustomerEmail(selectedAdoptionApplication.CustomerEmail);
                txtAdoptionApplicationID.IsReadOnly = true;
                txtCustomerLastName.IsReadOnly      = true;
                txtAnimalName.IsReadOnly            = true;
                txtAdoptionApplicationID.Text       = selectedAdoptionApplication.AdoptionApplicationID.ToString();
                txtCustomerLastName.Text            = selectedAdoptionApplication.CustomerEmail;
                txtAnimalName.Text = selectedAdoptionApplication.AnimalName;


                ReviewerDecission.Visibility               = Visibility.Visible;
                ViewAdoptionApplications.Visibility        = Visibility.Hidden;
                CustomerQustionnair.Visibility             = Visibility.Hidden;
                lblAdoptionApplicationErrorMessage.Content = "";
            }
            else
            {
                txtAdoptionApplicationID.Text = "";
                txtCustomerLastName.Text      = "";
                txtAnimalName.Text            = "";

                txtAdoptionApplicationID.IsReadOnly = true;
                txtCustomerLastName.IsReadOnly      = true;
                txtAnimalName.IsReadOnly            = true;

                ReviewerDecission.Visibility               = Visibility.Hidden;
                ViewAdoptionApplications.Visibility        = Visibility.Visible;
                CustomerQustionnair.Visibility             = Visibility.Hidden;
                lblAdoptionApplicationErrorMessage.Content = "Please Select Adoption Application";
            }
        }
 /// <summary>
 /// Creator: Awaab Elamin
 /// Created: 2020/3/7
 /// Approver: Mohamed Elamin
 /// default constructor assgined intial values
 /// </summary>
 /// <remarks>
 /// UPDATED BY: NA
 /// UPDATE DATE: NA
 /// CHANGE: NA
 /// </remarks>
 public AdoptionController()
 {
     adoptionApplication        = new AdoptionApplication();
     adoptionApplicationManager = new ReviewerManager();
     questionnair                = new Questionnair();
     _adoptionCustomerManager    = new AdoptionCustomerManager();
     _adoptionApplicationManager = new AdoptionApplicationManager();
     _adoptionAnimalManager      = new AdoptionAnimalManager();
     _adoptionAppointmentManager = new AdoptionAppointmentManager();
     _userManager                = new UserManager();
     _animalManager              = new AnimalManager();
 }
        public void TestAdoptionApplication()
        {
            AdoptionApplication adoptionApplication = new AdoptionApplication();

            adoptionApplication.AdoptionApplicationID = 10003;
            adoptionApplication.CustomerEmail         = "*****@*****.**";
            adoptionApplication.AnimalID     = 10004;
            adoptionApplication.RecievedDate = DateTime.Now;
            adoptionApplication.Status       = "Reviewer";
            bool expect = true;
            bool result = reviewerManager.addAdoptionApplication(adoptionApplication);

            Assert.AreEqual(expect, result);
        }
        //[AllowAnonymous]
        //[ValidateAntiForgeryToken]
        public ActionResult AdoptionApplication(AdoptionApplication adoptionApplication)
        {
            if (adoptionApplicationManager.addAdoptionApplication(adoptionApplication))
            {
                ViewBag.StatusMessage = "update goes right!";
                return(RedirectToAction("Index"));
            }
            else
            {
                ViewBag.StatusMessage = "Model state is not valid";
                return(RedirectToAction("Index"));

                //return View();
            }
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/04
        /// Approver : Mohamed Elamin
        ///submit the reviewer decission (Approve/Deny)
        /// </summary>
        /// <param name="e"></param>
        /// <param name="sender"></param>
        private void btnSubmitDecision_Click(object sender, RoutedEventArgs e)
        {
            adoptionApplication = (AdoptionApplication)DGViewData.SelectedItem;

            if (Interviewer.IsSelected)
            {
                if (adoptionManager.SubmitReviewerDecision(adoptionApplication.AdoptionApplicationID, Interviewer.Content.ToString()))
                {
                    lblDecisionErrorMessage.Content        = Interviewer.Content.ToString();
                    lblAdoptionApplicationDecision.Content = Interviewer.Content.ToString();
                    DGViewData.ItemsSource              = adoptionManager.retrieveCustomersFilledQuestionnair();
                    ReviewerDecission.Visibility        = Visibility.Hidden;
                    ViewAdoptionApplications.Visibility = Visibility.Visible;
                    CustomerQustionnair.Visibility      = Visibility.Hidden;
                }
                else
                {
                    lblDecisionErrorMessage.Content     = "Please choose a decision";
                    ReviewerDecission.Visibility        = Visibility.Visible;
                    ViewAdoptionApplications.Visibility = Visibility.Hidden;
                    CustomerQustionnair.Visibility      = Visibility.Hidden;
                }
            }
            else if (Deny.IsSelected)
            {
                if (adoptionManager.SubmitReviewerDecision(adoptionApplication.AdoptionApplicationID, Deny.Content.ToString()))
                {
                    lblDecisionErrorMessage.Content        = Deny.Content.ToString();
                    lblAdoptionApplicationDecision.Content = Deny.Content.ToString();
                    DGViewData.ItemsSource              = adoptionManager.retrieveCustomersFilledQuestionnair();
                    ReviewerDecission.Visibility        = Visibility.Hidden;
                    ViewAdoptionApplications.Visibility = Visibility.Visible;
                    CustomerQustionnair.Visibility      = Visibility.Hidden;
                }
                else
                {
                    lblDecisionErrorMessage.Content     = "Please choose a decision";
                    ReviewerDecission.Visibility        = Visibility.Visible;
                    ViewAdoptionApplications.Visibility = Visibility.Hidden;
                    CustomerQustionnair.Visibility      = Visibility.Hidden;
                }
            }
            else
            {
                lblDecisionErrorMessage.Content = "Please choose a decision";
                return;
            }
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/04
        /// Approver: Mohamed Elamin
        /// add the adoption application of the customer
        /// </summary>
        /// <remarks>
        /// Updater: Mohamed Elamin
        /// Updated: 2020/04/21
        /// Update: Fixed Comments format.
        /// </remarks>
        /// <param name="adoptionApplication"></param>
        /// <returns>True or false depending if the record was inserted</returns>
        public bool addAdoptionApplication(AdoptionApplication adoptionApplication)
        {
            bool result = false;

            try
            {
                if (adoptionAccessor.insertAdoptionApplication(adoptionApplication))
                {
                    result = true;
                }
            }
            catch (Exception)
            {
                throw;
            }
            return(result);
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/03/6
        /// Approver: Mohamed Elamin
        /// Insert Adoption Apllication in AdoptionApplication table
        /// </summary>
        /// <remarks>
        /// Updater:
        /// Updated:
        /// Update:
        /// </remarks>
        /// <param name="adoptionApplication"></param>
        /// <returns>result</returns>
        public bool insertAdoptionApplication(AdoptionApplication adoptionApplication)
        {
            bool result = false;
            int  count  = adoptionApplications.Count;
            AdoptionApplication adoption = new AdoptionApplication();

            adoption.AdoptionApplicationID = adoptionApplication.AdoptionApplicationID;
            adoption.CustomerEmail         = adoptionApplication.CustomerEmail;
            adoption.AnimalName            = adoptionApplication.AnimalID.ToString();
            adoption.RecievedDate          = adoptionApplication.RecievedDate;
            adoption.Status = adoptionApplication.Status;
            adoptionApplications.Add(adoption);
            if (adoptionApplications.Count > count)
            {
                result = true;
            }
            return(result);
        }
        /// <summary>
        /// Creator: Mohamed Elamin
        /// Created On: 2020/03/29
        /// Approved By: Awaab Elamin
        /// This is an event when Back To Inspector Screen button is clicked , And will open
        /// Customer Detail window.And sends the Customer Email to the Customer Detail's
        /// Constructor as an argument.
        /// </summary>
        /// <remarks>
        /// Updater Name
        /// Updated: yyyy/mm/dd
        /// Update: ()
        /// </remarks>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnCustomerDetails_Click(object sender, RoutedEventArgs e)
        {
            AdoptionApplication adoptionApplication = new AdoptionApplication();

            adoptionApplication = (AdoptionApplication)DGViewData.SelectedItem;

            var selectedItem = (AdoptionApplication)DGViewData.SelectedItem;

            if (selectedItem == null)
            {
                MessageBox.Show("Please select an Adoption Application to open the Customer Details.");
            }
            else
            {
                this.NavigationService?.Navigate(new CustomerDetail
                                                     (adoptionApplication.CustomerEmail));
            }
        }
        /// <summary>
        /// Creator: Mohamed Elamin
        /// Created: 2020/02/19
        /// Approver: Austin Gee, 2020/02/19
        /// This is an event on btnOpen is clicked which will open Customer Detail window.
        /// </summary>
        /// <remarks>
        /// Updater Name
        /// Updated: yyyy/mm/dd
        /// Update: ()
        /// </remarks>
        /// <param name=" sender"></param>
        /// <param name=" e"></param>
        private void BtnOpenRecord_Click(object sender, RoutedEventArgs e)
        {
            AdoptionApplication adoptionApplication = new AdoptionApplication();

            adoptionApplication = (AdoptionApplication)dgAdoptionApplicationsList.SelectedItem;

            var selectedItem = (AdoptionApplication)dgAdoptionApplicationsList.SelectedItem;

            if (selectedItem == null)
            {
                MessageBox.Show("Please select an Adoption Appliction to open the Customer Details.");
            }
            else
            {
                this.NavigationService?.Navigate(new CustomerDetail
                                                     (adoptionApplication.CustomerEmail));
                populatedgAdoptionApplicationsList();
            }
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/04
        /// Approver: Mohamed Elamin
        /// </summary>
        /// <remarks>
        /// Updater: Mohamed Elamin
        /// Updated: 2020/04/22
        /// Update: Fixed Comments format.
        /// </remarks>
        /// <param name="e"></param>
        /// <param name="sender"></param>
        private void DGInterviewerData_SelectionChanged(object sender, SelectionChangedEventArgs e)
        {
            try
            {
                AdoptionApplication application = new AdoptionApplication();
                application = (AdoptionApplication)DGInterviewerData.SelectedItem;
                txtAdoptionApplicationID.Text       = application.AdoptionApplicationID.ToString();
                lblInterviewerErrorMessage.Content  = "";
                btnInterviewerDecission.Visibility  = Visibility.Visible;
                GridInterviewerDecission.Visibility = Visibility.Visible;
            }
            catch (Exception)
            {
                btnInterviewerDecission.Visibility  = Visibility.Hidden;
                GridInterviewerDecission.Visibility = Visibility.Hidden;

                txtAdoptionApplicationID.Text = "Please select one of the adoption application list";
            }
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/15
        /// Approver: Mohamed Elamin
        /// Retrieve Adoption Application for a customer from Customer Questionnar table
        /// by his ID.
        /// </summary>
        /// <remarks>
        /// Updater: Mohamed Elamin
        /// Updated: 2020/04/21
        /// Update: Fixed comments format.
        /// </remarks>
        /// <param name="customerEmail"></param>
        /// <returns>adoptionApplication</returns>
        public AdoptionApplication getAdoptionApplicationByCustomerEmail(string customerEmail)
        {
            AdoptionApplication adoptionApplication = new AdoptionApplication();

            //	var conn = DBConnection.GetConnection();
            //	string cmdText = @"sp_get_Adoption_Application_By_CustomerID";
            //	var cmd = new SqlCommand(cmdText, conn);
            //	cmd.CommandType = CommandType.StoredProcedure;

            //	cmd.Parameters.Add("@customerID", SqlDbType.Int);
            //	cmd.Parameters["@customerID"].Value = customerID;

            //	try
            //	{
            //		conn.Open();
            //		SqlDataReader reader = cmd.ExecuteReader();
            //		if (reader.HasRows)
            //		{
            //			while (reader.Read())
            //			{

            //				adoptionApplication.AdoptionApplicationID = reader.GetInt32(0);
            //				adoptionApplication.CustomerName = getCustomerLastName(customerID);
            //				adoptionApplication.AnimalName = getAnimalName(reader.GetInt32(1));
            //				adoptionApplication.Status = reader.GetString(2);
            //				adoptionApplication.RecievedDate = reader.GetDateTime(3);
            //			}
            //			reader.Close();
            //		}
            //	}
            //	catch (Exception)
            //	{

            //		throw;
            //	}
            //	finally
            //	{
            //		conn.Close();
            //	}
            return(adoptionApplication);
        }
        /// <summary>
        /// Creator: Mohamed Elamin
        /// Created: 2/5/2020
        /// Approver: Austin Gee, 2/7/2020
        /// This method used to get all Adoption Applications where thier status
        /// is In-home Inspection.
        /// </summary>
        /// <remarks>
        /// Updater Name
        /// Updated: yyyy/mm/dd
        /// Update: ()
        /// </remarks>
        /// <returns>Adoption Applications list</returns>
        public List <AdoptionApplication> SelectAdoptionApplicationsByStatus()
        {
            List <AdoptionApplication> adoptionApplications = new List <AdoptionApplication>();
            var conn = DBConnection.GetConnection();
            var cmd  = new SqlCommand("sp_select_AdoptionApplication_by_Status", conn);

            cmd.Connection  = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            try
            {
                conn.Open();
                var reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        var adoptionApplication = new AdoptionApplication();

                        adoptionApplication.AdoptionApplicationID = reader.GetInt32(0);
                        adoptionApplication.AnimalName            = SelectAnimalNameByAnimalID(reader.GetInt32(1));
                        adoptionApplication.CustomerEmail         = reader.GetString(2);
                        adoptionApplication.Status       = reader.GetString(3);
                        adoptionApplication.RecievedDate = reader.GetDateTime(4);

                        adoptionApplications.Add(adoptionApplication);
                    }
                }
                reader.Close();
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {
                conn.Close();
            }
            return(adoptionApplications);
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/15
        /// Approver: Mohamed Elamin
        /// Method to get all Adoption Applications.
        /// </summary>
        /// <remarks>
        /// Updater: Mohamed Elamin
        /// Updated: 2020/04/21
        /// Update: Fixed comments format.
        /// </remarks>
        /// <returns>adoptionApplications</returns>
        public List <AdoptionApplication> getAllAdoptionApplication()
        {
            List <AdoptionApplication> adoptionApplications = new List <AdoptionApplication>();

            var    conn    = DBConnection.GetConnection();
            string cmdText = @"sp_get_Adoption_Application";
            var    cmd     = new SqlCommand(cmdText, conn);

            cmd.CommandType = CommandType.StoredProcedure;
            try
            {
                conn.Open();
                SqlDataReader reader = cmd.ExecuteReader();
                if (reader.HasRows)
                {
                    while (reader.Read())
                    {
                        AdoptionApplication adoptionApplication = new AdoptionApplication();
                        adoptionApplication.AdoptionApplicationID = reader.GetInt32(0);
                        adoptionApplication.CustomerEmail         = reader.GetString(1);
                        adoptionApplication.AnimalName            = reader.GetString(2);
                        adoptionApplication.Status       = reader.GetString(3);
                        adoptionApplication.RecievedDate = reader.GetDateTime(4);
                        adoptionApplications.Add(adoptionApplication);
                    }
                    reader.Close();
                }
            }
            catch (Exception)
            {
                throw;
            }
            finally
            {
                conn.Close();
            }
            return(adoptionApplications);
        }
        /// <summary>
        /// Creator: Awaab Elamin
        /// Created: 2020/02/15
        /// Approver: Mohamed Elamin
        /// retrieve the Adoption Apllication of specific customer
        /// according to his ID
        /// </summary>
        /// <remarks>
        /// Updated by: Awaab Elamin
        /// Date: 2020/03/15
        /// Updated to get Adoption Application by Customer Email neither than Customer ID
        /// According to DB update
        /// </remarks>
        /// <param name="customerEmail"></param>
        /// <return type="AdoptionApplication"> adoptionApplication</return>
        public AdoptionApplication getAdoptionApplicationByCustomerEmail(String customerEmail)
        {
            AdoptionApplication adoptionApplication = new AdoptionApplication();

            //string customerLastName = "";
            //foreach (AdoptionCustomer customer in customers)
            //{
            //   if (customerID == customer.CustomerID)
            //   {
            //            customerLastName = customer.LastName;
            //            break;
            //        }
            //        foreach (AdoptionApplication adoption in adoptionApplications)
            //        {
            //            if (adoption.CustomerName == customerLastName)
            //            {
            //                adoptionApplication = adoption;
            //                break;
            //            }
            //        }
            //}

            return(adoptionApplication);
        }
 /// <summary>
 /// Creator: Awaab Elamin
 /// Created: 2020/02/04
 /// Approver: Mohamed Elamin
 /// Retrieve A customer's AdoptionApplication by a customerID
 /// </summary>
 /// <remarks>
 /// Updater: Mohamed Elamin
 /// Updated: 2020/04/21
 /// Update: Fixed Comments format.Added try catch block.
 /// </remarks>
 /// <param name="customerEmail"></param>
 /// <returns >adoptionApplication</returns>
 public AdoptionApplication retrieveCustomerAdoptionApplicaionByCustomerEmail(string customerEmail)
 {
     adoptionApplication = adoptionAccessor.getAdoptionApplicationByCustomerEmail(customerEmail);
     return(adoptionApplication);
 }