using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Newtonsoft.Json;
using IronIntel.Contractor.Machines;
using IronIntel.Contractor.Maintenance;
using IronIntel.Services.Business.Admin;
using System.Web;
using IronIntel.Contractor.Users;
using Foresight.ServiceModel;
using Foresight.Fleet.Services.AssetHealth;

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

            try
            {
                if (methodName != null)
                {
                    switch (methodName.ToUpper())
                    {
                        case "GETFUELRECORDS":
                            result = GetFuelRecords();
                            break;
                        case "GETFUELRECORDCHANGEHISTORY":
                            result = GetFuelRecordChangeHistory();
                            break;
                        case "SAVEFUELRECORD":
                            result = SaveFuelRecord();
                            break;
                        case "DELETEFUELRECORD":
                            result = DeleteFuelRecord();
                            break;
                        case "GETFUELTYPES":
                            result = GetFuelTypes();
                            break;
                    }
                }
            }
            catch (System.Threading.ThreadAbortException)
            {
                throw;
            }
            catch (Exception ex)
            {
                SystemParams.WriteLog("error", "FuelRecordsBasePage" + methodName, ex.Message, ex.ToString());
            }
            string json = JsonConvert.SerializeObject(result);
            Response.Write(json);
            Response.End();
        }


        private object GetFuelRecords()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    var clientdata = Request.Form["ClientData"].Split((char)170);
                    var type = HttpUtility.HtmlDecode(clientdata[0]);
                    var sdatestr = HttpUtility.HtmlDecode(clientdata[1]);
                    var edatestr = HttpUtility.HtmlDecode(clientdata[2]);
                    var searchtxt = HttpUtility.HtmlDecode(clientdata[3]);

                    DateTime beginDate = DateTime.MinValue;
                    DateTime endDate = DateTime.MaxValue;
                    if (!DateTime.TryParse(sdatestr, out beginDate))
                        beginDate = DateTime.MinValue;
                    if (!DateTime.TryParse(edatestr, out endDate))
                        endDate = DateTime.MaxValue;

                    FuelRecord[] fuels = CreateClient<FuelManagementClient>().GetFuelRecords(SystemParams.CompanyID, Convert.ToInt64(type), beginDate, endDate, searchtxt);

                    List<FuelRecordInfo> list = new List<FuelRecordInfo>();
                    foreach (FuelRecord fuel in fuels)
                    {
                        FuelRecordInfo fi = new FuelRecordInfo();
                        Helper.CloneProperty(fi, fuel);
                        fi.TransactionDate = fi.TransactionDate.ToLocalTime();
                        list.Add(fi);
                    }

                    return list.ToArray();
                }
                else
                    return new FuelRecordInfo[0];

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

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

                    FuelRecordAuditInfo[] fuels = CreateClient<FuelManagementClient>().GetFuelRecordAuditItems(SystemParams.CompanyID, fuleid);

                    List<FuelRecordAuditItem> list = new List<FuelRecordAuditItem>();
                    foreach (FuelRecordAuditInfo fuel in fuels)
                    {
                        FuelRecordAuditItem fi = new FuelRecordAuditItem();
                        Helper.CloneProperty(fi, fuel);
                        fi.TransactionDate = fi.TransactionDate.ToLocalTime();
                        fi.AddedOn = fi.AddedOn.ToLocalTime();
                        fi.LastUpdatedOn = fi.LastUpdatedOn.ToLocalTime();
                        list.Add(fi);
                    }

                    return list.ToArray();
                }
                else
                    return new FuelRecordInfo[0];

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

        private object SaveFuelRecord()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    string clientdata = HttpUtility.HtmlDecode(Request.Params["ClientData"]);
                    FuelRecordInfo fuelrecord = JsonConvert.DeserializeObject<FuelRecordInfo>(clientdata);

                    FuelRecord record = new FuelRecord();
                    Helper.CloneProperty(record, fuelrecord);
                    record.TransactionDate = record.TransactionDate.ToUniversalTime();
                    long fuleid = record.FuelID;
                    if (record.FuelID == -1)
                    {
                        FuelRecord fr = CreateClient<FuelManagementClient>().AddNewFuelRecord(SystemParams.CompanyID, record, session.User.UID);
                        fuleid = fr.FuelID;
                    }
                    else
                    {
                        CreateClient<FuelManagementClient>().UpdateFuelRecord(SystemParams.CompanyID, record, session.User.UID);
                    }

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

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

                    CreateClient<FuelManagementClient>().DeleteFuelRecord(SystemParams.CompanyID, fuleid, session.User.UID);

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

        private object GetFuelTypes()
        {
            try
            {
                var session = GetCurrentLoginSession();
                if (session != null)
                {
                    List<KeyValuePair<string, string>> list = FuelManagementClient.FuelTypes.OrderBy(m => m.Value).ToList();
                    var type1 = list.FirstOrDefault(m => m.Value == "Unleaded Regular");
                    var type2 = list.FirstOrDefault(m => m.Value == "Unleaded Plus");
                    var type3 = list.FirstOrDefault(m => m.Value == "Diesel #1");
                    list.Remove(type1);
                    list.Remove(type2);
                    list.Remove(type3);
                    list = list.OrderBy(m => m.Value).ToList();
                    list.Insert(0, type1);
                    list.Insert(1, type2);
                    list.Insert(2, type3);
                    return list.ToArray();
                }
                else
                    return new StringKeyValue[0];
            }
            catch (Exception ex)
            {
                AddLog("ERROR", "FuelRecordBasePage.GetFuelTypes", ex.Message, ex.ToString());
                return ex.Message;
            }
        }

    }
}
