using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.DependencyInjection;
using SolarPower.Models.User;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc.Filters;
using Dapper;
using SolarPower.Models;
using System.Data.SqlClient;
using Microsoft.Extensions.Configuration;
using SolarPower.Repository.Interface;
using System.IO;
using System.Text;
using SolarPower.Models.OperatorLogModel;
using Newtonsoft.Json;
using SolarPower.Models.Company;
using SolarPower.Models.Role;
using Microsoft.AspNetCore.Routing;

namespace SolarPower.Controllers
{
    public class MyBaseController<T> : Controller where T : MyBaseController<T>
    {
        private ILogger<T> _logger;

        protected ILogger<T> Logger => _logger ?? (_logger = HttpContext?.RequestServices.GetService<ILogger<T>>());
        private IUserRepository userRepository => HttpContext?.RequestServices.GetService<IUserRepository>();
        private ICompanyRepository companyRepository => HttpContext?.RequestServices.GetService<ICompanyRepository>();
        private IRoleRepository roleRepository => HttpContext?.RequestServices.GetService<IRoleRepository>();
        private IPowerStationRepository powerStationRepository => HttpContext?.RequestServices.GetService<IPowerStationRepository>();
        private IOperatorLogRepository operatorLogRepository => HttpContext?.RequestServices.GetService<IOperatorLogRepository>();

        protected MyUser myUser = null;
        public string controllerName;
        public string actionName;
        public string baseURL => HttpContext?.Request.Scheme + "://" + HttpContext?.Request.Host + "/";

        public ErrorCode errorCode = new ErrorCode();

        public MyBaseController()
        {
        }

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            base.OnActionExecuting(filterContext);

            EDFunction edFunction = new EDFunction();
            var myAccount = edFunction.AESDecrypt(HttpContext.Session.GetString("MyAccount")); //取得登入後，該位使用者的Account

            controllerName = ControllerContext.RouteData.Values["controller"].ToString();   //controller名稱
            actionName = ControllerContext.RouteData.Values["action"].ToString();   //action名稱

            if (string.IsNullOrEmpty(myAccount))
            {
                filterContext.Result = new RedirectToRouteResult(
                                        new RouteValueDictionary
                                        {
                                            {"controller", "Login"},
                                            {"action", "Index"}
                                        });
                return;
            }

            //取得當前登入使用者資訊
            myUser = userRepository.GetMyUserInfoByAccount(myAccount);
            myUser.Company = companyRepository.GetMyCompanyInfoById(myUser.CompanyId);
            myUser.Role = roleRepository.GetMyRoleInfoById(myUser.RoleId);

            List<string> auth_arr = new List<string>();

            foreach (var auth in myUser.Role.Auths)
            {
                var per_auch_arr = auth.Split(',');
                foreach (var x in per_auch_arr)
                {
                    auth_arr.Add(x);
                }
            }

            if (myUser.Role.Layer != (int)RoleLayerEnum.PlatformAdmin && !auth_arr.Contains(controllerName))
            {
                filterContext.Result = new RedirectToRouteResult(
                                        new RouteValueDictionary
                                        {
                                            {"controller", "Login"},
                                            {"action", "Index"}
                                        });
                return;
            }


            //取得當前使用者可以查看的電站
            var myPowerStationSummaries = powerStationRepository.GetMyPowerStationSummary(myUser);
            ViewBag.myPowerStationSummaries = myPowerStationSummaries;

            if (controllerName == "PowerStation" && actionName == "Edit")
            {
                //電站資訊的各電站
                string stationId_param = filterContext.HttpContext.Request.Query["stationId"];

                int stationId = stationId_param == "new" ? 0 : int.Parse(stationId_param);

                if (stationId > 0)
                {
                    var hasSubTagNum = false;
                    int i = 0;
                    foreach(var myPowerStationSummary in myPowerStationSummaries)
                    {
                        if (hasSubTagNum)
                        {
                            break;
                        }
                        int j = 0;
                        foreach(var myPowerStation in myPowerStationSummary.MyPowerStations)
                        {
                            if(myPowerStation.PowerStationId == stationId)
                            {
                                ViewData["SubNum"] = i;
                                ViewData["TagNum"] = j;
                                hasSubTagNum = true;
                                break;
                            }
                            j++;
                        }
                        i++;
                    }
                }
            }

            ViewBag.auths = auth_arr;

            ViewBag.myUser = myUser;

            #region 記錄人員操作記錄
            var content = JsonConvert.SerializeObject(filterContext.ActionArguments);

            OperatorLog operatorLog = new OperatorLog()
            {
                ControllerName = controllerName,
                ActionName = actionName,
                Parameter = content.CompareTo("{}") == 0 ? null : content,
                CreatedBy = myUser.Id,
            };

            List<string> removeParam = new List<string>() { "ChangePassword" }; //移除不紀錄參數的actionName
            if (removeParam.Any(x => actionName.Contains(x)))
            {
                operatorLog.Parameter = "{}";
            }

            List<string> properties = new List<string>()
            {
                "ControllerName",
                "ActionName",
                "Parameter",
                "CreatedBy",
            };
            operatorLogRepository.Add(operatorLog, properties);
            #endregion
        }

        /// <summary>
        /// 判斷是否維平台的管理員或平台使用者
        /// </summary>
        /// <param name="roleLayer"></param>
        /// <returns></returns>
        public bool IsPlatformLayer(byte roleLayer)
        {
            if (roleLayer == (int)RoleLayerEnum.PlatformAdmin || roleLayer == (int)RoleLayerEnum.PlatformUser)
            {
                return true;
            }

            return false;
        }

        /// <summary>
        /// 取得最新的流水號
        /// </summary>
        /// <param name="current">當前的</param>
        /// <param name="pad"></param>
        /// <param name="direction">0: PadLeft；1: PadRight</param>
        /// <returns></returns>
        public string GetLastSerialNumber(string current = "", int pad = 4, byte direction = 0)
        {
            var tempSerialNumber = 0;
            if (!string.IsNullOrEmpty(current))
            {
                tempSerialNumber = Convert.ToInt32(current) + 1;
            }
            else
            {
                tempSerialNumber = 1;
            }

            if (direction == 0)
            {
                return tempSerialNumber.ToString().Trim().PadLeft(pad, '0');
            }
            else
            {
                return tempSerialNumber.ToString().Trim().PadRight(pad, '0');
            }
        }

    }
}
