using Foresight.Data;
using Foresight.Fleet.Services.Asset;
using Foresight.Fleet.Services.AssetHealth;
using Foresight.Fleet.Services.Attachment;
using Foresight.Fleet.Services.JobSite;
using Foresight.ServiceModel;
using IronIntel.Contractor.Attachment;
using IronIntel.Contractor.JobSites;
using IronIntel.Contractor.Machines;
using IronIntel.Contractor.Maintenance;
using IronIntel.Contractor.MapView;
using IronIntel.Contractor.Users;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Web;

namespace IronIntel.Contractor.Site.Maintenance
{
    public class WorkOrderBasePage : ContractorBasePage
    {
        protected void ProcessRequest(string methodName)
        {
            object result = null;

            if (methodName != null)
            {
                switch (methodName.ToUpper())
                {
                    case "GETWORKORDERS":
                        result = GetWorkOrders();
                        break;
                    case "SAVEWORKORDER":
                        result = SaveWorkOrder();
                        break;
                    case "DELETEWORKORDER":
                        result = DeleteWorkOrder();
                        break;
                    case "GETCONTACTS":
                        result = GetContacts();
                        break;
                    case "GETMACHINES":
                        result = GetMachines();
                        break;
                    case "GETWORKORDERINFO":
                        result = GetWorkOrderInfo();
                        break;
                    case "GETOPENWORKORDERID":
                        result = GetOpenWorkOrderID();
                        break;
                    case "GETSEGMENTS":
                        result = GetSegments();
                        break;
                    case "SAVESEGMENT":
                        result = SaveSegment();
                        break;
                    case "DELETESEGMENT":
                        result = DeleteSegment();
                        break;
                    case "GETSEGMENTCLIENT":
                        result = GetSegmentClient();
                        break;
                    case "GETNONEASSIGNEDALERTS":
                        result = GetNoneAssignedAlerts();
                        break;
                    case "ADDORREMOVEALERTSFROMWORKORDER":
                        result = AddOrRemoveAlertsFromWorkOrder();
                        break;
                    case "GETATTACHMENTS":
                        result = GetAttachments();
                        break;
                    case "ADDATTACHMENT":
                        result = AddAttachment();
                        break;
                    case "DELETEATTACHMENT":
                        result = DeleteAttachment();
                        break;
                    case "GETASSETATTACHMENTS":
                        result = GetAssetAttachments();
                        break;
                    case "GETMACHINECONTACTS":
                        result = GetMachineContacts();
                        break;
                    case "SENDWORKORDER":
                        result = SendWorkOrder();
                        break;
                    case "GETINVOICENUMBER":
                        result = GetInvoiceNumber();
                        break;
                    case "GETALERTSFORWORKORDER":
                        result = GetAlertsForWorkOrder();
                        break;
                }
            }

            string json = JsonConvert.SerializeObject(result);
            Response.Write(json);
            Response.End();
        }

        private object GetWorkOrders()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    var clientdata = Request.Form["ClientData"];
                    clientdata = HttpUtility.HtmlDecode(clientdata);
                    WorkOrderQueryParams p = JsonConvert.DeserializeObject<WorkOrderQueryParams>(clientdata);

                    WorkOrderItem[] workorders = null;
                    if (p.AssetID > 0)
                        workorders = CreateClient<WorkOrderClient>().GetWorkOrderItemsByAsset(SystemParams.CompanyID, p.AssetID);
                    else
                        workorders = CreateClient<WorkOrderClient>().GetWorkOrderItems(SystemParams.CompanyID, p.Contacts, p.Status, p.AssetGroups, p.SearchText, session.User.UID);

                    WorkOrderInfo[] maintenanceworkorders = null;//
                    if (p.ShowMaintenance)
                        maintenanceworkorders = MaintenanceManagement.GetMaintenanceWorkOrders(session.SessionID, SystemParams.CompanyID, p.Contacts, p.AssetGroups, p.SearchText, session.User.UID);

                    //普通用户机器权限过滤
                    var user = GetCurrentUser();
                    long[] availableAssetsids = null;
                    if (user.UserType < UserTypes.Admin)
                        availableAssetsids = CreateClient<AssetQueryClient>().GetAvailableAssetsForUsers(SystemParams.CompanyID, session.User.UID);

                    List<WorkOrderInfo> list = new List<WorkOrderInfo>();

                    if (maintenanceworkorders != null)
                    {
                        foreach (WorkOrderInfo wi in maintenanceworkorders)
                        {
                            if (availableAssetsids != null && !availableAssetsids.Contains(wi.AssetID))
                                continue;

                            list.Add(wi);
                        }
                    }

                    foreach (WorkOrderItem wo in workorders)
                    {
                        WorkOrderInfo wi = new WorkOrderInfo();
                        Helper.CloneProperty(wi, wo);
                        if (availableAssetsids != null && !availableAssetsids.Contains(wi.AssetID))
                            continue;

                        list.Add(wi);
                    }

                    return list.OrderBy(m => m.ID).ToArray();
                }
                else
                    return new WorkOrderInfo[0];

            }
            catch (Exception ex)
            {
                AddLog("ERROR", "WorkOrderBasePage.GetWorkOrders", ex.Message, ex.ToString());
                return ex.Message;
            }
        }


        private object GetWorkOrderInfo()
        {
            try
            {
                if (GetCurrentLoginSession() != null)
                {
                    var woid = Request.Form["ClientData"];

                    WorkOrderDetail wod = CreateClient<WorkOrderClient>().GetWorkOrderDetail(SystemParams.CompanyID, Convert.ToInt64(woid));

                    WorkOrderDetailInfo wo = new WorkOrderDetailInfo();
                    Helper.CloneProperty(wo, wod);
                    return wo;
                }
                else
                    return new WorkOrderDetailInfo();
            }
            catch (Exception ex)
            {
                AddLog("ERROR", "WorkOrderBasePage.GetWorkOrderInfo", ex.Message, ex.ToString());
                return ex.Message;
            }
        }

        private object GetAlertsForWorkOrder()
        {
            try
            {
                if (GetCurrentLoginSession() != null)
                {
                    var clientdata = Request.Form["ClientData"];
                    clientdata = HttpUtility.HtmlDecode(clientdata);
                    string[] ps = JsonConvert.DeserializeObject<string[]>(clientdata);

                    var woid = ps[0];
                    var aid = ps[1];
                    long workorderid = Convert.ToInt64(woid);
                    long assetid = Convert.ToInt64(aid);
                    AlertManager am = new AlertManager(SystemParams.DataDbConnectionString);
                    AlertInfo[] alerts = am.GetAlertsByWorkOrder(workorderid);

                    AssetAlertItem[] aAlerts = CreateClient<WorkOrderClient>().GetNoneAssignedAlerts(SystemParams.CompanyID, assetid);
                    List<AlertInfo> assetAlerts = new List<AlertInfo>();
                    if (aAlerts != null)
                    {
                        foreach (var aa in aAlerts)
                        {
                            AlertInfo ai = new AlertInfo();
                            ai.AlertID = aa.ID;
                            ai.MachineID = aa.AssetID;
                            ai.AlertType = aa.AlertType;
                            ai.Description = aa.Description;
                            ai.AlertTime_UTC = aa.AlertTime;
                            assetAlerts.Add(ai);
                        }
                    }

                    WorkorderAlerts wa = new WorkorderAlerts();
                    wa.Alerts = alerts;
                    wa.AssetAlerts = assetAlerts.ToArray(); ;

                    return wa;
                }
                else
                    return null;
            }
            catch (Exception ex)
            {
                AddLog("ERROR", "AlertsBasePage.GetAlertsByWorkOrder", ex.Message, ex.ToString());
                return ex.Message;
            }
        }

        private object GetOpenWorkOrderID()
        {
            try
            {
                if (GetCurrentLoginSession() != null)
                {
                    var mid = Request.Form["ClientData"];
                    long aid = 0;
                    long.TryParse(mid, out aid);

                    var wos = CreateClient<WorkOrderClient>().GetWorkOrderItemsByAsset(SystemParams.CompanyID, aid);
                    List<long> workorderids = new List<long>();
                    foreach (var wo in wos)
                    {
                        if (!wo.Completed)
                            workorderids.Add(wo.ID);
                    }
                    //WorkOrderManager workordermanager = new WorkOrderManager(SystemParams.DataDbConnectionString);
                    //long[] workorderids = workordermanager.GetOpenWorkOrderID(mid);
                    string ids = string.Join(", ", workorderids);
                    ids = mid + "|" + ids;
                    return ids;
                }
                else
                    return new WorkOrderInfo();
            }
            catch (Exception ex)
            {
                AddLog("ERROR", "WorkOrderBasePage.GetOpenWorkOrderID", ex.Message, ex.ToString());
                return ex.Message;
            }
        }

        private object SaveWorkOrder()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    var clientdata = Request.Form["ClientData"].Split((char)170);
                    var workorderitem = HttpUtility.HtmlDecode(clientdata[0]);
                    var ids = HttpUtility.HtmlDecode(clientdata[1]);
                    long[] alertids = JsonConvert.DeserializeObject<long[]>(ids);

                    WorkOrderDetailInfo wdi = JsonConvert.DeserializeObject<WorkOrderDetailInfo>(workorderitem);
                    if (wdi.CompleteDate != null)
                        wdi.Status = "Completed";

                    WorkOrderDetail wo = new WorkOrderDetail();
                    Helper.CloneProperty(wo, wdi);

                    long workorderid = wo.ID;
                    if (wo.ID == -1)
                    {
                        wo = CreateClient<WorkOrderClient>().AddNewWorkOrder(SystemParams.CompanyID, wo, alertids, session.User.UID);
                        workorderid = wo.ID;
                    }
                    else
                    {
                        WorkOrderDetail oldwo = CreateClient<WorkOrderClient>().GetWorkOrderDetail(SystemParams.CompanyID, workorderid);
                        var user = UserManagement.GetUserByIID(session.User.UID);
                        if (oldwo.Status == "Completed" && user.UserType < UserTypes.Admin)
                        {
                            return "";
                        }
                        CreateClient<WorkOrderClient>().UpdateWorkOrder(SystemParams.CompanyID, wo, session.User.UID);
                    }

                    return workorderid;
                }
                else
                    return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private object DeleteWorkOrder()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    string clientdata = Request.Form["ClientData"];
                    int id = Convert.ToInt32(HttpUtility.HtmlDecode(clientdata));

                    CreateClient<WorkOrderClient>().DeleteWorkOrder(SystemParams.CompanyID, id, session.User.UID);

                    return "OK";
                }
                return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message; ;
            }
        }

        private UserInfo[] GetContacts()
        {
            var session = GetCurrentLoginSession();
            UserInfo[] users = null;
            if (GetCurrentLoginSession() != null)
            {
                //contact = ContactManagement.GetContacts();
                users = UserManagement.GetActiveUsers(session.SessionID);
                users = users.OrderBy(u => u.DisplayName).ToArray();
            }
            else
            {
                users = new UserInfo[0];
            }
            return users;
        }

        private MachineItem[] GetMachines()
        {
            var session = GetCurrentLoginSession();
            MachineItem[] machines = null;
            if (GetCurrentLoginSession() != null)
            {
                machines = MachineManagement.GetMachines(session.SessionID, session.User.UID, "");
            }
            else
            {
                machines = new MachineItem[0];
            }
            return machines.Where(m => m.Hide == false).OrderBy(m => m.ShowName).ToArray();
        }


        private object GetNoneAssignedAlerts()
        {
            try
            {
                if (GetCurrentLoginSession() != null)
                {
                    var id = Request.Form["ClientData"];
                    long assetid = Convert.ToInt64(id);

                    AssetAlertItem[] alerts = CreateClient<WorkOrderClient>().GetNoneAssignedAlerts(SystemParams.CompanyID, assetid);
                    if (alerts == null || alerts.Length == 0)
                        return new AssetAlertInfo[0];

                    List<AssetAlertInfo> list = new List<AssetAlertInfo>();
                    foreach (AssetAlertItem alert in alerts)
                    {
                        AssetAlertInfo ai = new AssetAlertInfo();
                        Helper.CloneProperty(ai, alert);
                        ai.AlertTime = ai.AlertTime.ToLocalTime();
                        ai.CompletedDate = ai.AlertTime.ToLocalTime();
                        list.Add(ai);
                    }
                    return list.ToArray();
                }
                else
                    return new AssetAlertInfo[0];
            }
            catch (Exception ex)
            {
                AddLog("ERROR", "AlertsBasePage.GetNoneAssignedAlerts", ex.Message, ex.ToString());
                return ex.Message;
            }
        }

        private object AddOrRemoveAlertsFromWorkOrder()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    var clientdata = Request.Form["ClientData"].Split((char)170);
                    var woid = HttpUtility.HtmlDecode(clientdata[0]);
                    var ids = HttpUtility.HtmlDecode(clientdata[1]);
                    var isaddstr = HttpUtility.HtmlDecode(clientdata[2]);
                    bool isadd = Helper.IsTrue(isaddstr);
                    long[] alertids = JsonConvert.DeserializeObject<long[]>(ids);


                    CreateClient<WorkOrderClient>().AddOrRemoveAlertsFromWorkOrder(SystemParams.CompanyID, Convert.ToInt64(woid), alertids, isadd, session.User.UID);

                    return "OK";
                }
                else
                    return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }


        #region Segment

        private object GetSegmentClient()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    SegmentClient client = new SegmentClient();

                    client.Users = UserManagement.GetUsers();
                    if (client.Users == null)
                        client.Users = new UserInfo[0];

                    var jss = CreateClient<JobSiteProvider>().GetJobSiteItems(SystemParams.CompanyID, "", false);
                    List<JobSiteViewItem> list = new List<JobSiteViewItem>();
                    foreach (var js in jss)
                    {
                        JobSiteViewItem item = new JobSiteViewItem();
                        item.ID = js.ID;
                        item.Name = js.Name;

                        list.Add(item);
                    }

                    client.JobSites = list.ToArray();
                    if (client.JobSites == null)
                        client.JobSites = new JobSiteViewItem[0];

                    return client;
                }
                else
                    return new SegmentClient();
            }
            catch (Exception ex)
            {
                AddLog("ERROR", "WorkOrderBasePage.GetSegmentClient", ex.Message, ex.ToString());
                return ex.Message;
            }
        }

        private object GetSegments()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    string clientdata = Request.Form["ClientData"];
                    long woid = Convert.ToInt64(HttpUtility.HtmlDecode(clientdata));

                    WorkOrderSegmentItem[] segments = CreateClient<WorkOrderClient>().GetSegments(SystemParams.CompanyID, woid);
                    if (segments == null || segments.Length == 0)
                        return new SegmentInfo[0];

                    List<SegmentInfo> list = new List<SegmentInfo>();
                    foreach (WorkOrderSegmentItem se in segments)
                    {
                        SegmentInfo si = new SegmentInfo();
                        Helper.CloneProperty(si, se);
                        list.Add(si);
                    }
                    return list.ToArray();
                }
                else
                    return new SegmentInfo[0];

            }
            catch (Exception ex)
            {
                AddLog("ERROR", "WorkOrderBasePage.GetSegments", ex.Message, ex.ToString());
                return ex.Message;
            }
        }

        private object SaveSegment()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    string clientdata = Request.Form["ClientData"];
                    SegmentInfo si = JsonConvert.DeserializeObject<SegmentInfo>(clientdata);
                    if (si.CompletedDate != null)
                        si.Completed = true;

                    WorkOrderSegmentItem segment = new WorkOrderSegmentItem();
                    Helper.CloneProperty(segment, si);

                    long segmentid = segment.SegmentID;
                    if (segmentid == -1)
                    {
                        segment = CreateClient<WorkOrderClient>().AddSegment(SystemParams.CompanyID, segment, session.User.UID);
                        segmentid = segment.SegmentID;
                    }
                    else
                    {
                        CreateClient<WorkOrderClient>().UpdateSegment(SystemParams.CompanyID, segment, session.User.UID);
                    }

                    return segmentid;
                }
                else
                    return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private object DeleteSegment()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    string clientdata = Request.Form["ClientData"];
                    int id = Convert.ToInt32(HttpUtility.HtmlDecode(clientdata));

                    CreateClient<WorkOrderClient>().DeleteSegment(SystemParams.CompanyID, id, session.User.UID);

                    return "OK";
                }
                return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message; ;
            }
        }


        #endregion

        #region Attachment

        private object GetAttachments()
        {
            try
            {
                if (GetCurrentLoginSession() != null)
                {
                    var clientdata = Request.Form["ClientData"].Split((char)170);
                    var woid = HttpUtility.HtmlDecode(clientdata[0]);

                    AttachmentInfo[] atts = CreateClient<AttachmentClient>().GetAttachments(SystemParams.CompanyID, "WorkOrder", woid);
                    if (atts == null || atts.Length <= 0)
                        return new AttachmentItem[0];

                    List<AttachmentItem> list = new List<AttachmentItem>();
                    foreach (AttachmentInfo att in atts)
                    {
                        AttachmentItem item = new AttachmentItem();
                        Helper.CloneProperty(item, att);
                        item.AddedOn = item.AddedOn.AddHours(SystemParams.GetHoursOffset());
                        list.Add(item);
                    }
                    return list.OrderBy(m => m.AddedOn).ToArray();
                }
                else
                    return new AttachmentItem[0];
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private object AddAttachment()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    string woid = HttpUtility.HtmlDecode(Request.Form["ClientData"]);

                    HttpPostedFile uploadFile = null;
                    byte[] iconfilebyte = null;
                    if (Request.Files.Count > 0)
                    {
                        uploadFile = Request.Files[0];
                        iconfilebyte = ConvertFile2bytes(uploadFile);
                    }

                    AttachmentInfo attachment = new AttachmentInfo();
                    attachment.StringID = Guid.NewGuid().ToString().ToUpper();
                    attachment.FileName = uploadFile == null ? "" : uploadFile.FileName;
                    attachment.Source = "WorkOrder";
                    attachment.SourceID = woid;
                    attachment.FileData = iconfilebyte;
                    attachment.AddedByUserIID = session.User.UID;

                    string attid = CreateClient<AttachmentClient>().AddAttachmentLegacy(SystemParams.CompanyID, attachment);

                    return "OK";
                }
                return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private object DeleteAttachment()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    string attachid = HttpUtility.HtmlDecode(Request.Form["ClientData"]);

                    CreateClient<AttachmentClient>().DeleteAttachmentLegacy(SystemParams.CompanyID, attachid, session.User.UID);
                    return "OK";
                }
                return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }

        }

        private object GetAssetAttachments()
        {
            try
            {
                if (GetCurrentLoginSession() != null)
                {
                    var assetid = Request.Form["ClientData"];
                    AssetAttachmentInfo[] atts = CreateClient<AssetAttachmentProvider>().GetAttachments(SystemParams.CompanyID, Convert.ToInt64(assetid)).Where(m => m.VisibleOnWorkOrder == true).ToArray();
                    if (atts == null || atts.Length <= 0)
                        return new AssetAttachmentItem[0];

                    List<AssetAttachmentItem> list = new List<AssetAttachmentItem>();
                    foreach (AssetAttachmentInfo att in atts)
                    {
                        AssetAttachmentItem item = new AssetAttachmentItem();
                        Helper.CloneProperty(item, att);
                        item.AddedOn = item.AddedOn.AddHours(SystemParams.GetHoursOffset());
                        list.Add(item);
                    }
                    return list.OrderBy(m => m.AddedOn).ToArray();
                }
                else
                    return new AssetAttachmentInfo[0];
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }


        #endregion

        #region Sned Email
        private object GetMachineContacts()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    var assetid = Request.Form["ClientData"];
                    return UserManagement.GetUsersByAssetID(session.SessionID, Convert.ToInt64(assetid), SystemParams.CompanyID);
                }
                else
                    return new UserInfo[0];
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private object SendWorkOrder()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    var clientdata = Request.Form["ClientData"].Split((char)170);
                    var woid = HttpUtility.HtmlDecode(clientdata[0]);
                    var address = HttpUtility.HtmlDecode(clientdata[1]);
                    var desc = HttpUtility.HtmlDecode(clientdata[2]);
                    string[] emailaddress = JsonConvert.DeserializeObject<string[]>(address);

                    WorkOrderDetail wod = CreateClient<WorkOrderClient>().GetWorkOrderDetail(SystemParams.CompanyID, Convert.ToInt64(woid));
                    WorkOrderDetailInfo wo = new WorkOrderDetailInfo();
                    Helper.CloneProperty(wo, wod);
                    SendMail(wo, emailaddress, desc, session.User);
                    return "OK";
                }
                else
                    return "Failed";
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }

        private void SendMail(WorkOrderDetailInfo wo, string[] emailaddress, string desc, Services.Users.UserInfoEx user)
        {
            if (emailaddress == null || emailaddress.Length == 0)
                return;

            string Subject = "Work Order " + wo.ID;
            string Body = OrdinaryEmailFormat(wo, desc, user.ID);

            CreateClient<AttachmentClient>().SendWorkOrderEmail(SystemParams.CompanyID, wo.ID, Subject, Body, emailaddress.ToArray(), user.UID);
        }

        private string OrdinaryEmailFormat(WorkOrderDetailInfo wo, string desc, string userid)
        {
            string EmailFormat = "<table>";
            EmailFormat += "<tr><td><span>Details for work order <lable style=\"color:red;\"> <{3}> </lable> are listed below.To view or edit this work order,please click the below link:<br/></span><a href=\"{4}\">Link</a></td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:bold;\">Message from:&nbsp;</span>{0}</td></tr>";
            EmailFormat += "<tr><td style=\"font-weight:700;\">Description:&nbsp;</td></tr>";
            EmailFormat += "<tr><td style=\"padding-left:30px;padding-right:20px;\">{1}</td></tr>";

            EmailFormat += "<tr><td style=\"font-weight:700;\">Work Order Information:&nbsp;</td></tr>";
            EmailFormat += "<tr><td style=\"padding-left:30px;\">{2}</td></tr>";

            EmailFormat += "</table>";

            string absuri = Context.Request.Url.AbsoluteUri;
            string wourl = absuri.Substring(0, absuri.LastIndexOf("/Maintenance", StringComparison.OrdinalIgnoreCase));
            wourl = wourl + "/jump.aspx?p=" + Convert.ToBase64String(Encoding.UTF8.GetBytes("jt=woe;woid=" + wo.ID));

            return string.Format(EmailFormat, userid, desc.Replace("\n", "<br>"), WorkOrderFormat(wo), wo.ID, wourl);
        }

        public static string WorkOrderFormat(WorkOrderDetailInfo wo)
        {
            string EmailFormat = "<table>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Work Order Type:&nbsp;</span>{0}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Assigned To:&nbsp;</span>{1}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Status:&nbsp;</span>{2}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Due Date:&nbsp;</span>{3}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Description:&nbsp;</span>{4}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Meter Type:&nbsp;</span>{5}</td></tr>";
            if (string.Compare(wo.MeterType, "HourMeter", true) == 0 || string.Compare(wo.MeterType, "Both", true) == 0)
                EmailFormat += "<tr><td><span style=\"font-weight:700;\">Hour Meter:&nbsp;</span>{6}</td></tr>";
            if (string.Compare(wo.MeterType, "Odometer", true) == 0 || string.Compare(wo.MeterType, "Both", true) == 0)
                EmailFormat += "<tr><td><span style=\"font-weight:700;\">Odometer:&nbsp;</span>{7}&nbsp;{8}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Work Order Total Costs ($):&nbsp;</span>{9}</td></tr>";

            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Other Cost ($):&nbsp;</span>{19}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Parts Cost ($):&nbsp;</span>{14}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Travel Time Cost ($):&nbsp;</span>{15}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Labor Cost ($):&nbsp;</span>{16}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Hourly Rate:&nbsp;</span>{17}</td></tr>";

            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Time To Complete(Hrs):&nbsp;</span>{10}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Completed Date:&nbsp;</span>{11}</td></tr>";
            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Internal ID:&nbsp;</span>{12}</td></tr>";

            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Invoice Number:&nbsp;</span>{18}</td></tr>";

            EmailFormat += "<tr><td><span style=\"font-weight:700;\">Notes:&nbsp;</span>{13}</td></tr>";
            EmailFormat += "</table>";

            string SendStr = string.Format(EmailFormat,
                HttpUtility.HtmlEncode(wo.WorkOrderType),
                HttpUtility.HtmlEncode(wo.AssignedToName),
                HttpUtility.HtmlEncode(wo.Status),
                HttpUtility.HtmlEncode(wo.DueDateStr),
                HttpUtility.HtmlEncode(wo.Description).Replace("\n", "<br>"),
                HttpUtility.HtmlEncode(wo.MeterType),
                HttpUtility.HtmlEncode(wo.HourMeter),
                HttpUtility.HtmlEncode(wo.Odometer),
                HttpUtility.HtmlEncode(wo.OdometerUnits),
                HttpUtility.HtmlEncode(wo.WorkOrderTotalCost),
                HttpUtility.HtmlEncode(wo.HoursToComplete),
                HttpUtility.HtmlEncode(wo.CompleteDateStr),
                HttpUtility.HtmlEncode(wo.InternalID),
                HttpUtility.HtmlEncode(wo.Notes).Replace("\n", "<br>"),
                HttpUtility.HtmlEncode(wo.PartsCost),
                HttpUtility.HtmlEncode(wo.TravelTimeCost),
                HttpUtility.HtmlEncode(wo.LaborCost),
                HttpUtility.HtmlEncode(wo.HourlyRate),
                HttpUtility.HtmlEncode(wo.InvoiceNumber),
                HttpUtility.HtmlEncode(wo.OtherCost));
            return SendStr;
        }

        #endregion

        private object GetInvoiceNumber()
        {
            try
            {
                if (GetCurrentLoginSession() != null)
                {
                    var woid = Request.Form["ClientData"];
                    return new WorkOrderManager(SystemParams.DataDbConnectionString).GetInvoiceNumber(woid);
                }
                else
                    return new string[0];
            }
            catch (Exception ex)
            {
                return ex.Message;
            }
        }
    }



    public class SegmentClient
    {
        public UserInfo[] Users { get; set; }
        public JobSiteViewItem[] JobSites { get; set; }
    }

    public class WorkOrderQueryParams
    {
        public long AssetID { get; set; }
        public string SearchText { get; set; }
        public string[] Contacts { get; set; }
        public string[] Status { get; set; }
        public string[] AssetGroups { get; set; }
        public bool ShowMaintenance { get; set; }
    }

    class WorkorderAlerts
    {
        public AlertInfo[] Alerts { get; set; }
        public AlertInfo[] AssetAlerts { get; set; }
    }
}