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

namespace Fab2ApprovalSystem.Controllers
{
    [Authorize]
    [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*")]
    [SessionExpireFilter]
    public class ChangeControlController : Controller
    {
        //
        // GET: /ChangeControl/
        ChangeControlDMO ccDMO = new ChangeControlDMO();
        public ActionResult Index()
        {
            return View();
        }


        public ActionResult Create()
        {


            ChangeControlViewModel cc = new ChangeControlViewModel();
            try
            {
                cc.OwnerID = (int)Session[GlobalVars.SESSION_USERID];
                ccDMO.InsertChangeControl(cc);
                return RedirectToAction("Edit", new { issueID = cc.PlanNumber });
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + cc.PlanNumber.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                Functions.WriteEvent(@User.Identity.Name + "\r\n Create - Change Control\r\n" + cc.PlanNumber.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = cc.PlanNumber, UserID = @User.Identity.Name, DocumentType = "Change Control", OperationType = "Error", Comments = "Create - " + exceptionString });
                throw new Exception(e.Message);

            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="cc"></param>
        /// <returns></returns>
        public ActionResult Edit(int issueID)
        {
            int isITARCompliant = 1;
            ChangeControlViewModel cc = new ChangeControlViewModel();
            cc = ccDMO.GetChangeControlRead(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);

            List<ApproversListViewModel> userList = MiscDMO.GetApproversListByDocument(cc.PlanNumber, cc.CurrentStep, (int)GlobalVars.DocumentType.ChangeControl);
            ApproversListViewModel appUser = userList.Find(delegate (ApproversListViewModel al) { return al.UserID == (int)Session[GlobalVars.SESSION_USERID]; });
            if (appUser != null)
            {
                ViewBag.IsApprover = "true";
            }
            //TODO locked functionality


            if (isITARCompliant == 0) // not ITAR Compliant
            {
                return View("UnAuthorizedAccess");
            }
            else
            {

                if ((int)Session[GlobalVars.SESSION_USERID] == cc.OwnerID)
                    ViewBag.IsOriginator = "true";
                else
                    ViewBag.IsOriginator = "false";


                if ((cc.RecordLockIndicator && cc.RecordLockedBy != (int)Session[GlobalVars.SESSION_USERID]) ||
                    cc.ClosedDate != null)
                {
                    return RedirectToAction("ReadOnlyCC", new { issueID = issueID });
                }
                else
                {
                    cc = ccDMO.GetChangeControl(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);
                    ViewBag.Attendees = ccDMO.GetUsers();
                    ViewBag.Generations = ccDMO.GetGenerations();
                    ViewBag.PartNumbers = ccDMO.GetPartNumbers();
                    //ViewBag.ToolTypes = ccDMO.GetToolTypes();
                    //ViewBag.MeetingList = ccDMO.GetMeetingList(issueID);
                    ViewBag.Processes = ccDMO.GetProcesses();
                    ViewBag.Logistics = ccDMO.GetLogistics();
                    ViewBag.AIResponsibles = ccDMO.GetActionItemResponsible();
                    ViewBag.Sites = ccDMO.GetSites();
                    return View(cc);
                }
            }
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="issueID"></param>
        /// <returns></returns>
        public ActionResult ReadOnlyCC(int issueID)
        {
            int isITARCompliant = 1;
            ChangeControlViewModel cc = new ChangeControlViewModel();
            cc = ccDMO.GetChangeControlRead(issueID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);
            //TODO locked functionality

            if (isITARCompliant == 0) // not ITAR Compliant
            {
                return View("UnAuthorizedAccess");
            }
            else
            {
                ViewBag.MeetingList = ccDMO.GetMeetingList(issueID);
                ViewBag.Generations = ccDMO.GetGenerations();
                ViewBag.PartNumbers = ccDMO.GetPartNumbers();
                //ViewBag.ToolTypes = ccDMO.GetToolTypes();
                ViewBag.Processes = ccDMO.GetProcesses();
                ViewBag.Logistics = ccDMO.GetLogistics();
                return View(cc);

            }
        }



        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Edit(ChangeControlViewModel model)
        {
            try
            {

                var data = model;
                ccDMO.UpdateChangeControl(model, (int)Session[GlobalVars.SESSION_USERID]);
                ViewBag.AIResponsibles = ccDMO.GetActionItemResponsible();
            }
            catch (Exception ex)
            {
                return Content(ex.Message);
            }

            return Content("Successfully Saved");
        }

        public int GetUserIDByDisplayName(string displayName)
        {
            try
            {

                var UserList = ccDMO.GetUsers();

                int UserID = (from a in UserList where a.AttendeeName.Equals(displayName) select a.AttendeeID).First();

                return UserID;
            }
            catch (Exception ex)
            {
                return 0;
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="searchText"></param>
        /// <returns></returns>
        public JsonResult SearchParts(string searchText)
        {
            List<String> partList = MiscDMO.SearchLTParts(searchText.Trim()).Select(x => x.WIPPartData).ToList<String>();
            return Json(partList, JsonRequestBehavior.AllowGet);
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="planNumber"></param>
        /// <returns></returns>
        public ActionResult GetCCAttachments([DataSourceRequest] DataSourceRequest request, int planNumber)
        {
            return Json(ccDMO.GetCCAttachment(planNumber).ToDataSourceResult(request));
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult UpdateCCAttachment([DataSourceRequest] DataSourceRequest request, CCAttachment model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.UpdateCCAttachemnt(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeleteCCAttachment([DataSourceRequest] DataSourceRequest request, CCAttachment model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.DeleteCCAttachemnt(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }


        public ActionResult InsertCCAttachmentItem([DataSourceRequest] DataSourceRequest request, CCAttachment model)
        {

            if (model != null && ModelState.IsValid)
            {
                model = ccDMO.InsertCCAttachment(model);
            }


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



        /// <summary>
        /// 
        /// </summary>
        /// <param name="files"></param>
        /// <param name="planNumber"></param>
        /// <param name="title"></param>
        /// <returns></returns>

        public ActionResult AttachSaveCC(IEnumerable<HttpPostedFileBase> files, int planNumber, int attachID)
        {
            // The Name of the Upload component is "files"
            if (files != null)
            {
                foreach (var file in files)
                {
                    // Some browsers send file names with full path.
                    // We are only interested in the file name.


                    var fileName = Path.GetFileName(file.FileName);
                    var fileExtension = Path.GetExtension(file.FileName);
                    //var physicalPath = Path.Combine(Server.MapPath("~/UserUploads"), fileName);       
                    DirectoryInfo di;
                    var ccPhysicalPath = Functions.GetAttachmentFolder() + @"ChangeControl\" + planNumber;
                    di = new DirectoryInfo(ccPhysicalPath);
                    if (!di.Exists)
                        di.Create();


                    var guid = Guid.NewGuid().ToString();
                    var physicalPath = Path.Combine(Functions.GetAttachmentFolder() + @"ChangeControl\" + planNumber + @"\", guid + fileExtension);


                    file.SaveAs(physicalPath);
                    CCAttachment attach = new CCAttachment()
                    {
                        ID = attachID,
                        FileGUID = guid,
                        FileName = fileName,
                        UploadedByID = (int)Session[GlobalVars.SESSION_USERID]
                        //Title = title,
                        //RequirementsNotes = requirementsNotes
                    };


                    //ccDMO.InsertCCAttachment(attach);
                    ccDMO.UpdateCCAttachmentDocument(attach);
                }
            }
            return Content("");
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="planNumber"></param>
        /// <returns></returns>
        public ActionResult GetMeetingDecisionSummaryList([DataSourceRequest] DataSourceRequest request, int planNumber)
        {
            return Json(ccDMO.GetMeetingDecisionSummaryList(planNumber).ToDataSourceResult(request));
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="meetingID"></param>
        /// <returns></returns>
        public ActionResult GetMeetingAttachments([DataSourceRequest] DataSourceRequest request, int meetingID)
        {
            return Json(ccDMO.GetMeetingAttachments(meetingID).ToDataSourceResult(request));
        }
        public ActionResult GetPCRB([DataSourceRequest] DataSourceRequest request, int PlanNumber, string PCRB)
        {
            return Json(ccDMO.GetPCRB(PlanNumber, PCRB).ToDataSourceResult(request));
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult UpdateMeetingAttachmentAttrib([DataSourceRequest] DataSourceRequest request, CCMeetingAttachment model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.UpdateMeetingAttachmentAttrib(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeleteMeetingAttachment([DataSourceRequest] DataSourceRequest request, CCMeetingAttachment model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.DeleteMeetingAttachemnt(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }


        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult InsertMeetingAttachmentItemAttrib([DataSourceRequest] DataSourceRequest request, CCMeetingAttachment model)
        {

            if (model != null && ModelState.IsValid)
            {
                model = ccDMO.InsertMeetingAttachmentAttrib(model);
            }


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



        /// <summary>
        /// 
        /// </summary>
        /// <param name="files"></param>
        /// <param name="planNumber"></param>
        /// <param name="meetingID"></param>
        /// <param name="attachID"></param>
        /// <returns></returns>
        public ActionResult AttachSaveMeeting(IEnumerable<HttpPostedFileBase> files, int planNumber, int meetingID, int attachID)
        {
            // The Name of the Upload component is "files"
            if (files != null)
            {
                foreach (var file in files)
                {
                    // Some browsers send file names with full path.
                    // We are only interested in the file name.


                    var fileName = Path.GetFileName(file.FileName);
                    var fileExtension = Path.GetExtension(file.FileName);
                    //var physicalPath = Path.Combine(Server.MapPath("~/UserUploads"), fileName);       
                    DirectoryInfo di;
                    var ccPhysicalPath = Functions.GetAttachmentFolder() + @"ChangeControl\" + planNumber;
                    di = new DirectoryInfo(ccPhysicalPath);
                    if (!di.Exists)
                        di.Create();


                    var guid = Guid.NewGuid().ToString();
                    var physicalPath = Path.Combine(Functions.GetAttachmentFolder() + @"ChangeControl\" + planNumber + @"\", guid + fileExtension);


                    file.SaveAs(physicalPath);
                    CCMeetingAttachment attach = new CCMeetingAttachment()
                    {
                        ID = attachID,
                        FileGUID = guid,
                        FileName = fileName,
                        UploadedByID = (int)Session[GlobalVars.SESSION_USERID]
                    };


                    //ccDMO.InsertCCAttachment(attach);
                    ccDMO.UpdateMeetingAttachmentDocument(attach);
                }
            }
            return Content("");
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileGuid"></param>
        /// <param name="planNumber"></param>
        /// <returns></returns>
        public FileResult DownloadCCFile(string fileGuid, int planNumber)
        {

            string fileName = ccDMO.GetCCFileName(fileGuid);

            string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));

            string ecnFolderPath = Functions.GetAttachmentFolder() + "ChangeControl\\" + planNumber.ToString();
            var sDocument = Path.Combine(ecnFolderPath, fileGuid + fileExtension);

            var FDir_AppData = Functions.GetAttachmentFolder();
            if (!sDocument.StartsWith(FDir_AppData))
            {
                // Ensure that we are serving file only inside the Fab2ApprovalAttachments folder
                // and block requests outside like "../web.config"
                throw new HttpException(403, "Forbidden");
            }

            if (!System.IO.File.Exists(sDocument))
            {
                return null;
                //throw new Exception("File not found");
            }

            return File(sDocument, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="planNumber"></param>
        /// <returns></returns>
        public ActionResult CreateMeeting(int planNumber)
        {

            try
            {

                int meetingID = ccDMO.InsertMeeting(planNumber);
                //return RedirectToAction("EditMeeting", new { meetingID = meetingID });
                return Content(meetingID.ToString());
                //return null;
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + planNumber.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                Functions.WriteEvent(@User.Identity.Name + "\r\n Create - Meeting\r\n" + planNumber.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = planNumber, UserID = @User.Identity.Name, DocumentType = "Meeting", OperationType = "Error", Comments = "Create - " + exceptionString });
                throw new Exception("Error: " + e.Message);

            }

        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="meetingID"></param>
        /// <returns></returns>
        public ActionResult EditMeeting(int meetingID)
        {


            int isITARCompliant = 1;
            CCMeeting meeting = new CCMeeting();
            meeting = ccDMO.GetMeetingRead(meetingID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);
            ViewBag.MeetingList = ccDMO.GetMeetingList(meeting.PlanNumber);
            //TODO locked functionality
            List<ApproversListViewModel> userList = MiscDMO.GetApproversListByDocument(meeting.PlanNumber, meeting.CurrentStep, (int)GlobalVars.DocumentType.ChangeControl);
            ApproversListViewModel appUser = userList.Find(delegate (ApproversListViewModel al) { return al.UserID == (int)Session[GlobalVars.SESSION_USERID]; });
            if (appUser != null)
            {
                ViewBag.IsApprover = "true";
            }

            if (isITARCompliant == 0) // not ITAR Compliant
            {
                return View("UnAuthorizedAccess");
            }
            else
            {

                if ((meeting.RecordLockIndicator && meeting.RecordLockedBy != (int)Session[GlobalVars.SESSION_USERID])
                    || (meeting.PCRBClosed))
                {
                    return RedirectToAction("ReadOnlyMeeting", new { meetingID = meetingID });
                }
                else if (meeting.Decision != -1)
                {
                    return RedirectToAction("EditMeetingUpdate", new { meetingID = meetingID });
                }
                else
                {
                    ViewBag.AIResponsibles = ccDMO.GetActionItemResponsible();
                    ViewBag.Attendees = ccDMO.GetUsers();
                    ViewBag.Sites = ccDMO.GetSites();
                    ViewBag.PCRValues = ccDMO.GetPCRValues();
                    meeting = ccDMO.GetMeeting(meetingID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);

                    return View(meeting);
                }
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="meetingID"></param>
        /// <returns></returns>
        public ActionResult ReadOnlyMeeting(int meetingID)
        {


            int isITARCompliant = 1;
            CCMeeting meeting = new CCMeeting();
            meeting = ccDMO.GetMeetingRead(meetingID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);
            ViewBag.MeetingList = ccDMO.GetMeetingList(meeting.PlanNumber);
            ViewBag.PCRValues = ccDMO.GetPCRValues();

            if (isITARCompliant == 0) // not ITAR Compliant
            {
                return View("UnAuthorizedAccess");
            }
            else
            {
                return View(meeting);
            }

        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="meeting"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult EditMeeting(CCMeeting meeting)
        {
            try
            {
                ccDMO.UpdateMeeting(meeting);
            }
            catch (Exception ex)
            {
                return Content(ex.Message);
            }

            return Content("Successfully Saved");


        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="meetingID"></param>
        /// <returns></returns>
        public ActionResult EditMeetingUpdate(int meetingID)
        {


            int isITARCompliant = 1;
            CCMeeting meeting = new CCMeeting();
            meeting = ccDMO.GetMeetingRead(meetingID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);
            ViewBag.MeetingList = ccDMO.GetMeetingList(meeting.PlanNumber);
            ViewBag.PCRValues = ccDMO.GetPCRValues();
            //TODO locked functionality
            List<ApproversListViewModel> userList = MiscDMO.GetApproversListByDocument(meeting.PlanNumber, meeting.CurrentStep, (int)GlobalVars.DocumentType.ChangeControl);
            ApproversListViewModel appUser = userList.Find(delegate (ApproversListViewModel al) { return al.UserID == (int)Session[GlobalVars.SESSION_USERID]; });
            if (appUser != null)
            {
                ViewBag.IsApprover = "true";
            }

            if (isITARCompliant == 0) // not ITAR Compliant
            {
                return View("UnAuthorizedAccess");
            }
            else
            {

                if ((meeting.RecordLockIndicator && meeting.RecordLockedBy != (int)Session[GlobalVars.SESSION_USERID])
                    || (meeting.PCRBClosed))
                {
                    return RedirectToAction("ReadOnlyMeeting", new { meetingID = meetingID });
                }
                else
                {
                    meeting = ccDMO.GetMeeting(meetingID, out isITARCompliant, (int)Session[GlobalVars.SESSION_USERID]);

                    ViewBag.AIResponsibles = ccDMO.GetActionItemResponsible();

                    return View(meeting);
                }
            }

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileGuid"></param>
        /// <param name="planNumber"></param>
        /// <returns></returns>
        public FileResult DownloadMeetingFile(string fileGuid, int planNumber)
        {

            string fileName = ccDMO.GetMeetingFileName(fileGuid);

            string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));

            string ecnFolderPath = Functions.GetAttachmentFolder() + "ChangeControl\\" + planNumber.ToString();
            var sDocument = Path.Combine(ecnFolderPath, fileGuid + fileExtension);

            var FDir_AppData = Functions.GetAttachmentFolder();
            if (!sDocument.StartsWith(FDir_AppData))
            {
                // Ensure that we are serving file only inside the Fab2ApprovalAttachments folder
                // and block requests outside like "../web.config"
                throw new HttpException(403, "Forbidden");
            }

            if (!System.IO.File.Exists(sDocument))
            {
                return null;
                //throw new Exception("File not found");
            }

            return File(sDocument, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="meetingID"></param>
        /// <returns></returns>
        public ActionResult GetDecisionsSummaryList([DataSourceRequest] DataSourceRequest request, int meetingID)
        {
            return Json(ccDMO.GetDecisionsSummaryList(meetingID).ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        //[AcceptVerbs(HttpVerbs.Post)]
        //public ActionResult UpdateDecisionsSummary([DataSourceRequest] DataSourceRequest request, CCDecisionSummary model)
        //{

        //    if (model != null && ModelState.IsValid)
        //    {
        //        ccDMO.UpdateDecisionSummary(model);
        //    }

        //    //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
        //    return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        //}



        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <param name="decisionNotes"></param>
        /// <returns></returns>
        public ActionResult UpdateMeetingDecisionNotes(CCDecisionSummary model)
        {
            try
            {
                ccDMO.UpdateDecisionSummary(model);

            }
            catch (Exception ex)
            {
                return Content(ex.Message);
            }
            return Content("Saved Succesfully");
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeleteDecisionsSummary([DataSourceRequest] DataSourceRequest request, CCDecisionSummary model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.DeleteDecisionSummary(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        //[AcceptVerbs(HttpVerbs.Post)]
        //public ActionResult InsertDecisionsSummary([DataSourceRequest] DataSourceRequest request, CCDecisionSummary model)
        //{

        //    if (model != null && ModelState.IsValid)
        //    {
        //        model = ccDMO.InsertDecisionSummary(model);
        //    }


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


        public ActionResult InsertDecisionsSummary(CCDecisionSummary model)
        {
            try
            {
                ccDMO.InsertDecisionSummary(model);

            }
            catch (Exception ex)
            {
                return Content(ex.Message);
            }
            return Content("Saved Succesfully");
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <param name="ecnLinks"></param>
        /// <param name="lotDispoLinks"></param>

        public ActionResult UpdateECN_LotDispoLinks(int id, string ecnLinks, string lotDispoLinks)
        {
            try
            {
                ccDMO.UpdateDecisionSummaryLinks(id, ecnLinks, lotDispoLinks);

            }
            catch (Exception ex)
            {
                return Content(ex.Message);
            }
            return Content("Saved Succesfully", "application/json");
        }
        public ActionResult GetMeetingList([DataSourceRequest] DataSourceRequest request, int planNumber)
        {
            var meetingList = ccDMO.GetMeetingList(planNumber);
            return Json(meetingList.ToDataSourceResult(request));
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="meetingID"></param>
        /// <returns></returns>
        /// 
        public ActionResult GetMeetingAttendees([DataSourceRequest] DataSourceRequest request, int meetingID)
        {
            return Json(ccDMO.GetMeetingAttendees(meetingID).ToDataSourceResult(request));
        }
        public ActionResult GetPCRBAttendees([DataSourceRequest] DataSourceRequest request, int PCRBID)
        {
            return Json(ccDMO.GetPCRBAttendees(PCRBID).ToDataSourceResult(request));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        //[AcceptVerbs(HttpVerbs.Post)]
        //public ActionResult UpdateMeetingAttendee([DataSourceRequest] DataSourceRequest request, CCMeetingAttendee model)
        //{

        //    if (model != null && ModelState.IsValid)
        //    {
        //        ccDMO.UpdateMeetingAttendee(model);
        //    }

        //    //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
        //    return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        //}
        public void InsertNewMeetingAttendee(string attendeeName, string jobTitle, string siteName)
        {
            try
            {
                //ccDMO.InsertNewMeetingAttendee(meetingId, attendeeName, jobTitle, siteName);
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                //string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                //Functions.WriteEvent(@User.Identity.Name + "\r\n UpdateMeetingAttendee - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                //EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = @User.Identity.Name, DocumentType = "Change Control", OperationType = "Error", Comments = "UpdateMeetingAttendee - " + exceptionString });
                //throw new Exception(e.Message);
            }
        }

        public void UpdateMeetingAttendee(int id, string attendeeName, string jobTitle, string siteName)
        {
            int docid = id;
            try
            {
                ccDMO.UpdateMeetingAttendee(id, attendeeName, jobTitle, siteName);
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                Functions.WriteEvent(@User.Identity.Name + "\r\n UpdateMeetingAttendee - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = @User.Identity.Name, DocumentType = "Change Control", OperationType = "Error", Comments = "UpdateMeetingAttendee - " + exceptionString });
                throw new Exception(e.Message);

            }

            //return Content("");
        }
        [HttpPost]
        public void UpdatePCRBAttendee(int id, int attendeeId, string jobTitle, string siteName)
        {
            int docid = id;

            try
            {
                ccDMO.UpdatePCRBAttendee(id, attendeeId, jobTitle, siteName);
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                Functions.WriteEvent(@User.Identity.Name + "\r\n UpdateMeetingAttendee - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = @User.Identity.Name, DocumentType = "Change Control", OperationType = "Error", Comments = "UpdateMeetingAttendee - " + exceptionString });
                throw new Exception(e.Message);

            }

            //return Content("");
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeleteMeetingAttendee([DataSourceRequest] DataSourceRequest request, CCMeetingAttendee model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.DeleteMeetingAttendee(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult InsertMeetingAttendee([DataSourceRequest] DataSourceRequest request,int pcrId, int attendeeId, string jobTitle, string siteName)
        {
            CCPCRBAttendee newAttendee = new CCPCRBAttendee();
            newAttendee.AttendeeID = attendeeId;
            newAttendee.PCRBID = pcrId;
            newAttendee.JobTitle = jobTitle;
            newAttendee.Location = siteName;

            try
            {

            ccDMO.InsertMeetingAttendee(newAttendee);


            }
            catch (Exception ex)
            {
                return Content(ex.Message.ToString());
            }

            return Content("1");


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





        public ActionResult GetMeetingActionItems([DataSourceRequest] DataSourceRequest request, int meetingID)
        {
            return Json(ccDMO.GetMeetingActionItems(meetingID).ToDataSourceResult(request));
        }
        public ActionResult GetPCRBActionItems([DataSourceRequest] DataSourceRequest request, int pcrbID)
        {
            return Json(ccDMO.GetPCRBActionItems(pcrbID).ToDataSourceResult(request));
        }


        public ActionResult GetMeetingActionItems_All([DataSourceRequest] DataSourceRequest request, int planNumber)
        {
            return Json(ccDMO.GetMeetingActionItems_All(planNumber).ToDataSourceResult(request));
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        //public ActionResult InsertMeetingActionItem([DataSourceRequest] DataSourceRequest request, CCMeetingActionItem model)
        //{

        //    if (model != null && ModelState.IsValid)
        //    {
        //        ccDMO.InsertMeetingActionItem(model);
        //    }


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

        public ActionResult InsertPCRBActionItem(CCPCRBActionItem model)
        {
            try
            {
                if (model != null)
                {
                    ccDMO.InsertPCRBActionItem(model);
                }


            }
            catch (Exception ex)
            {
                return Content(ex.Message.ToString());
            }

            return Content("1");
        }
        public ActionResult InsertMeetingActionItem(CCMeetingActionItem model)
        {
            try
            {
                if (model != null)
                {
                    ccDMO.InsertMeetingActionItem(model);
                }


            }
            catch (Exception ex)
            {
                return Content(ex.Message.ToString());
            }

            return Content("1");
        }
        public ActionResult InsertPCRBAttendee([DataSourceRequest] DataSourceRequest request, int pcrId, int attendeeId, string jobTitle, string siteName)
        {
            CCPCRBAttendee newAttendee = new CCPCRBAttendee();
            newAttendee.AttendeeID = attendeeId;
            newAttendee.PCRBID = pcrId;
            newAttendee.JobTitle = jobTitle;
            newAttendee.Location = siteName;

            try
            {

                ccDMO.InsertPCRBAttendee(newAttendee);


            }
            catch (Exception ex)
            {
                return Content(ex.Message.ToString());
            }

            return Content("1");


            //return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }
        public ActionResult UpdatePCRBActionItem(CCPCRBActionItem model)
        {
            try
            {
                if (model != null)
                {
                    ccDMO.UpdatePCRBActionItem(model);
                }
            }
            catch (Exception ex)
            {
                return Content(ex.Message.ToString());
            }

            return Content("1");
        }

        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult UpdateMeetingActionItemAll([DataSourceRequest] DataSourceRequest request, CCMeetingActionItemAll model)
        {
            if (model != null && ModelState.IsValid)
            {
                model.ClosedBy = (int)Session[GlobalVars.SESSION_USERID];
                ccDMO.UpdateMeetingActionItem_All(model);
            }
            if (model.ClosedStatus)
                model.ClosedDate = DateTime.Now;
            else
                model.ClosedDate = null;

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



        public ActionResult UpdateMeetingActionItem(CCMeetingActionItem model)
        {
            try
            {
                if (model != null)
                {
                    ccDMO.UpdateMeetingActionItem(model);
                }
            }
            catch (Exception ex)
            {
                return Content(ex.Message.ToString());
            }

            return Content("1");
        }

        [HttpPost]
        public ActionResult ReassignMeetingActionItemResponsiblePersons(int meetingActionItemId, string newResponsiblePersonIDs, string comments)
        {
            if (Session[GlobalVars.IS_ADMIN] == null)
                throw new Exception("Permission denied");

            try
            {
                ccDMO.ReassignMeetingActionItemResponsiblePersons(meetingActionItemId, newResponsiblePersonIDs, comments, (int)Session[GlobalVars.SESSION_USERID]);
            }
            catch (Exception ex)
            {
                return Content(ex.Message.ToString());
            }

            return Content("1");
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>


        /// <summary>
        /// 
        /// </summary>
        /// <param name="request"></param>
        /// <param name="model"></param>
        /// <returns></returns>
        [AcceptVerbs(HttpVerbs.Post)]
        public ActionResult DeleteMeetingActionItem([DataSourceRequest] DataSourceRequest request, CCMeetingActionItem model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.DeleteMeetingActionItem(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }
        public ActionResult DeletePCRBActionItem([DataSourceRequest] DataSourceRequest request, CCPCRBActionItem model)
        {

            if (model != null && ModelState.IsValid)
            {
                ccDMO.DeletePCRBActionItem(model);
            }

            //lot.LotStatusOptionID = lot.LotStatusOption.LotStatusOptionID;
            return Json(new[] { model }.ToDataSourceResult(request, ModelState));
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="planNumber"></param>
        public void CompleteCC(int planNumber)
        {
            int docid = planNumber;
            try
            {
                ccDMO.CompleteCC(planNumber);
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                Functions.WriteEvent(@User.Identity.Name + "\r\n CompleteCC - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = @User.Identity.Name, DocumentType = "Change Control", OperationType = "Error", Comments = "CompleteCC - " + exceptionString });
                throw new Exception(e.Message);

            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="planNumber"></param>
        public void CancelCC(int planNumber)
        {
            int docid = planNumber;
            try
            {
                ccDMO.CancelCC(planNumber);
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                string exceptionString = e.Message.ToString().Trim().Length > 500 ? "Issue=" + docid.ToString() + e.Message.ToString().Substring(0, 250) : e.Message.ToString();
                Functions.WriteEvent(@User.Identity.Name + "\r\n CompleteCC - Change Control\r\n" + docid.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = docid, UserID = @User.Identity.Name, DocumentType = "Change Control", OperationType = "Error", Comments = "CancelCC - " + exceptionString });
                throw new Exception(e.Message);

            }
        }


        public ActionResult AttachSaveActionItem(IEnumerable<HttpPostedFileBase> AIfiles, int planNumber, int attachID)
        {
            // The Name of the Upload component is "files"
            if (AIfiles != null)
            {
                foreach (var file in AIfiles)
                {
                    // Some browsers send file names with full path.
                    // We are only interested in the file name.


                    var fileName = Path.GetFileName(file.FileName);
                    var fileExtension = Path.GetExtension(file.FileName);
                    //var physicalPath = Path.Combine(Server.MapPath("~/UserUploads"), fileName);       
                    DirectoryInfo di;
                    var ccPhysicalPath = Functions.GetAttachmentFolder() + @"ChangeControl\" + planNumber;
                    di = new DirectoryInfo(ccPhysicalPath);
                    if (!di.Exists)
                        di.Create();


                    var guid = Guid.NewGuid().ToString();
                    var physicalPath = Path.Combine(Functions.GetAttachmentFolder() + @"ChangeControl\" + planNumber + @"\", guid + fileExtension);


                    file.SaveAs(physicalPath);
                    CCMeetingActionItemAll attach = new CCMeetingActionItemAll()
                    {
                        ID = attachID,
                        FileGUID = guid,
                        FileName = fileName,
                        UploadedByID = (int)Session[GlobalVars.SESSION_USERID]

                    };


                    //ccDMO.InsertCCAttachment(attach);
                    ccDMO.UpdateActionItemAttachment(attach);
                }
            }
            return Content("");
        }


        /// <summary>
        /// 
        /// </summary>
        /// <param name="fileGuid"></param>
        /// <param name="planNumber"></param>
        /// <returns></returns>
        public FileResult DownloadActionItemFile(string fileGuid, int planNumber)
        {

            string fileName = ccDMO.GetActionItemFileName(fileGuid);

            string fileExtension = fileName.Substring(fileName.LastIndexOf("."), fileName.Length - fileName.LastIndexOf("."));

            string ecnFolderPath = Functions.GetAttachmentFolder() + "ChangeControl\\" + planNumber.ToString();
            var sDocument = Path.Combine(ecnFolderPath, fileGuid + fileExtension);

            var FDir_AppData = Functions.GetAttachmentFolder();
            if (!sDocument.StartsWith(FDir_AppData))
            {
                // Ensure that we are serving file only inside the Fab2ApprovalAttachments folder
                // and block requests outside like "../web.config"
                throw new HttpException(403, "Forbidden");
            }

            if (!System.IO.File.Exists(sDocument))
            {
                return null;
                //throw new Exception("File not found");
            }

            return File(sDocument, System.Net.Mime.MediaTypeNames.Application.Octet, fileName);
        }


        public void UpdateMeetingNotes(int meetingID, string notes)
        {
            ccDMO.UpdateMeetingNotes(meetingID, notes);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="planNumber"></param>
        public void ReleaseLockOnDocument(int planNumber)
        {
            ccDMO.ReleaseLockOnDocument((int)Session[GlobalVars.SESSION_USERID], planNumber);

            try
            {
                ccDMO.ReleaseLockOnDocument((int)Session[GlobalVars.SESSION_USERID], planNumber);
            }
            catch (Exception e)
            {

                try
                {
                    Functions.WriteEvent(@User.Identity.Name + "\r\n ReleaseLockOnDocument LD\r\n" + planNumber.ToString() + "\r\n" + e.Message, System.Diagnostics.EventLogEntryType.Error);
                }
                catch { }
                ccDMO.ReleaseLockOnDocument(-1, planNumber);

            }

        }

        public JsonResult GetAllUsersList()
        {
            //var userList = ldDMO.GetApprovedApproversList(issueID, currentStep);
            //return Json(userList, JsonRequestBehavior.AllowGet);

            UserAccountDMO userDMO = new UserAccountDMO();
            IEnumerable<LoginModel> userlist = userDMO.GetAllUsers();
            return Json(userlist, JsonRequestBehavior.AllowGet);

        }

        [HttpPost]
        public void ReAssignOwnerByAdmin(string planNumber, string comments, int newOwnerId)
        {
            if (Session[GlobalVars.IS_ADMIN] == null)
                throw new Exception("Permission denied");

            int planNumberInt = 0;

            try
            {
                // remove non-numeric characters from Plan # then convert to int
                planNumberInt = Int32.Parse(new String(planNumber.Where<char>(c => char.IsNumber(c)).ToArray()));

                ccDMO.ReassignOwner(planNumberInt, newOwnerId, comments, (int)Session[GlobalVars.SESSION_USERID]);
            }
            catch (Exception e)
            {
                string detailedException = "";
                try
                {
                    detailedException = e.InnerException.ToString();
                }
                catch
                {
                    detailedException = e.Message;
                }
                string exceptionString = e.Message.ToString().Trim();
                if (exceptionString.Length > 450) exceptionString = exceptionString.Substring(0, 450);
                Functions.WriteEvent(@User.Identity.Name + "\r\n ReAssignOwnerByAdmin\r\n" + planNumber.ToString() + "\r\n" + detailedException, System.Diagnostics.EventLogEntryType.Error);
                EventLogDMO.Add(new WinEventLog() { IssueID = planNumberInt, UserID = @User.Identity.Name, DocumentType = "ChangeControl", OperationType = "Error", Comments = "ReAssignOwnerByAdmin - " + exceptionString });
                throw new Exception(e.Message);
            }
        }
        public ActionResult GetPCRBMesaTitle(int issueID)
        {
            int isItarCompliant = 1;
            ChangeControlViewModel cc = ccDMO.GetChangeControlRead(issueID, out isItarCompliant, (int)Session[GlobalVars.SESSION_USERID]);
            string content = cc.PlanTitle;
            return Content(content);
        }
    
    }
}