using EasyBL;
using EasyBL.WebApi.Common;
using EasyBL.WebApi.WebApi;
using EasyNet.DBUtility;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Data.SqlClient;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;

namespace WebApp.WS
{
    /// <summary>
    /// ComWebService 的摘要说明
    /// </summary>
    [WebService(Namespace = @"http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    [System.ComponentModel.ToolboxItem(false)]
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消注释以下行。
    [ScriptService]
    public class ComWebService : System.Web.Services.WebService
    {
        public APISoapHeader Header { get; set; }

        public ComWebService()
        {
            //如果使用設計的元件,請取消註解下列一行
            //InitializeComponent();
        }

        #region 資料查詢

        #region QueryTableByPrc

        /// <summary>
        /// 資料查詢DataSet
        /// </summary>
        /// <param name="Type">todo: describe Type parameter on QueryTableByPrc</param>
        /// <param name="Params">todo: describe Params parameter on QueryTableByPrc</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string QueryTableByPrc(string Type, Object Params)
        {
            var sJson = @"";
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }
                var ds = EntityBL.GetTableByPrc(Type, Params);
                sJson = JsonConvert.SerializeObject(ds, Formatting.Indented); //把DataSet轉成Json字串
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Type:" + Type + @"Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(QueryTableByPrc), nameof(QueryTableByPrc), @"", @"", @"");
            }
            return sJson; //回傳字串
        }

        #endregion QueryTableByPrc

        #region QueryList

        /// <summary>
        /// 資料查詢List
        /// </summary>
        /// <param name="Type">todo: describe Type parameter on QueryList</param>
        /// <param name="Params">todo: describe Params parameter on QueryList</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string QueryList(string Type, Object Params)
        {
            var sJson = @"";
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }
                var lst = EntityBL.QueryList(Type, Params);
                sJson = JsonConvert.SerializeObject(lst, Formatting.Indented); //把list轉成Json字串
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Type:" + Type + @"Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(QueryList), nameof(QueryList), @"", @"", @"");
            }
            return sJson; //回傳字串
        }

        #endregion QueryList

        #region QueryOne

        /// <summary>
        /// 資料查詢單筆資料
        /// </summary>
        /// <param name="Type">todo: describe Type parameter on QueryOne</param>
        /// <param name="Params">todo: describe Params parameter on QueryOne</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string QueryOne(string Type, Object Params)
        {
            var sJson = @"";
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }
                var eOne = EntityBL.QueryOne(Type, Params);
                sJson = JsonConvert.SerializeObject(eOne, Formatting.Indented); //把Model轉成Json字串
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Type:" + Type + @"Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(QueryOne), nameof(QueryOne), @"", @"", @"");
            }
            return sJson; //回傳字串
        }

        #endregion QueryOne

        #region QueryByPage

        /// <summary>
        /// 資料查詢單筆資料
        /// </summary>
        /// <param name="Params">todo: describe Params parameter on QueryPage</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string QueryPage(Object Params)
        {
            var sJson = @"";

            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }
                var pr = EntityBL.QueryPage(Params);

                sJson = JsonConvert.SerializeObject(pr, Formatting.Indented); //把Model轉成Json字串
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(QueryPage), nameof(QueryPage), @"", @"", @"");
            }
            return sJson; //回傳字串
        }

        #endregion QueryByPage

        #region QueryPageByPrc

        /// <summary>
        /// 資料查詢通過預存函數
        /// </summary>
        /// <param name="Type">todo: describe Type parameter on QueryPageByPrc</param>
        /// <param name="Params">todo: describe Params parameter on QueryPageByPrc</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string QueryPageByPrc(string Type, Object Params)
        {
            var sJson = @"";

            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }
                var pr = EntityBL.QueryPageByPrc(Type, Params, true);

                sJson = JsonConvert.SerializeObject(pr, Formatting.Indented); //把Model轉成Json字串
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Type:" + Type + @"Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(QueryPageByPrc), nameof(QueryPageByPrc), @"", @"", @"");
            }
            return sJson; //回傳字串
        }

        #endregion QueryPageByPrc

        #region QueryCount

        /// <summary>
        /// 查詢資料筆數
        /// </summary>
        /// <param name="Params">todo: describe Params parameter on QueryCount</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public int QueryCount(Object Params)
        {
            var iCount = 0;

            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return -1;
                }
                iCount = DBHelper.QueryCount(Params);
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(QueryCount), nameof(QueryCount), @"", @"", @"");
            }
            return iCount; //回傳字串
        }

        #endregion QueryCount

        #endregion 資料查詢

        #region 資料新增

        #region Add

        /// <summary>
        /// 資料新增Add
        /// </summary>
        /// <param name="Params">todo: describe Params parameter on Add</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public int Add(Object Params)
        {
            var iRel = 0;
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return -1;
                }
                iRel = new DBHelper().Insert(Params);
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(Add), nameof(Add), @"", @"", @"");
            }
            return iRel; //回傳字串
        }

        #endregion Add

        #endregion 資料新增

        #region 資料修改

        #region Update

        /// <summary>
        /// 資料修改Update
        /// </summary>
        /// <param name="Params">todo: describe Params parameter on Update</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public int Update(Object Params)
        {
            var iRel = 0;
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return -1;
                }
                iRel = new DBHelper().Update(Params);
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(Update), nameof(Update), @"", @"", @"");
            }
            return iRel; //回傳字串
        }

        #endregion Update

        #region UpdateTran

        /// <summary>
        /// 資料修改Update
        /// </summary>
        /// <param name="Params">todo: describe Params parameter on UpdateTran</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public int UpdateTran(Object Params)
        {
            var iRel = 0;
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return -1;
                }
                iRel = new DBHelper().UpdateTran(Params);
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(UpdateTran), nameof(UpdateTran), @"", @"", @"");
            }
            return iRel; //回傳字串
        }

        #endregion UpdateTran

        #region UpdatePrc

        /// <summary>
        /// 資料修改UpdatePrc
        /// </summary>
        /// <param name="Params">todo: describe Params parameter on UpdatePrc</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public int UpdatePrc(Object Params)
        {
            var iRel = 0;
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return -1;
                }
                iRel = EntityBL.ExecuteSqlTran(Params);
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(UpdatePrc), nameof(UpdatePrc), @"", @"", @"");
            }
            return iRel; //回傳字串
        }

        #endregion UpdatePrc

        #endregion 資料修改

        #region 資料刪除

        #region Delete

        /// <summary>
        /// 資料刪除
        /// </summary>
        /// <param name="Params">todo: describe Params parameter on Delete</param>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public int Delete(Object Params)
        {
            var iRel = 0;
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return -1;
                }
                iRel = new DBHelper().Delete(Params);
                var sOrgid = HttpContext.Current.Request.Headers[@"orgid"];
                var sUserid = HttpContext.Current.Request.Headers[@"userid"];
                LogService.mo_Log.Debug(@"Params:" + ServiceBase.JsonToString(Params) + @" Deleter:" + sOrgid + @"-" + sUserid);
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(Delete), nameof(Delete), @"", @"", @"");
            }
            return iRel; //回傳字串
        }

        #endregion Delete

        #endregion 資料刪除

        #region 發送郵件

        //<summary>
        //發送郵件
        //</summary>
        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string SendMail(Object Params)
        {
            var sRes = @"0";
            string sError = null;
            try
            {
                do
                {
                    if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                    {
                        return @"-1";
                    }
                    var sOrgid = HttpContext.Current.Request.Headers[@"orgid"];
                    var ms = new MailService(sOrgid);
                    var bSend = ms.SendMail(Params, out sError);

                    if (sError != null)
                    {
                        sRes = sError;
                        break;
                    }
                    if (bSend)
                    {
                        sRes = @"1";
                    }
                } while (false);

                return sRes;
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(SendMail), @"SendMailPro", @"", @"", @"");
                return sRes;
            }
        }

        #endregion 發送郵件

        #region GetHttpClient

        /// <summary>
        /// 獲取特定Url html
        /// </summary>
        /// <param name="Url">todo: describe Url parameter on GetHttpClient</param>
        /// <param name="Params">todo: describe Params parameter on GetHttpClient</param>
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetHttpClient(string Url, Object Params)
        {
            var oJson = new Dictionary<string, object>();
            var sHtml = @"";
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }
                var client = new HttpWebClient(Url);
                if (Params is Dictionary<string, object>)
                {
                    var dicpm = Params as Dictionary<string, object>;
                    if (dicpm.Keys.Count > 0)
                    {
                        foreach (string key in dicpm.Keys)
                        {
                            client.PostingData.Add(key, dicpm[key].ToString());
                        }
                    }
                }
                sHtml = client.GetString();
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Url:" + Url + @"Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(GetHttpClient), nameof(GetHttpClient), @"", @"", @"");
                return @"";
            }
            return sHtml;
        }

        #endregion GetHttpClient

        #region GetStringAsync

        /// <summary>
        /// 獲取特定Url html
        /// </summary>
        /// <param name="Url">todo: describe Url parameter on GetStringAsync</param>
        /// <param name="Params">todo: describe Params parameter on GetStringAsync</param>
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetStringAsync(string Url, Object Params)
        {
            var oJson = new Dictionary<string, object>();
            var sHtml = @"";
            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }
                using (var httpClient = new System.Net.Http.HttpClient())
                {
                    var paramList = new List<KeyValuePair<String, String>>();
                    if (Params is Dictionary<string, object>)
                    {
                        var dicpm = Params as Dictionary<string, object>;
                        if (dicpm.Keys.Count > 0)
                        {
                            foreach (string key in dicpm.Keys)
                            {
                                paramList.Add(new KeyValuePair<string, string>(key, dicpm[key].ToString()));
                            }
                        }
                    }
                    var content = new System.Net.Http.FormUrlEncodedContent(paramList);
                    var response = httpClient.PostAsync(Url, content).Result;
                    sHtml = response.Content.ReadAsStringAsync().Result;
                }
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message + @"Param(Url:" + Url + @"Params:" + ServiceBase.JsonToString(Params) + @")", ex, @"", @"", nameof(ComWebService), nameof(GetStringAsync), nameof(GetStringAsync), @"", @"", @"");
                return @"";
            }
            return sHtml;
        }

        #endregion GetStringAsync

        #region 获取web客户端ip

        /*获取web客户端ip*/

        [System.Web.Services.Protocols.SoapHeader(@"header")]
        [WebMethod]
        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
        public string GetWebClientIp()
        {
            var sUserIP = @"";

            try
            {
                if (!SignExtension.VerifyIdentity(HttpContext.Current, Header))
                {
                    return @"-1";
                }

                if (HttpContext.Current == null
            || HttpContext.Current.Request == null
            || HttpContext.Current.Request.ServerVariables == null)
                    return @"";

                var CustomerIP = @"";

                //CDN加速后取到的IP simone 090805
                CustomerIP = HttpContext.Current.Request.Headers[@"Cdn-Src-Ip"];
                if (!string.IsNullOrEmpty(CustomerIP))
                {
                    return CustomerIP;
                }

                CustomerIP = HttpContext.Current.Request.ServerVariables[@"HTTP_X_FORWARDED_FOR"];

                if (!String.IsNullOrEmpty(CustomerIP))
                    return CustomerIP;

                if (HttpContext.Current.Request.ServerVariables[@"HTTP_VIA"] != null)
                {
                    CustomerIP = HttpContext.Current.Request.ServerVariables[@"HTTP_X_FORWARDED_FOR"];
                    if (CustomerIP == null)
                        CustomerIP = HttpContext.Current.Request.ServerVariables[@"REMOTE_ADDR"];
                }
                else
                {
                    CustomerIP = HttpContext.Current.Request.ServerVariables[@"REMOTE_ADDR"];
                }

                if (string.Compare(CustomerIP, @"unknown", true) == 0)
                    return System.Web.HttpContext.Current.Request.UserHostAddress;
                return CustomerIP;
            }
            catch (Exception ex)
            {
                LogService.MailSend(ex.Message, ex, @"", @"", nameof(ComWebService), nameof(GetWebClientIp), nameof(GetWebClientIp), @"", @"", @"");
            }
            return sUserIP;
        }

        #endregion 获取web客户端ip
    }
}