using COMMON;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Models;
using Models.Models.DEBUGGER_DB;
using Models.Models.LOGDB;
using Newtonsoft.Json;
using Quartz;
using SERVER;
using SERVER.DataServer;
using SERVER.LIB;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using TcpServer;
using WebUI.LIB;
using static Models.TCPDATA;

namespace WebUI.Controllers
{
    /// <summary>
    /// api控制器
    /// </summary>
    public class ApiController : BaseController
    {
        private IScheduler _scheduler;

        private readonly LOG_DBContext _logdb;
        private readonly HotelServiceContext _db;
        private readonly DEBUGGER_DB _DEBUGGER_DB;
        private readonly ISchedulerFactory _schedulerFactory;

        /// <summary>
        /// 注入定时器等服务
        /// </summary>
        /// <param name="logdb"></param>
        /// <param name="schedulerFactory"></param>
        /// <param name="_DB"></param>
        /// <param name="db"></param>
        public ApiController(HotelServiceContext db, LOG_DBContext logdb, ISchedulerFactory schedulerFactory, DEBUGGER_DB _DB)
        {
            _db = db;
            _schedulerFactory = schedulerFactory;
            _logdb = logdb;
            _DEBUGGER_DB = _DB;
        }

        /// <summary>
        /// 下发固件、配置
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult SendCmd(int type = 1,params string[] mac)
        {
            try
            {
                foreach (var item in mac)
                {
                    XC_Redis.Redis.Remove(item);
                }
                return Json(Send_Cmd.Send_File(type,mac));
            }
            catch (Exception EX)
            {
                LogHelp.Error(EX.ToString());
                return null;
            }
        }

        /// <summary>
        /// 下发 固件、配置 进度条 
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Send_Schedule(int type = 1, params string[] mac)
        {
            try
            {
                Dictionary<string,string> macData = new Dictionary<string,string>();
                foreach (var item in mac)
                {
                    var rd = XC_Redis.Redis.GetKey<double>(item);
                    macData.Add(item, rd+"%");
                }
                return Json(macData);
            }
            catch (Exception EX)
            {
                LogHelp.Error(EX.ToString());
                return Content(EX.Message); ;
            }
        }
        /// <summary>
        /// 酒店信息
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult HOTELINFO()
        {
            try
            {
            IList<HotelDataItem> RESHotels = new List<HotelDataItem>();

                foreach (var item in CacheData.TBL_HOTEL_BASIC_INFO.GroupBy(X=>X.HOTEL_OLD_GROUP))
                {
                    var GROUP = CacheData.TBL_HOTEL_GROUP_INFO.FirstOrDefault(X=>X.HOTEL_GROUP_OLD_ID == item.First().HOTEL_OLD_GROUP);
                    if (GROUP == null)
                    {
                        LogHelp.Error(item.First().HOTEL_OLD_GROUP + "酒店组信息为null~");
                        continue;
                    }
                    RESHotels.Add(new HotelDataItem() {HotelGroupsName = GROUP.HOTEL_GROUP_NAME,HotelGroupsId = GROUP.HOTEL_GROUP_OLD_ID,Hotels = item.Select(X => new HotelsItem() { Auth = null, Code = X.PROJECT_NUMBER, HotelId = X.IDOLD, HotelName = X.HOTEL_NAME_CN }).ToList() });
                    RESHotels.Add(new HotelDataItem() {HotelGroupsName = GROUP.HOTEL_GROUP_NAME,HotelGroupsId = GROUP.HOTEL_GROUP_OLD_ID,Hotels = item.Select(X => new HotelsItem() { Auth = null, Code = X.PROJECT_NUMBER, HotelId = X.IDOLD, HotelName = X.HOTEL_NAME_CN }).ToList() });
                }
                 //       var RES = Hotels.ToArray();
                 //for(int i = 0; i < RES.Count();i++)
                 //{
                 //   for (int J = 0; J < RES[i].Hotels.Count; J++)
                 //   {
                 //       RES[i].Hotels[J].Auth = null;
                 //   }  
                 //}
                return Json(RESHotels);
            }
            catch (Exception EX)
            {
                LogHelp.Error(EX.ToString());
                return null;
            }

        }

        /// <summary>
        /// 房间信息  
        /// </summary>
        /// <param name="HotelId">酒店id</param>
        /// <param name="GroupId">酒店组id</param>
        /// <returns></returns>
        [HttpPost]
        public IActionResult ROOMINFO(int HotelId = 0,int GroupId = 0)
        {
            try
            {
                // 这里是进行了权限判断 以及数据的简单校验
                //if ((HotelId <= 0 && GroupId<=0) || (HotelId > 0 && Hoteldata.FirstOrDefault(X=>X.HotelId == HotelId)==null ))
                //    return Json(null);
                List<int> HotelDATA = HotelDATA = _db.TBL_HOTEL_BASIC_INFOS.Where(X => (GroupId ==0 || X.HOTEL_OLD_GROUP == GroupId) && (HotelId==0 || X.IDOLD == HotelId)).Select(X=>X.IDOLD).ToList();
                return Json(_db.TBL_ROOM_BASIC_INFOS.Where(x => HotelDATA.Contains(x.HOTEL_OLD_ID)).Select(x => new { text = x.ROOM_NUMBER, val = x.ROOM_OLD_ID,mac=x.MAC }));
            }
            catch (Exception EX)
            {
                LogHelp.Error(EX.ToString());
                return Json(null);
            }

        }



        /// <summary>
        /// 获取文件数据列表
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult SelModelFile(int start = 0, int length = 15, int draw = 0, string type = "")
        {
            try
            {
                int count = 0;
                int count_ = 0;
                var data = ModelFile.GetFtp(out count, out count_, start, length, type);
                return Json(new
                {
                    draw,
                    recordsTotal = count,
                    recordsFiltered = count_,
                    data = data
                });
            }
            catch (Exception ex)
            {
                LogHelp.Error(ex.ToString());
                return null;
            }
        }

        /// <summary>
        /// 添加文件数据 
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult AddModelFile(List<IFormFile> files, int type = -1)
        {
            try
            {
                return Json(ModelFile.AddModelFile(type, files, TOken, _db).Result);
            }
            catch (Exception ex)
            {
                LogHelp.Error(ex.ToString());
                return Json(false);
            }

        }


        /// <summary>
        /// 删除文件数据 
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult DelModelFile(int id)
        {
            try
            {
                return Json(ModelFile.DelModelFile(id, _db));
            }
            catch (Exception ex)
            {
                LogHelp.Error(ex.ToString());
                return Json(false);
            }

        }

        /// <summary>
        /// 刷新token 同时也返回服务器服务状态  
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Token()
        {
            try
            {

                Get();

                BaseController.SXTOKEN(this, HttpContext);
                return Json(new ReturnData<int[]> { IsSuccess = true, Result = new int[] { XC_Redis.Redis.GetKey<int>("udpserver"), TestingServices.ISok("BLV RUCS") } });
            }
            catch (Exception ex)
            {
                LogHelp.Error(ex.ToString());
                return Json(new ReturnData<String> { IsSuccess = false, Result = ex.Message });
            }

        }


        /// <summary>
        /// 刷新udp log  数 
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Getudplogcount()
        {
            try
            {
                return Json(new
                {
                    udp = CacheData.UDPcount,
                    // ruc 是没有直接跟房间绑定的  只能酒店房间 反推 ruc  rcu数量 等于房间绑定的rcu 数量
                    rcu = SelHotel == null ? 0 : _db.TBL_ROOM_BASIC_INFOS.Where(x => x.HOTEL_OLD_ID == SelHotel.HotelId && x.MAC.Length > 0).Count()
                });
            }
            catch (Exception ex)
            {
                LogHelp.Error(ex.ToString());
                return Json(new
                {
                    udp = 0,
                    // ruc 是没有直接跟房间绑定的  只能酒店房间 反推 ruc
                    rcu = 0
                });
            }
        }
     
        /// <summary>
        /// 获取rcu列表 分页
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetRCU(int start,int draw, int length, int room_online_satatus, string roomnumber,int room_type)
        {
            try
            {

            if (SelHotel != null)
            {
               
                int COUNT, COUNT_ = 0;
                var macdata = RcuServer.SetRucServer(out COUNT, out COUNT_,SelHotel.HotelId, start, length,room_online_satatus, roomnumber, room_type, _db);
                return Json(new
                {
                    draw,
                    recordsTotal = COUNT,
                    recordsFiltered = COUNT_,
                    data = macdata
                });
            }
            else
                return null;
            }
            catch (Exception EX)
            {
                LogHelp.Error(EX.ToString());
                return null;
            }
        }
        /// <summary>
        /// 切换酒店
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Sel(int id)
        {
            HotelsItem hotels = Hoteldata.FirstOrDefault(x => x.HotelId == id);
            if (hotels != null)
            {
                Response.Cookies.Append("old_host_" + TOken, id.ToString());
                COMMON.XC_Redis.Redis.SetKey(TOken_rom + "_sel", hotels);
            }
            return Json(new ReturnData<string> { IsSuccess = hotels != null, Result = null });
        }

        /// <summary>
        ///  退出登录
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult signout()
        {
            Response.Cookies.Delete("CurrentUser");
            // 删除会话用户标识
            XC_Redis.Redis.Remove(TOken + Cookie.Substring(Cookie.Length - 8) + "_rom");
            // 删除会话用户选择的 酒店
            XC_Redis.Redis.Remove(TOken_rom + "_sel");
            // 删除 随机截取的token  下标数组
            XC_Redis.Redis.Remove(TOken_rom);
            if (ConfigEntity.Instance.IsMore == false)
            {
                XC_Redis.Redis.Remove(TOken);
                XC_Redis.Redis.Remove(TOken + "__hoteldata");
            }
            return RedirectToAction("Index", "Login");
        }

        /// <summary>
        /// RUCS_CMD
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public IActionResult RUCS_CMD()
        {
            return Json(new { Send_RUCS_RCU_LIST = SendHelp.Send_RUCS_RCU_LIST().ToString() });
        }


        /// <summary>
        /// 获取酒店组视图
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetGroup(int group = 0, string search = "")
        {
            for (int i = 0; i < Hotels.Count; i++)
            {
                if (Hotels[i].HotelGroupsId == group)
                {
                    ViewData["HotelGroup"] = Hotels[i];
                }
            }
            ViewData["Hotel"] = SelHotel.HotelId;
            ViewData["search"] = string.IsNullOrEmpty(search) ? "" : search;
            return View(Hotels);
        }

        /// <summary>
        /// 获取酒店视图 未用到
        /// </summary>
        /// <returns> 未用到 </returns>
        [HttpPost]
        public IActionResult GetHotels(int GroupId)
        {
            return View();
        }



        /// <summary>
        /// 获取UDPINFO 通讯包数统计
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetCHARTS(int[] TX, int[] RX, string startDate, string endDate)
        {
            ECHARTS res = CHARTSSERVER.GetCHARTS(_logdb, TX, RX, startDate, endDate);
            return Json(res);
        }


        /// <summary>
        /// 获取UDPINFO 统计 通讯字节流量统计
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetErrorSucess(int[] TX, int[] RX, string startDate, string endDate)
        {
            ECHARTS res = CHARTSSERVER.GetErrorSucess(_logdb, startDate, endDate);
            return Json(res);
        }


        /// <summary>
        /// 获取UDPINFO 端口数据使用情况
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetProt(string startDate, string endDate)
        {
            ECHARTS res = CHARTSSERVER.GetProt(_logdb, startDate, endDate);
            return Json(res);
        }


        /// <summary>
        /// 获取UDPINFO 处理耗时
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetPROCESSINGTIME(string startDate, string endDate)
        {
            ECHARTS res = CHARTSSERVER.GetPROCESSINGTIME(_logdb, startDate, endDate);
            return Json(res);
        }

        /// <summary>
        /// 获取UDPINFO 处理耗时
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetRevDelayDateTime(string startDate, string endDate)
        {
            ECHARTS res = CHARTSSERVER.GetRevDelayDateTime(_logdb, startDate, endDate);
            return Json(res);
        }

        /// <summary>
        /// 获取UDPINFO 命令饼图 tx rx
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetCMDpie(string startDate, string endDate, string type = "TX")
        {
            ECHARTS res = CHARTSSERVER.GetCMDpie_(_logdb, startDate, endDate, type);
            return Json(res);
        }

        /// <summary>
        /// 获取UDPINFO 重发饼图 tx rx
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult GetRETRY_COUNT(string startDate, string endDate, string type = "TX")
        {
            ECHARTS res = CHARTSSERVER.GetRETRY_COUNT(_logdb, startDate, endDate, type);
            return Json(res);
        }

        /// <summary>
        /// 更改服务状态
        /// </summary>
        /// <returns></returns>
        [HttpPost]
        public IActionResult Changerserver(int type)
        {
            return Json(TestingServices.ISok("BLV RUCS", type));
        }

        /// <summary>
        /// 同步数据
        /// </summary>
        public void Get()
        {
            if (Client.dateTime == string.Empty) { return; }
            lock (Client.dateTimelocks)
            {
                if (Client.dateTime == null)
                {
                    Client.dateTime = "000000000";
                    Thread thread = new Thread(async () =>
                  {

                      //1、通过调度工厂获得调度器
                      _scheduler = await _schedulerFactory.GetScheduler();
                      //2、开启调度器
                      await _scheduler.Start();
                      //3、创建一个触发器
                      var trigger = TriggerBuilder.Create()
                                .WithCronSchedule("0/3 * * * * ?")//间隔3秒 检测 tcp 是否在运行
                                .Build();
                      //3、创建一个触发器
                      var trigger1 = TriggerBuilder.Create()
                                .WithCronSchedule("0 00 00 * * ? *")// 每日 0 点触发 同步数据
                               .Build();
                      //3、创建一个触发器
                      var trigger2 = TriggerBuilder.Create()
                                .WithCronSchedule("4 20 * * * ?")//每个小时 10min 统计字节流量等
                                .Build();
                      //4、创建任务
                      //  检测tcp 是否在运行
                      var jobDetail = JobBuilder.Create<Jobs>()
                                     .Build();
                      //4、创建任务  
                      // 同步数据
                      var jobDetail1 = JobBuilder.Create<JobsOne>()
                                     .Build();
                      //4、创建任务
                      //  统计字数数量等
                      var jobDetai2 = JobBuilder.Create<JobsTwo>()
                                     .Build();
                      //5、将触发器和任务器绑定到调度器中
                      await _scheduler.ScheduleJob(jobDetail, trigger);
                      await _scheduler.ScheduleJob(jobDetail1, trigger1);
                      await _scheduler.ScheduleJob(jobDetai2, trigger2);

                  });
                    thread.Start();
                }
            }
        }

        #region  BLV_UdpDebug    数据统计图
        /// <summary>
        /// 数据统计图
        /// </summary>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        public IActionResult GetBLV_UdpDebugImg(string startDate, string endDate)
        {
            ECHARTS res = CHARTSSERVER.GetBLV_UdpDebugImg(_DEBUGGER_DB, startDate, endDate);
            return Json(res);
        }
        #endregion

        #region  BLV_UdpDebug   数据统计饼图
        /// <summary>
        /// 数据统计饼图  通讯命令 数据统计接收耗时条形统计图
        /// </summary>
        /// <param name="startDate"></param>
        /// <param name="endDate"></param>
        /// <returns></returns>
        public IActionResult GetBLV_UdpDebugImg_PIE(string startDate, string endDate)
        {
            ECHARTS res = CHARTSSERVER.GetBLV_UdpDebugImg_RevDelayDateTime(_DEBUGGER_DB, startDate, endDate);
            return Json(res);
        }
        #endregion

    }
}