using Fab2ApprovalSystem.DMO;
using Fab2ApprovalSystem.Utilities;
using Fab2ApprovalSystem.Misc;
using Fab2ApprovalSystem.Models;
using Fab2ApprovalSystem.ViewModels;
using Kendo.Mvc.Extensions;
using Kendo.Mvc.UI;
using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace Fab2ApprovalSystem.Controllers
{

    [Authorize]    
    [SessionExpireFilter]
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    public class HomeController : Controller
    {
        LotDispositionDMO ldDMO = new LotDispositionDMO();
        MRB_DMO mrbDMO = new MRB_DMO();
        WorkflowDMO wfDMO = new WorkflowDMO();
        ECN_DMO ecnDMO = new ECN_DMO();
        PartsRequestDMO prDMO = new PartsRequestDMO();
        UserUtilities userDMO = new UserUtilities();
        UserAccountDMO originalUserDMO = new UserAccountDMO();
        TrainingDMO trainingDMO = new TrainingDMO();


        /// <summary>
        /// 
        /// </summary>
        /// <param name="tabName"></param>
        /// <returns></returns>
        public ActionResult Index(string tabName)
        {
            ViewBag.ActiveTabName = tabName;
            
            return View();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult MyTasks()
        {
            return View();
        }


        public ActionResult AllDocuments()
        {
            return View();
        }


        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult SpecialWorkRequestList()
        {           
            return View();
        }


        public ActionResult MRBList()
        { 
            return View();
        }

        public ActionResult ECNList()
        {
            return View();
        }
        public ActionResult TrainingList()
        {
            return View();
        }

        public ActionResult LotDispositionList()
        {
            return View();
        }


        public ActionResult AuditList()
        {
            return View();
        }

        public ActionResult CorrectiveActionList()
        {
            return View();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="viewOption"></param>
        /// <returns></returns>
        public ActionResult ECN_TECN(string viewOption)
        {
            ViewBag.ViewOption = viewOption;
            return View();
        }



        public ActionResult ChangeControlList()
        {
            return View();
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetTaskList([DataSourceRequest]DataSourceRequest request, string tabName)
        {
            try
            {
                ViewBag.ActiveTabName = tabName;
                IEnumerable<IssuesViewModel> data = ldDMO.GetTaskList((int)Session[GlobalVars.SESSION_USERID]);
                return Json(data.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                // TODO record the error
                throw ex;
            }
        }

        public ActionResult GetMyOpenActionItems([DataSourceRequest]DataSourceRequest request, string tabName)
        {
            try
            {
                ViewBag.ActiveTabName = tabName;
                IEnumerable<OpenActionItemViewModel> data = ldDMO.GetMyOpenActionItems((int)Session[GlobalVars.SESSION_USERID]);
                return Json(data.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                // TODO record the error
                throw ex;
            }
        }


        

        public ActionResult GetDocuments([DataSourceRequest]DataSourceRequest request, string tabName)
        {
            ViewBag.ActiveTabName = tabName;
            //IEnumerable<IssuesViewModel> data = ldDMO.GetLotDispositions();
            IEnumerable<IssuesViewModel> data = ldDMO.GetDocuments();
            return Json(data.ToDataSourceResult(request));
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetWorkRequests([DataSourceRequest]DataSourceRequest request)
        {
            IEnumerable<IssuesViewModel> data = ldDMO.GetWorkRequests();
            return Json(data.ToDataSourceResult(request));
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetChangeControlList([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<ChangeControlList> data = ldDMO.GetChangeControls(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
            return Json(data.ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetAuditList([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<AuditList> data = ldDMO.GetAuditList(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
            return Json(data.ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetCorrectiveActionList([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<CorrectiveAction> data = ldDMO.GetCorrectiveActionList(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
            return Json(data.ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetMRBList([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<IssuesViewModel> data = ldDMO.GetMRBList(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
            return Json(data.ToDataSourceResult(request));
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetLotDispositionList([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<IssuesViewModel> data = ldDMO.GetLotDispositionList(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
            return Json(data.ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetECNList([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<IssuesViewModel> data = ldDMO.GetECNList(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
            return Json(data.ToDataSourceResult(request));
        }
        public ActionResult GetTrainingList([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<Training> data = trainingDMO.GetAllTrainings();
            return Json(data.ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="dataType"></param>
        /// <returns></returns>
        public ActionResult MyECNsTECNs(string dataType)
        {
            ViewBag.ActiveTabName = dataType;
            return View();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetECN_TECNsPendingApproval([DataSourceRequest]DataSourceRequest request)
        {
            IEnumerable<IssuesViewModel> data = ecnDMO.GetECN_TECNPendingApprovals(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
            ViewBag.ViewOption = "Pending Approvals";
            Session[GlobalVars.ECN_VIEW_OPTION] = ViewBag.ViewOption;
            return Json(data.ToDataSourceResult(request));
            
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetMyExpiredTECNs([DataSourceRequest]DataSourceRequest request)
        {
            
            IEnumerable<IssuesViewModel> data = ecnDMO.GetMyExpiredTECNs(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()), 7);
            ViewBag.ViewOption = "Expired TECNs";
            Session[GlobalVars.ECN_VIEW_OPTION] = ViewBag.ViewOption;
            return Json(data.ToDataSourceResult(request));

        }
        public ActionResult GetAllTECNs([DataSourceRequest]DataSourceRequest request)
        {

            IEnumerable<IssuesViewModel> data = ecnDMO.GetAllTECNs();
            ViewBag.ViewOption = "All TECNs";
            Session[GlobalVars.ECN_VIEW_OPTION] = ViewBag.ViewOption;
            return Json(data.ToDataSourceResult(request));

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetMyConvertedTECNsToECNs([DataSourceRequest]DataSourceRequest request)
        {
            IEnumerable<IssuesViewModel> data = ecnDMO.GetMyConvertedTECNsToECNs(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()), 7);
            ViewBag.ViewOption = "Converted TECNs";
            Session[GlobalVars.ECN_VIEW_OPTION] = ViewBag.ViewOption;
            return Json(data.ToDataSourceResult(request));

        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        public ActionResult GetMyExpiringTECNs([DataSourceRequest]DataSourceRequest request)
        {
            IEnumerable<IssuesViewModel> data = ecnDMO.GetMyExpiringTECNs(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()), 7);
            ViewBag.ViewOption = "Expiring TECNs";
            Session[GlobalVars.ECN_VIEW_OPTION] = ViewBag.ViewOption;
            return Json(data.ToDataSourceResult(request));

        }



        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="workRequestID"></param>
        /// <returns></returns>
        public ActionResult GetLotList([DataSourceRequest] DataSourceRequest request, int workRequestID)
        {
            LotTravelerDMO LotTravDMO = new LotTravelerDMO();
            return Json(LotTravDMO.GetLotListBasedOnSWRNumber(workRequestID).ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>

        public ActionResult SetOOOStatus(int delegatedTo, DateTime startDate, DateTime endDate, string tab)
        {

            if (Session[GlobalVars.SESSION_USERID] != null)
            {
                int returnValue = MiscDMO.EnableOOOStatus(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()), delegatedTo, startDate, endDate);
                if (returnValue == 3) // the delegator is already a delegator to someone else
                {
                    return Content("3");
                }
                if (startDate <= DateTime.Today)
                    Session[GlobalVars.OOO] = true;

                NotifyDelegation(delegatedTo, startDate, endDate);
            }
           
            return Content("");
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="oooUserID"></param>
        public void ExpireOOOStatus(string tab)
        {
            if (Session[GlobalVars.SESSION_USERID] != null)
            {
                MiscDMO.ExpireOOOStatus(int.Parse(Session[GlobalVars.SESSION_USERID].ToString()));
                Session[GlobalVars.OOO] = false;

            }
            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="issue"></param>
        /// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeleteItem([DataSourceRequest] DataSourceRequest request, IssuesViewModel issue)
        {

            GlobalVars.DocumentType dType;
            Enum.TryParse(issue.DocumentType, out dType);
            if (dType == GlobalVars.DocumentType.MRB)
                mrbDMO.DeleteMRB(issue.IssueID);
            else if (dType == GlobalVars.DocumentType.LotDisposition)
                ldDMO.DeleteLotDisposition(issue.IssueID);
            else if (dType == GlobalVars.DocumentType.ECN)
                ecnDMO.DeleteDocument(issue.IssueID, int.Parse(Session[GlobalVars.SESSION_USERID].ToString()), "ECN");

            return Json(new[] { issue }.ToDataSourceResult(request, ModelState));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult About()
        {
            ViewBag.Message = "Your application description page.";

            return View();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult Contact()
        {
            ViewBag.Message = "Your contact page.";

            return View();
        }

        #region testing purpose
        public ActionResult Edit()
        {

            return View(DemoHelper.Instance.ListOfModels[0]);
        }

        [HttpPost]
        public ActionResult Edit(TestModel editTest)
        {
            DemoHelper.Instance.ListOfModels[0] = editTest;
            return RedirectToAction("Index");
        }

        public static void Test()
        {

            string[] colorStrings = { "0", "2", "8", "blue", "Blue", "Yellow", "Red, Green" };
            foreach (string colorString in colorStrings)
            {
                GlobalVars.Colors colorValue;
                if (Enum.TryParse(colorString, true, out colorValue))
                    if (Enum.IsDefined(typeof(GlobalVars.Colors), colorValue) | colorValue.ToString().Contains(","))
                        Console.WriteLine("Converted '{0}' to {1}.", colorString, colorValue.ToString());
                    else
                        Console.WriteLine("{0} is not an underlying value of the Colors enumeration.", colorString);
                else
                    Console.WriteLine("{0} is not a member of the Colors enumeration.", colorString);
            }
        }

        #endregion

        /// <summary>
        /// 
        /// </summary>
        /// <param name="issueID"></param>
        /// <param name="delegateTo"></param>
        /// <param name="step"></param>
        /// <param name="docType"></param>
        /// <param name="ecnTypeString"></param>
        public void DelegateDocumentApproval(int issueID, int delegateTo, string ecnTypeString, string title)
        {

            var email = "";
            int delegateFrom = (int)Session[GlobalVars.SESSION_USERID];
            try
            {
                email = wfDMO.DelegateDocumentApproval(issueID, delegateFrom, delegateTo);
                EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = ecnTypeString , OperationType = "Delegation", Comments = "Delegated from - " + delegateFrom + " to " + delegateTo });
            }
            catch (Exception e)
            {
                string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + issueID.ToString() + " " + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                Functions.WriteEvent(@User.Identity.Name + "\r\n DelegateApproval\r\n" + e.Message.ToString(), System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = " + ecnTypeString + ", OperationType = "Error", Comments = "DelegateApproval - " + exceptionString });
                throw new Exception(e.Message);
            }
        
            string emailTemplate = "DelegateApproval.txt";
            string userEmail = string.Empty;
            string subject;
            string senderName = ecnTypeString;

            subject = ecnTypeString + " Delegation" + " - Email would be sent to " + email + " for Number " + issueID + ", - " + title; ;
            EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]);
            string[] emailparams = new string[4];
            emailparams[0] = issueID.ToString();
            emailparams[1] = issueID.ToString();
            emailparams[2] = GlobalVars.hostURL;
            emailparams[3] = ecnTypeString;

            userEmail = email;
          
            en.SendNotificationEmail(emailTemplate,  GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams);
            try
            {

                EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = ecnTypeString, OperationType = "Email", Comments = "Delegated to Approver: " + email });
            }
            catch { }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public JsonResult GetAllUsersList()
        {
          
            UserAccountDMO userDMO = new UserAccountDMO();
            IEnumerable<LoginModel> userlist = userDMO.GetAllUsers();
            return Json(userlist, JsonRequestBehavior.AllowGet);

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public ActionResult SaveAllDocumentsFilter(string data)
        {
            Session["AllDocumentsFilterData"] = data;
            return new EmptyResult();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult LoadAllDocumentsFilter()
        {
            return Json(Session["AllDocumentsFilterData"], JsonRequestBehavior.AllowGet);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public ActionResult SaveSWRFilter(string data)
        {
            Session["SWRFilterData"] = data;
            return new EmptyResult();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult LoadSWRFilter()
        {
            return Json(Session["SWRFilterData"], JsonRequestBehavior.AllowGet);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="data"></param>
        /// <returns></returns>
        public ActionResult SavePCRBFilter(string data)
        {
            Session["PCRBFilterData"] = data;
            return new EmptyResult();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public ActionResult LoadPCRBFilter()
        {
            return Json(Session["PCRBFilterData"], JsonRequestBehavior.AllowGet);
        }

        public ActionResult PartsRequestList()
        {
            ViewBag.CanDeletePR = Session[GlobalVars.CAN_CREATE_PARTS_REQUEST];
            return View();
        }

        public ActionResult GetPartsRequestList([DataSourceRequest]DataSourceRequest request)
        {
            IEnumerable<PartsRequestList> data = prDMO.GetPartsRequestList();
            return Json(data.ToDataSourceResult(request));
        }

        public ActionResult GetMyPartsRequestsList([DataSourceRequest]DataSourceRequest request, string tabName)
        {
            try
            {
                ViewBag.ActiveTabName = tabName;
                var data = prDMO.GetMyPartsRequests((int)Session[GlobalVars.SESSION_USERID]);
                return Json(data.ToDataSourceResult(request), JsonRequestBehavior.AllowGet);
            }
            catch (Exception ex)
            {
                // TODO record the error
                throw ex;
            }
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeletePR([DataSourceRequest] DataSourceRequest request, MyPartsRequestList pr)
        {
            try
            {
                if (Convert.ToBoolean(Session[GlobalVars.CAN_CREATE_PARTS_REQUEST]) == false)
                    throw new Exception("Permission denied");

                prDMO.DeleteDocument(pr.PRNumber, (int)Session[GlobalVars.SESSION_USERID]);
                return Json(new[] { pr }.ToDataSourceResult(request, ModelState));
            }
            catch (Exception ex)
            {
                return new HttpStatusCodeResult(System.Net.HttpStatusCode.BadRequest, ex.Message);                
            }
        }

        public void NotifyDelegation(int delegatedUser, DateTime startDate, DateTime endDate)
        {
            LoginModel delegateFrom = originalUserDMO.GetUserByID((int)Session[GlobalVars.SESSION_USERID]);
            LoginModel delegateTo = originalUserDMO.GetUserByID(delegatedUser);
            List<string> emailList = new List<string>();
            emailList.Add(delegateFrom.Email);
            emailList.Add(delegateTo.Email);

            string emailTemplate = "DelegationOn.txt";
            string userEmail = string.Empty;
            string subject = "Mesa Approval Delegation Notification";
            string senderName = "Mesa Approval";

            foreach (string email in emailList)
            {
                EmailNotification en = new EmailNotification(subject, ConfigurationManager.AppSettings["EmailTemplatesPath"]);
                string[] emailparams = new string[5];
                emailparams[0] = delegateFrom.FullName;
                emailparams[1] = delegateTo.FullName;
                emailparams[2] = startDate.ToString("yyyy-MM-dd");
                emailparams[3] = endDate.ToString("yyyy-MM-dd");
                userEmail = email;
                //#if(DEBUG)
                //    userEmail =  GlobalVars.SENDER_EMAIL;
                //#endif

                en.SendNotificationEmail(emailTemplate, GlobalVars.SENDER_EMAIL, senderName, userEmail, null, subject, emailparams);
            }

            try
            {

                //EventLogDMO.Add(new WinEventLog() { IssueID = issueID, UserID = @User.Identity.Name, DocumentType = ecnTypeString, OperationType = "Email", Comments = "Rejection: " + userEmail });
            }
            catch { }

        }

    }
}