using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using AMESCoreStudio.Web.Models;
using Newtonsoft.Json;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.CommonTools.Result;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
using System.IO;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;
using AMESCoreStudio.WebApi.DTO.AMES;

namespace AMESCoreStudio.Web.Controllers
{
    public class KCSController : Controller
    {
        private readonly ILogger<KCSController> _logger;
        public readonly IKCS _kcsApi;
        public readonly IPCS _pcsApi;
        public readonly IBAS _basApi;

        public KCSController(ILogger<KCSController> logger, IKCS kcsApi, IPCS pcsApi, IBAS basApi)
        {
            _logger = logger;
            _kcsApi = kcsApi;
            _pcsApi = pcsApi;
            _basApi = basApi;

        }

        private async Task GetMaxClassGroup()
        {
            var result = await _kcsApi.GetMACInfo("DESC");

            if (result.Count == 0)
            {
                ViewBag.MaxClassGroup = "";
            }
            else
            {
                ViewBag.MaxClassGroup = result[0].ClassGroup;
            }

        }

        private void GetItemType()
        {
            var ItemTypeList = new List<SelectListItem>();

            ItemTypeList.Add(new SelectListItem("一般組件", "NP"));

            ItemTypeList.Add(new SelectListItem("KeyParts", "KP"));

            ItemTypeList.Add(new SelectListItem("組件確認", "CO"));

            ItemTypeList.Add(new SelectListItem("測試配備", "TQ"));

            ItemTypeList.Add(new SelectListItem("系統組件", "NI"));

            ItemTypeList.Add(new SelectListItem("前段組件", "A"));

            ItemTypeList.Add(new SelectListItem("後段組件", "B"));

            ViewBag.ItemTypeList = ItemTypeList;
        }

        private void GetSNInterval()
        {
            var SNIntervalList = new List<SelectListItem>();

            SNIntervalList.Add(new SelectListItem("不管控", "N"));

            SNIntervalList.Add(new SelectListItem("管控", "Y"));

            ViewBag.SNIntervalList = SNIntervalList;
        }


        private async Task GetFactoryUnitList()
        {
            var result = await _basApi.GetFactoryUnits();

            var FactoryItems = new List<SelectListItem>();
            for (int i = 0; i < result.Count; i++)
            {
                FactoryItems.Add(new SelectListItem(result[i].UnitName, result[i].UnitNo.ToString()));
            }
            ViewBag.FactoryUnit = FactoryItems;
        }

        private async Task GetItemsList()
        {
            var result = await _kcsApi.GetItems();

            var Items = new List<SelectListItem>();
            for (int i = 0; i < result.Count; i++)
            {
                Items.Add(new SelectListItem(result[i].ItemName, result[i].ItemNo.ToString()));
            }
            ViewBag.ItemsList = Items;
        }


        #region KCS001 MAC資料維護相關

        public IActionResult KCS001()
        {
            return View();
        }

        //新增頁面
        public async Task<IActionResult> KCS001C()
        {
            await GetMaxClassGroup();

            return View();
        }

        //修改页面
        [HttpGet]
        public async Task<IActionResult> KCS001UAsync(string id)
        {
            var result = await _kcsApi.GetMACInfo(id);

            if (result.Count == 0)
            {
                return View();
            }
            return View(result[0]);
        }

        public async Task<IActionResult> KCS001DAsync(string id)
        {
            var result = await _kcsApi.DeleteMACInfo(id);
            return Json(new Result() { success = true, msg = "" });
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> KCS001CSaveAsync(MACInfo model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PostMACInfo(JsonConvert.SerializeObject(model));


                if (result.Success)
                {
                    var _msg = "添加成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS001C", model);
        }

        public async Task<IActionResult> KCS001USaveAsync(MACInfo model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PutMACInfo(model.Class + "," + model.ClassGroup, JsonConvert.SerializeObject(model));

                if (result.Success)
                {
                    var _msg = "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS001U", model);
        }

        [HttpPost]
        public async Task<JsonResult> GetClassGroupDataAsync(string group_no)
        {
            var result = await _kcsApi.GetMACInfoes4KCS001(null, group_no, 0, 10);

            //将数据Json化并传到前台视图
            return Json(new { data = result });
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> GetMACInfoesAsync(string itemNO,string classGroupNo,int page = 0, int limit = 10)
        {
            var result_total = await _kcsApi.GetMACInfoes4KCS001(itemNO,classGroupNo,0, limit);
            var result = await _kcsApi.GetMACInfoes4KCS001(itemNO, classGroupNo, page, limit);

            if (result.Count > 0)
            {
                return Json(new Table() { code = 0, msg = "", data = result, count = result_total.Count });
            }

            return Json(new Table() { count = 0, data = null });
        }

        #endregion

        #region KCS002序號料號維護相關

        public IActionResult KCS002()
        {
            return View();
        }

        //新增頁面
        public IActionResult KCS002C()
        {
            return View();
        }

        //修改页面
        [HttpGet]
        public async Task<IActionResult> KCS002UAsync(string id)
        {
            var result = await _kcsApi.GetPartMap(id);

            if (result.Count == 0)
            {
                return View();
            }
            return View(result[0]);
        }

        public async Task<IActionResult> KCS002DAsync(string id)
        {
            var result = await _kcsApi.DeletePartMap(id);
            return Json(new Result() { success = true, msg = "" });
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> KCS002CSaveAsync(PartMap model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PostPartMap(JsonConvert.SerializeObject(model));


                if (result.Success)
                {
                    var _msg = "添加成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS002C", model);
        }

        public async Task<IActionResult> KCS002USaveAsync(PartMap model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PutPartMap(model.CorpSN, JsonConvert.SerializeObject(model));

                if (result.Success)
                {
                    var _msg = "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS002U", model);
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> GetPartMapsAsync(int page = 0, int limit = 10)
        {
            var result_total = await _kcsApi.GetPartMaps(0, limit);
            var result = await _kcsApi.GetPartMaps(page, limit);

            if (result.Count > 0)
            {
                return Json(new Table() { code = 0, msg = "", data = result, count = result_total.Count });
            }

            return Json(new Table() { count = 0, data = null });
        }

        #endregion

        #region KCS004組件料號序號維護相關

        public IActionResult KCS004()
        {
            return View();
        }

        //新增頁面
        public IActionResult KCS004C()
        {
            return View();
        }

        //修改页面
        [HttpGet]
        public async Task<IActionResult> KCS004UAsync(string id)
        {
            var result = await _kcsApi.GetKPLink(id);

            if (result.Count == 0)
            {
                return View();
            }
            return View(result[0]);
        }

        public async Task<IActionResult> KCS004DAsync(string id)
        {
            var result = await _kcsApi.DeleteKPLink(id);
            return Json(new Result() { success = true, msg = "" });
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> KCS004CSaveAsync(KPLink model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PostKPLink(JsonConvert.SerializeObject(model));


                if (result.Success)
                {
                    var _msg = "添加成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS004C", model);
        }

        public async Task<IActionResult> KCS004USaveAsync(KPLink model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PutKPLink(model.KeyPartSn, JsonConvert.SerializeObject(model));

                if (result.Success)
                {
                    var _msg = "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS004U", model);
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> GetKPLinksAsync(int page = 0, int limit = 10)
        {
            var result_total = await _kcsApi.GetKPLinks(0, limit);
            var result = await _kcsApi.GetKPLinks(page, limit);

            if (result.Count > 0)
            {
                return Json(new Table() { code = 0, msg = "", data = result, count = result_total.Count });
            }

            return Json(new Table() { count = 0, data = null });
        }

        #endregion

        #region KCS006組件類別資料維護相關

        public IActionResult KCS006()
        {
            return View();
        }

        //新增頁面
        public IActionResult KCS006C()
        {
            GetItemType();
            GetSNInterval();

            return View();
        }

        //修改页面
        [HttpGet]
        public async Task<IActionResult> KCS006UAsync(string id)
        {
            GetItemType();
            GetSNInterval();

            var result = await _kcsApi.GetItems(id);

            if (result.Count == 0)
            {
                return View();
            }
            return View(result[0]);
        }

        public async Task<IActionResult> KCS006DAsync(string id)
        {
            var result = await _kcsApi.DeleteItems(id);
            return Json(new Result() { success = true, msg = "" });
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> KCS006CSaveAsync(Items model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PostItems(JsonConvert.SerializeObject(model));


                if (result.Success)
                {
                    var _msg = "添加成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS006C", model);
        }

        public async Task<IActionResult> KCS006USaveAsync(Items model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PutItems(model.ItemNo, JsonConvert.SerializeObject(model));

                if (result.Success)
                {
                    var _msg = "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS006U", model);
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> GetItemsAsync(int page = 0, int limit = 10)
        {
            var result_total = await _kcsApi.GetItems(0, limit);
            var result = await _kcsApi.GetItems(page, limit);

            if (result.Count > 0)
            {
                return Json(new Table() { code = 0, msg = "", data = result, count = result_total.Count });
            }

            return Json(new Table() { count = 0, data = null });
        }

        #endregion

        #region KCS007組件類別資料維護相關
        public void GetUserID()
        {
            var userID = "";
            HttpContext.Request.Cookies.TryGetValue("UserID", out userID);
            int user_id = 0;
            if (userID != null)
            {
                if (int.Parse(userID.ToString()) >= 0)
                {
                    user_id = int.Parse(userID.ToString());
                }
            }
            ViewBag.UserID = user_id;
        }

        public IActionResult KCS007()
        {
            return View();
        }

        //新增頁面
        public async Task<IActionResult> KCS007C()
        {

            await GetItemsList();
            await GetFactoryUnitList();
            GetUserID();

            return View();
        }


        //修改页面
        public async Task<IActionResult> KCS007UAsync(int id)
        {

            await GetItemsList();
            await GetFactoryUnitList();
            GetUserID();
            var result = await _kcsApi.GetMaterialKp(id);

            if (result.Count == 0)
            {
                return View();
            }
            return View(result[0]);
        }

        public async Task<IActionResult> KCS007DAsync(int id)
        {
            var result = await _kcsApi.DeleteMaterialKp(id);
            return Json(new Result() { success = true, msg = "" });
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> KCS007CSaveAsync(MaterialKp model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PostMaterialKp(JsonConvert.SerializeObject(model));


                if (result.Success)
                {
                    var _msg = "添加成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS007C", model);
        }

        public async Task<IActionResult> KCS007USaveAsync(MaterialKp model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;

                result = await _kcsApi.PutMaterialKp(model.MaterialKpID, JsonConvert.SerializeObject(model));

                if (result.Success)
                {
                    var _msg = "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    if (result.Errors.Count > 0)
                    {
                        ModelState.AddModelError(result.Errors[0].Id, result.Errors[0].Msg);
                    }
                    else
                    {
                        ModelState.AddModelError("error", result.Msg);
                    }
                }
            }
            return View("KCS007U", model);
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> GetMaterialItemByItemNOAsync(string id)
        {
            var result = await _pcsApi.GetMaterialItemByItemNO(id);


            if (result != null)
            {
                return Json(new Result() { success = true, data = result });
            }

            return Json(new Result() { success = false, data = null });
        }
        public async Task<IActionResult> GetMaterialKpsByItemIDAsync(int id)
        {
            var result = await _kcsApi.GetMaterialKpsByItemID(id);


            if (result.Count > 0)
            {
                return Json(new Table() { code = 0, msg = "", data = result, count = result.Count });
            }

            return Json(new Table() { count = 0, data = null });
        }

        #endregion



        public IActionResult KCS005()
        {
            return View();
        }
        [HttpPost]
        public async Task<IActionResult> KCS005SaveAsync(InspectionResultBlob model, IFormFile formFile)
        {
            IResultModel result;
            var tt = await _kcsApi.GetKPLink("");

            var userID = "";
            HttpContext.Request.Cookies.TryGetValue("UserID", out userID);
            int user_id = 0;
            if (userID != null)
            {
                if (int.Parse(userID.ToString()) >= 0)
                {
                    user_id = int.Parse(userID.ToString());
                }
            }
            var msg = "";
            var file = formFile;

            if (formFile == null ) {


                msg+="未選取檔案或檔案上傳失敗";    
                ModelState.AddModelError("error", msg);
                return View("KCS005");
            }
                
            if (Path.GetExtension(file.FileName) != ".xlsx")
            {

                msg = "請使用Excel 2007(.xlsx)格式";
                ModelState.AddModelError("error", msg);
                return View("KCS005");
            }


            if (file.Length > 0)
            {
                using (var ms = new MemoryStream())
                {
                    file.CopyTo(ms);
                    var fileBytes = ms.ToArray();
                    string s = System.Convert.ToBase64String(fileBytes);                    
                    ClosedXML.Excel.XLWorkbook wb = new ClosedXML.Excel.XLWorkbook(ms);

                    if (wb.Worksheets.Count > 1)
                    {

                        msg = "工作表大於一頁";
                        ModelState.AddModelError("error", msg);
                        return View("KCS005");


                    }
                    else {



                        // 讀取第一個 Sheet
                        ClosedXML.Excel.IXLWorksheet worksheet = wb.Worksheet(1);

                        // 定義資料起始/結束 Cell
                        var firstCell = worksheet.FirstCellUsed();
                        var lastCell = worksheet.LastCellUsed();
                        var firstCol1 = worksheet.Cell(1,1).Value.ToString().ToUpper();
                        var firstCol2 = worksheet.Cell(1,2).Value.ToString().ToUpper();
                        var firstCol3 = worksheet.Cell(1,3).Value.ToString().ToUpper();
                        var erroCol = "";


                        if (lastCell.Address.ColumnNumber != 3)
                            erroCol += "請確認欄位是否正確,總數應為3欄\r\n";

                        if (firstCol1 != "KEY_PART_NO")
                            erroCol += "第一個欄位標題應該為KEY_PART_NO\r\n";

                        if (firstCol2 != "KEY_PART_SN")
                            erroCol += "第二個欄位標題應該為KEY_PART_SN\r\n";

                        if (firstCol3 != "PO_NO")
                            erroCol += "第三個欄位標題應該為PO_NO\r\n";

                        List<KPLink> kpLinks = new List<KPLink>();
                        kpLinks.Add(new KPLink());
                        kpLinks.Add(new KPLink());

                        for (int i = 2; i<= lastCell.Address.RowNumber; i++)
                        {
                            var Cell1 = worksheet.Cell(i, 1).Value.ToString().ToUpper();
                            var Cell2 = worksheet.Cell(i, 2).Value.ToString().ToUpper();
                            var Cell3 = worksheet.Cell(i, 3).Value.ToString().ToUpper();
                            KPLink kpLink = new KPLink();
                            kpLink.KeyPartNo = Cell1;
                            kpLink.KeyPartSn = Cell2;
                            kpLink.PoNo = Cell3;
                            kpLink.CreateUserID = user_id;
                            kpLink.UpdateUserID = user_id;
                            kpLink.CreateDate = System.DateTime.Now;
                            kpLink.UpdateDate = System.DateTime.Now;

                            if (string.IsNullOrEmpty(Cell1) || string.IsNullOrEmpty(Cell1))// || string.IsNullOrEmpty(Cell1))
                            {
                                erroCol += "第" + i + "列有缺少資料!!\r\n";
                            }
                            else { 
                                if(Cell1.Length > 20)
                                    erroCol += "第" + i + "列KEY_PART_NO資料過長!!\r\n";
                                if (Cell2.Length > 150)
                                    erroCol += "第" + i + "列KEY_PART_SN資料過長!!\r\n";
                                if (Cell3.Length > 20)
                                    erroCol += "第" + i + "列PO_NO資料過長!!\r\n";
                            }

                            //kpLinks[i]= kpLink;

                            kpLinks.Add(kpLink);

                        }


                        if (!string.IsNullOrEmpty(erroCol))
                        {
                            ModelState.AddModelError("error", erroCol);
                            return View("KCS005");
                        }
                        else {
                            var resultMsg = "";
                            var count = 0;
                            for (int i = 2; i <= lastCell.Address.RowNumber; i++) {
                                var kpLinkModel = kpLinks[i];

                                result = await _kcsApi.PostKPLink(JsonConvert.SerializeObject(kpLinkModel));

                                if (!result.Success)
                                {
                                    resultMsg += "第" + i + "列:資料寫入失敗!!!原因:" + result.Msg + "\r\n";
                                }
                                else
                                    count++;

                            }
                            if (resultMsg != "")
                            {

                                ModelState.AddModelError("error", resultMsg);
                                return View("KCS005");

                            }
                            else {

                                ModelState.AddModelError("error", "資料寫入成功!!");
                                return View("KCS005");
                                //var _msg = "資料寫入成功!!!";
                                //return RedirectToAction("Refresh", "Home", new { msg = _msg });
                            }


                        }

                    }

                }


            }

            return View("KCS005");
        }



    }
}