using CallCenter.Utility;
using CallCenterApi.Common;
using CallCenterApi.DB;
using CallCenterApi.Interface.Controllers.Base;
using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace CallCenterApi.Interface.Controllers.tel
{
    public class CallInScreenController : BaseController
    {
        private readonly BLL.T_Cus_CustomerBase customerBaseBLL = new BLL.T_Cus_CustomerBase();
        private readonly BLL.T_Cus_CustomerField customerFieldBLL = new BLL.T_Cus_CustomerField();
        private readonly BLL.T_Cus_CustomerExpand customerExpandBLL = new BLL.T_Cus_CustomerExpand();

        /// <summary>
        /// 添加黑名单
        /// </summary>
        /// <returns></returns>
        public ActionResult AddBlack()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                int userId = CurrentUser.UserData.F_UserId;
                if (userId != 0)
                {
                    Model.T_Sys_UserAccount ua = new BLL.T_Sys_UserAccount().GetModel(userId);
                    if (ua != null)
                    {
                        string tel = HttpUtility.UrlDecode(RequestString.GetFormString("tel"));
                        string callid = HttpUtility.UrlDecode(RequestString.GetFormString("callid"));
                        int n = RequestString.GetInt("num", 0);
                        int type = RequestString.GetInt("type", 0);
                        Model.T_Call_Blacklist dModel = new BLL.T_Call_Blacklist().GetModelList(" F_TelPhone='" + tel + "' ").FirstOrDefault();

                        var date = DateTime.Now;
                        var enddate = date;
                        switch (type)
                        {
                            case 1: enddate = enddate.AddDays(n); break;
                            case 2: enddate = enddate.AddHours(n); break;
                            case 3: enddate = enddate.AddMinutes(n); break;
                            case 4: enddate = DateTime.MaxValue; break;
                        }
                        if (dModel == null)
                        {
                            dModel = new Model.T_Call_Blacklist();
                            dModel.F_CallId = callid;
                            dModel.F_TelPhone = tel.Trim();
                            dModel.F_SetTime = date;
                            dModel.F_RemoveTime = enddate;
                            dModel.F_InterceptNum = 1;
                            dModel.F_UserId = ua.F_UserId;
                            int b = new BLL.T_Call_Blacklist().Add(dModel);
                            if (b > 0)
                            {
                                res = Success("添加成功", enddate.ToString("yyyy-MM-dd HH:mm:ss"));
                            }
                            else
                            {
                                res = Error("添加失败");
                            }
                        }
                        else
                        {

                            dModel.F_RemoveTime = enddate;
                            if (new BLL.T_Call_Blacklist().Update(dModel))
                            {
                                res = Success("修改成功", enddate.ToString("yyyy-MM-dd HH:mm:ss"));
                            }
                            else
                            {
                                res = Error("修改失败");
                            }
                        }
                    }
                }

            }
            return res;
        }

        /// <summary>
        /// 取消黑名单
        /// </summary>
        /// <returns></returns>
        public ActionResult DelBlack()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                string tel = HttpUtility.UrlDecode(RequestString.GetQueryString("tel"));
                Model.T_Call_Blacklist dModel = new BLL.T_Call_Blacklist().GetModelList(" F_TelPhone='" + tel + "' ").FirstOrDefault();

                if (dModel != null)
                {
                    bool bl = new BLL.T_Call_Blacklist().Delete(dModel.F_BlackId);
                    if (bl)
                    {
                        res = Success("取消成功");
                    }
                }

            }
            return res;
        }

        /// <summary>
        /// 根据来电号码获取客户信息
        /// </summary>
        /// <returns></returns>
        public ActionResult GetCustomerByTel(string tel)
        {
            //ActionResult res = NoToken("未知错误，请重新登录");
            //if (Request.IsAuthenticated)
            //{
            //    DataTable dt = new DataTable();

            //    string tel = HttpUtility.UrlDecode(RequestString.GetQueryString("tel"));
            //    BLL.T_Cus_CustomerBase bll = new BLL.T_Cus_CustomerBase();
            //    dt = bll.GetList(" F_Telephone like '%" + tel + "%' or F_Mobile like '%" + tel + "%' ").Tables[0];

            //    res = Success("客户信息加载成功", dt);

            //}
            //return res;


            if (string.IsNullOrWhiteSpace(tel))
                return Error("来电号码为空");
            var userModel = customerBaseBLL.GetModelByTel(tel);
            if (userModel == null)
                return Error("获取失败，该客户信息不存在");
            //系统列+自定义列 实体
            var columnList = customerFieldBLL.GetList().Where(x => x.F_IsShowOnList > 0).OrderBy(x => x.F_Sort).ToList();
            //系统列+自定义列 字符串
            var headList = columnList.Select(x => x.F_Name).ToList();
            //系统列+自定义列 字段名
            var nameList = columnList.Select(x => x.F_DBFieldName).ToList();
            //自定义列字段名
            var customerColumnArr = columnList.Where(x => x.F_FieldType == 1).Select(x => x.F_DBFieldName).ToList();
            //自定义列值
            var expand = DbHelperSQL.Query("select  top 1 * from T_Cus_CustomerExpand where F_CustomerId=@F_CustomerId", new SqlParameter("@F_CustomerId", userModel.F_Id)).Tables[0].Rows[0];
            List<string> strList1 = new List<string>()
            {
                 userModel.F_Name, userModel.F_PhoneNum1, userModel.F_PhoneNum2, userModel.F_Address, userModel.F_CusType.ToString(), userModel.F_AddAgentId.ToString(), userModel.F_AddTime.ToString("yyyy-MM-dd HH:mm:ss"), userModel.F_Remark
            };
            List<string> strList2 = new List<string>();
            foreach (var item in customerColumnArr)
            {
                strList2.Add(expand[item].ToString());
            }
            strList1.AddRange(strList2);

            return Success("获取成功", new
            {
                namelist = nameList,
                headlist = headList,
                datalist = strList1
            });

        }

        /// <summary>
        /// 根据来电号码获取最近的callid
        /// </summary>
        /// <returns></returns>
        public ActionResult GetCallIdByPhone()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {
                DataTable dt = new DataTable();

                string tel = HttpUtility.UrlDecode(RequestString.GetQueryString("tel"));
                Model.T_Call_CallRecords model = new BLL.T_Call_CallRecords().GetModelByTelphone(tel);

                res = Success("加载成功", model);

            }
            return res;
        }

        /// <summary>
        /// 根据callid获取最近的通话记录
        /// </summary>
        /// <returns></returns>
        public ActionResult GetTelRecordByCallid()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {
                DataTable dt = new DataTable();

                string callid = HttpUtility.UrlDecode(RequestString.GetQueryString("callid"));
                Model.T_Call_CallRecords model = new BLL.T_Call_CallRecords().GetModelByCallId(callid);

                res = Success("通话记录加载成功", model);

            }
            return res;
        }

        /// <summary>
        /// 来电归属地查询
        /// </summary>
        /// <returns></returns>
        public ActionResult GetPhoneLocation()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {
                string location = "未知";

                string tel = HttpUtility.UrlDecode(RequestString.GetQueryString("tel"));
                if (tel.Trim().Length == 11 && tel.Substring(0, 1) != "0")
                {
                    BLL.T_Sys_MobileData mobile_Bll = new BLL.T_Sys_MobileData();
                    Model.T_Sys_MobileData mobileModel = mobile_Bll.GetModel(tel.Substring(0, 7));

                    if (mobileModel != null)
                    {
                        location = mobileModel.F_CityDes + mobileModel.F_CardDes;
                    }
                }
                else
                {
                    BLL.T_Sys_TelTitleData numbBll = new BLL.T_Sys_TelTitleData();
                    List<Model.T_Sys_TelTitleData> mobileModel = numbBll.GetModelList(" 1=1 and F_KeyPhoneNum='" + tel.Substring(0, 4) + "'");
                    if (mobileModel == null || mobileModel.Count <= 0)
                    {
                        mobileModel = numbBll.GetModelList(" 1=1 and F_KeyPhoneNum='" + tel.Substring(0, 3) + "'");
                    }
                    if (mobileModel.Count > 0)
                    {
                        location = mobileModel[0].F_TitleName;
                    }
                }

                res = Success("归属地加载成功", location);

            }
            return res;
        }

        /// <summary>
        /// 历史记录列表
        /// </summary>
        /// <returns></returns>
        public ActionResult GetOldList()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {
                string sql = "";
                string sqlcount = "";
                DataTable dt = new DataTable();

                string strtel = HttpUtility.UrlDecode(RequestString.GetQueryString("tel"));
                string strcalltype = HttpUtility.UrlDecode(RequestString.GetQueryString("calltype"));
                string strstarttime = HttpUtility.UrlDecode(RequestString.GetQueryString("starttime"));
                string strendtime = HttpUtility.UrlDecode(RequestString.GetQueryString("endtime"));

                string strpageindex = RequestString.GetQueryString("page");
                int pageindex = 1;
                string strpagesize = RequestString.GetQueryString("pagesize");
                int pagesize = 10;

                if (strcalltype.Trim() != "" && strcalltype != "undefined")
                {
                    sql += " and CallType=" + strcalltype + " ";
                }
                if (strtel.Trim() != "" && strtel != "undefined")
                {
                    sql += " and CallNumber= '" + strtel.Trim() + "' ";
                    sqlcount += " and CallNumber= '" + strtel.Trim() + "' ";
                }
                //else
                //{
                //    sql += " and 1=0 ";
                //}
                if (strstarttime.Trim() != "" && strstarttime != "undefined")
                {
                    sql += " and datediff(day,BeginTime,'" + strstarttime + "')<=0 ";
                    sqlcount += " and datediff(day,BeginTime,'" + strstarttime + "')<=0 ";
                }
                if (strendtime.Trim() != "" && strendtime != "undefined")
                {
                    sql += " and datediff(day,BeginTime,'" + strendtime + "')>=0   ";
                    sqlcount += " and datediff(day,BeginTime,'" + strendtime + "')>=0   ";
                }

                if (strpageindex.Trim() != "")
                {
                    pageindex = Convert.ToInt32(strpageindex);
                }

                if (strpagesize.Trim() != "")
                {
                    pagesize = Convert.ToInt32(strpagesize);
                }
                int recordCount = 0;
                dt = BLL.PagerBLL.GetListPager(
                    "T_Call_CallRecords",
                    "CallRecordsId",
                    "*",
                    sql,
                    "ORDER BY CallRecordsId desc",
                    pagesize,
                    pageindex,
                    true,
                    out recordCount);
                var config = new BLL.T_Sys_SystemConfig().GetModelList(" F_ParamCode='PlayPath' ").FirstOrDefault();
                foreach (DataRow dr in dt.Rows)
                {
                    string path = dr["FilePath"] != null ? dr["FilePath"].ToString() : "";
                    if (path != "" && config != null && !string.IsNullOrEmpty(config.F_ParamValue))
                    {
                        var ym = config.F_ParamValue;
                        if (ym.Substring(ym.Length - 1) == "/")
                        {
                            ym = ym.Substring(0, ym.Length - 1);
                        }
                        dr["FilePath"] = ym + path.Substring(path.IndexOf(':') + 1).Replace('\\', '/');
                    }
                }

                int hrcount = new BLL.T_Call_CallRecords().GetRecordCount(" calltype=0 " + sqlcount);
                int hccount = new BLL.T_Call_CallRecords().GetRecordCount(" calltype=1 " + sqlcount);

                var obj = new
                {
                    state = "success",
                    message = "成功",
                    rows = dt,
                    total = recordCount,
                    hrcount = hrcount,
                    hccount = hccount,
                };

                res = Content(obj.ToJson());

            }
            return res;
        }

        /// <summary>
        /// 获取最新知识库
        /// </summary>
        /// <returns></returns>
        public ActionResult GetZSKList()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                DataTable dt = new DataTable();
                string pid = HttpUtility.UrlDecode(RequestString.GetQueryString("pid"));
                string keywords = HttpUtility.UrlDecode(RequestString.GetQueryString("keywords"));

                string sql = " F_DeleteFlag=0";
                if (pid.Trim() != "")
                {
                    sql += " and F_CategoryId=" + pid.Trim();
                }
                if (keywords.Trim() != "")
                {
                    sql += " and (F_Content like '%" + keywords.Trim() + "%' or F_Title like '%"
                        + keywords.Trim() + "%' or F_KeyWords like '%" + keywords.Trim() + "%')";
                }

                dt = new BLL.T_RepositoryInformation().GetList(8, sql, " F_RepositoryId desc").Tables[0];

                res = Success("加载成功", dt);

            }
            return res;
        }

        /// <summary>
        /// 振铃事件
        /// </summary>
        /// <returns></returns>
        public ActionResult UpdateZL()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                int userId = CurrentUser.UserData.F_UserId;
                if (userId != 0)
                {
                    Model.T_Sys_UserAccount ua = new BLL.T_Sys_UserAccount().GetModel(userId);
                    if (ua != null)
                    {
                        Model.T_Call_CallRecords model = new Model.T_Call_CallRecords();
                        model.CallId = RequestString.GetFormString("callid");
                        model.UserId = ua.F_UserId;
                        model.UserCode = ua.F_UserCode;
                        model.UserName = ua.F_UserName;
                        //model.ExtNumber = ua.F_WorkNumber;
                        model.ExtNumber = CurrentUser.UserData.F_ExtensionNumber;

                        model.DealType = 5;
                        bool bl = new BLL.T_Call_CallRecords().UpdateCallInRingTelRecord(model);
                        if (bl)
                        {
                            res = Success("更新振铃状态成功");
                        }
                        else
                        {
                            res = Error("更新振铃状态失败");
                        }
                    }
                }

            }
            return res;
        }

        /// <summary>
        /// 摘机事件
        /// </summary>
        /// <returns></returns>
        public ActionResult UpdateZJ()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                Model.T_Call_CallRecords model = new Model.T_Call_CallRecords();
                model.CallId = RequestString.GetFormString("callid");
                model.CallState = 1;
                model.DealType = 6;
                bool bl = new BLL.T_Call_CallRecords().UpdateCallInAnswerTelRecord(model);
                if (bl)
                {
                    Model.T_Call_CallRecords vmodel = new BLL.T_Call_CallRecords().GetModelByCallId(model.CallId);
                    string type = vmodel.OperateType.ToString();
                    //这里不知道  vmodel.OperateType=7 是什么时候. 
                    if (type == "7")
                    {
                        new BLL.T_Call_TaskTelNum().UpdateYJ(Convert.ToInt32(vmodel.OperateObject.ToString()), 1);
                    }
                    //所以暂时先用  vmodel.TaskPhoneID 来判断是否是点击外呼的通话记录
                    if (!string.IsNullOrWhiteSpace(vmodel.TaskPhoneID))
                    {
                        new BLL.T_Call_TaskTelNum().UpdateYJ(Convert.ToInt32(vmodel.TaskPhoneID.ToString()), 1);
                    }
                    res = Success("更新摘机状态成功");
                }
                else
                {
                    res = Error("更新摘机状态失败");
                }

            }
            return res;
        }

        /// <summary>
        /// 挂机事件
        /// </summary>
        /// <returns></returns>
        public ActionResult UpdateGJ()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                string strid = RequestString.GetFormString("callid");
                bool bl = new BLL.T_Call_CallRecords().UpdateCallInHookTelRecord(strid);
                if (bl)
                {
                    res = Success("更新挂机状态成功");
                }
                else
                {
                    res = Success("更新挂机状态失败");
                }

            }
            return res;
        }

        /// <summary>
        /// 录音事件
        /// </summary>
        /// <returns></returns>
        public ActionResult UpdateLY()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                Model.T_Call_CallRecords model = new Model.T_Call_CallRecords();
                model.CallId = RequestString.GetFormString("callid");
                model.CallState = 1;
                model.DealType = 6;
                model.FilePath = RequestString.GetFormString("path");
                bool bl = new BLL.T_Call_CallRecords().UpdateCallInPathTelRecord(model);
                if (bl)
                {
                    Model.T_Call_CallRecords vmodel = new BLL.T_Call_CallRecords().GetModelByCallId(model.CallId);
                    string type = vmodel.OperateType.ToString();
                    if (type == "7")
                    {
                        new BLL.T_Call_TaskTelNum().UpdateYJ(Convert.ToInt32(vmodel.OperateObject.ToString()), 1);
                    }

                    res = Success("更新挂机状态成功");
                }
                else
                {
                    res = Success("更新挂机状态失败");
                }

            }
            return res;
        }

        /// <summary>
        /// 创建工单
        /// </summary>
        /// <returns></returns>
        public ActionResult AddWorkOrder()
        {
            ActionResult res = NoToken("未知错误，请重新登录");
            if (Request.IsAuthenticated)
            {

                int userId = CurrentUser.UserData.F_UserId;
                if (userId != 0)
                {
                    Model.T_Sys_UserAccount ua = new BLL.T_Sys_UserAccount().GetModel(userId);
                    if (ua != null)
                    {
                        int type = RequestString.GetInt("type", 0);
                        int tslx = RequestString.GetInt("tslx", 0);
                        string callid = RequestString.GetFormString("callid");
                        int khid = RequestString.GetInt("khid", 0);
                        string tskh = RequestString.GetFormString("tskh");
                        string tsdh = RequestString.GetFormString("tsdh");
                        int zrbm = RequestString.GetInt("zrbm", 0);
                        int zrid = RequestString.GetInt("zrid", 0);
                        string cont = RequestString.GetFormString("cont");
                        string answer = RequestString.GetFormString("answer");
                        string clcont = RequestString.GetFormString("clcont");

                        int clbm = RequestString.GetInt("clbm", 0);
                        int clid = RequestString.GetInt("clid", 0);

                        Model.T_Wo_WorkOrder model = new Model.T_Wo_WorkOrder();
                        model.WorkOrderID = DateTime.Now.ToString("yyyyMMddHHmmssms");//工单编号
                        model.CallID = callid;
                        model.Customer = tskh;
                        model.CustomerID = khid;
                        model.CustomerTel = tsdh;
                        model.Detail = cont;
                        model.Clcontent = clcont;
                        model.Type = type;
                        model.TypeClass = tslx;

                        if (type == 1)
                        {
                            model.State = 2;
                        }
                        else
                            model.State = 0;
                        model.IsDel = 0;
                        model.IsReturn = 0;
                        model.IsReturnBak = 0;
                        model.ResponDept = zrbm;
                        model.Answer = answer;
                        model.IsTimeOut = 0;
                        model.IsUserSend = 0;
                        model.IsAdminSend = 0;

                        Model.T_Sys_UserAccount us = new BLL.T_Sys_UserAccount().GetModel(zrid);
                        if (us != null)
                        {
                            model.ResponUser = us.F_UserCode;
                        }
                        Model.T_Wo_WorkOrderTimeOut to = new BLL.T_Wo_WorkOrderTimeOut().GetModel(type);
                        if (to != null)
                        {
                            model.LimitTime = to.MainTime;
                        }

                        model.CreateUser = ua.F_UserCode;
                        model.CreateTime = DateTime.Now;

                        if (clbm != 0 || clid != 0)
                        {
                            Model.T_Wo_WorkOrderItem item = new Model.T_Wo_WorkOrderItem();
                            item.WorkOrderID = model.WorkOrderID;
                            item.ToDept = clbm;
                            item.Type = 1;

                            if (clid != 0)
                            {
                                Model.T_Sys_UserAccount clus = new BLL.T_Sys_UserAccount().GetModel(clid);
                                if (clus != null)
                                {
                                    item.ToUser = clus.F_UserCode;
                                }
                            }
                            else
                            {
                                string users = string.Empty;
                                var list = new BLL.T_Sys_UserAccount().GetModelList(" F_DeptId='" + clbm + "'");
                                foreach (var l in list)
                                {
                                    if (string.IsNullOrEmpty(users))
                                    {
                                        users = l.F_UserCode;
                                    }
                                    else
                                    {
                                        users = users + "," + l.F_UserCode;
                                    }
                                }
                                item.ToUser = users;
                            }

                            if (to != null)
                            {
                                item.LimitTime = to.ItemTime;
                            }

                            item.Detail = answer;
                            item.IsLast = 0;
                            item.State = 0;
                            item.IsStart = 0;
                            item.IsTimeOut = 0;
                            item.IsDel = 0;
                            item.CreateUser = ua.F_UserCode;
                            item.CreateTime = DateTime.Now;

                            long itemid = new BLL.T_Wo_WorkOrderItem().Add(item);
                            if (itemid > 0)
                            {
                                model.State = 1;//已指派
                                model.AppointTime = DateTime.Now;

                                #region 消息表
                                foreach (string ur in item.ToUser.Split(','))
                                {
                                    Model.T_Msg_List msg = new Model.T_Msg_List();
                                    msg.Type = 1;
                                    msg.ToUser = ur;
                                    msg.ToID = Int32.Parse(itemid.ToString());
                                    msg.Detail = ua.F_UserName + "给你指派了工单，单号：" + model.WorkOrderID;
                                    msg.State = 0;
                                    msg.IsDel = 0;
                                    msg.CreateUser = ua.F_UserCode;
                                    msg.CreateDate = DateTime.Now;

                                    new BLL.T_Msg_List().Add(msg);
                                }
                                #endregion
                            }
                        }

                        if (new BLL.T_Wo_WorkOrder().Add(model) > 0)
                        {
                            if (!string.IsNullOrEmpty(callid))
                            {
                                var rec = new BLL.T_Call_CallRecords().GetModelByCallId(callid);
                                if (rec != null)
                                {
                                    rec.IsExitWorkOrder = true;
                                    new BLL.T_Call_CallRecords().Update(rec);
                                }
                            }
                            res = Success("新增成功！");
                        }
                        else
                        {
                            res = Error("新增失败！");
                        }

                        #region no use
                        //Model.T_Wo_WorkOrderBase model = new Model.T_Wo_WorkOrderBase();
                        //model.F_CODE = DateTime.Now.ToString("yyyyMMddHHmmssms");//工单编号
                        //model.F_WORKORDERTYPEID = type;
                        //model.F_WORKORDERSTATEID = 0;
                        //model.F_WORKORDERNAME = "";
                        //model.F_WORKORDERFROM = "";
                        //model.F_WORKORDERLEVELID = 0;
                        //model.F_ADSLACCOUNT = callid;
                        ////model.F_USERID = ua.F_UserId;
                        ////model.F_USERNAME = ua.F_UserName;
                        ////model.F_USERPHONE = ua.F_WorkNumber;
                        //model.F_TypeName = "";
                        //model.F_STARTTIME = DateTime.Now;
                        //model.F_RETURNVISITFLAG = 0;
                        //model.F_LINKMANTELEPHONE = tsdh;
                        //model.F_LINKMAN = tskh;
                        //model.F_DELETEFLAG = 0;
                        //model.F_CUSTOMERTELEPHONE = tsdh;
                        //model.F_CUSTOMERNAME = tskh;
                        //model.F_CUSTOMERID = 0;//待实现
                        //model.F_CREATEDATE = DateTime.Now;
                        //model.F_CREATEBY = ua.F_UserId;
                        //model.F_CONTENT = cont;
                        //model.F_REPAIRMANNAME = tskh;
                        //model.F_REPAIRMANPHONE = tsdh;

                        //if (new BLL.T_Wo_WorkOrderBase().Add(model) > 0)
                        //{
                        //    res = Success("新增成功！");
                        //}
                        //else
                        //{
                        //    res = Error("新增失败！");
                        //} 
                        #endregion
                    }
                }

            }
            return res;
        }

    }
}