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

namespace AMESCoreStudio.Web.Controllers
{
    public class PDSController : Controller
    {
        private readonly ILogger<PDSController> _logger;
        public readonly IBAS _basApi;
        public readonly IPCS _pcsApi;
        public readonly IPDS _pdsApi;

        public PDSController(ILogger<PDSController> logger, IPCS pcsApi, IBAS basApi,IPDS pdsApi)
        {
            _logger = logger;
            _pcsApi = pcsApi;
            _basApi = basApi;
            _pdsApi = pdsApi;
        }

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

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

        private async Task GetLineInfoList()
        {
            var result = await _basApi.GetLineInfoes();

            var LineItems = new List<SelectListItem>();
            for (int i = 0; i < result.Count; i++)
            {
                LineItems.Add(new SelectListItem(result[i].LineDesc, result[i].LineID.ToString()));
            }
            ViewBag.LineList = LineItems;
        }

        private async Task GetFlowRuleList()
        {
            var result = await _basApi.GetFlowRules();

            var FlowRuleItems = new List<SelectListItem>();
            for (int i = 0; i < result.Count; i++)
            {
                FlowRuleItems.Add(new SelectListItem(result[i].UnitNo + result[i].FlowRuleName, result[i].FlowRuleID.ToString()));
            }
            ViewBag.FlowRuleList = FlowRuleItems;
        }

        [HttpPost]
        public async Task<JsonResult> GetUnitLineJson(string unit_no)
        {
            var result = await _basApi.GetLineInfoByUnit(unit_no);

            var item = new List<SelectListItem>();

            for (int i = 0; i < result.Count; i++)
            {
                item.Add(new SelectListItem(result[i].LineDesc, result[i].LineID.ToString()));
            }

            if (item.Count == 0)
            {
                item.Add(new SelectListItem("全部", "0"));
            }

            //将資料Json化并传到前台视图
            return Json(new { data = item });
        }

        public async Task<IActionResult> PDS003()
        {
            await GetUnitList();
            await GetLineInfoList();
            await GetFlowRuleList();

            return View();
        }

        [HttpPost]
        public async Task<IActionResult> PDS003SaveAsync(string unitNo,int lineId,int flowId,IFormFile formFile)
        {
            IResultModel result1;
            IResultModel<dynamic> result2;

            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());
                }
            }

            await GetUnitList();
            await GetLineInfoList();
            await GetFlowRuleList();

            var file = formFile;
            var msg = "";

            if (unitNo == "*")
            {
                msg += "未選擇製程單位";
                ModelState.AddModelError("error", msg);
                return View("PDS003");
            }

            if (lineId == 0)
            {
                msg += "未選擇線別";
                ModelState.AddModelError("error", msg);
                return View("PDS003");
            }

            if (flowId == 0)
            {
                msg += "未選擇流程";
                ModelState.AddModelError("error", msg);
                return View("PDS003");
            }


            if (formFile == null)
            {
                msg += "未選取檔案或檔案上傳失敗";
                ModelState.AddModelError("error", msg);
                return View("PDS003");
            }

            if (Path.GetExtension(file.FileName) != ".xlsx")
            {
                msg += "請使用Excel 2007(.xlsx)格式";
                ModelState.AddModelError("error", msg);
                return View("PDS003");
            }

            if (file.Length > 0)
            {
                string[] fileTitle = file.FileName.Split("_");

                string wipNO = fileTitle[2];
                string itemNO = fileTitle[3];
                int playQty = 0;
                int.TryParse(fileTitle[4].Replace("pc", ""), out playQty);
                int wipID = -1;
                bool existFlag = false;
                ViewBag.WipNo = wipNO;

                //虛擬工單
                result2 = await _pcsApi.GetWipInfo4PDS003(wipNO);
                if (result2.DataTotal == 0)
                {
                    WipInfo wip_info = new WipInfo();
                    wip_info.WipNO = wipNO;
                    wip_info.PlanQTY = playQty;
                    wip_info.LineID = lineId;
                    wip_info.UnitNO = unitNo;
                    wip_info.FlowRuleID = flowId;
                    wip_info.StatusNO = "A";
                    wip_info.WipTimes = 1;
                    wip_info.Werks = "YSOS";
                    wip_info.WipType = "S";
                    wip_info.CustomerType = -1;
                    wip_info.CreateUserID = user_id;
                    wip_info.CreateDate = System.DateTime.Now;

                    result1 = await _pcsApi.PostWipInfo(JsonConvert.SerializeObject(wip_info));

                    if (!result1.Success)
                    {
                        msg += "虛擬工單建立WIP_INFO失敗!!!原因:" + result1.Msg + "\r\n";
                        ModelState.AddModelError("error", msg);
                        return View("PDS003");
                    }
                    else
                    {
                        int.TryParse(result1.Msg, out wipID);

                        //WIP_ATT
                        WipAtt wip_att = new WipAtt();
                        wip_att.WipNO = wipNO;
                        wip_att.ItemNO = itemNO;
                        wip_att.CreateUserID = user_id;
                        wip_att.CreateDate = System.DateTime.Now;

                        result1 = await _pcsApi.PostWipAtt(JsonConvert.SerializeObject(wip_att));
                        if (!result1.Success)
                        {
                            msg += "虛擬工單建立WIP_ATT失敗!!!原因:" + result1.Msg + "\r\n";
                            ModelState.AddModelError("error", msg);
                            return View("PDS003");
                        }

                        //開線
                        var line_info = await _basApi.GetLineInfo(lineId);
                        LineInfo line = new LineInfo();
                        line.LineID = lineId;
                        line.DeptID = line_info[0].DeptID;
                        line.LineDesc = line_info[0].LineDesc;
                        line.Story = line_info[0].Story;
                        line.UnitNo = line_info[0].UnitNo;
                        line.WipNo = wipID;
                        line.StatusNo = line_info[0].StatusNo;
                        line.CreateUserId = line_info[0].CreateUserId;
                        line.CreateDate = line_info[0].CreateDate;
                        line.UpdateDate = line_info[0].UpdateDate;

                        result1 = await _basApi.PutLineInfo(lineId, JsonConvert.SerializeObject(line));
                        if (!result1.Success)
                        {
                            msg += "虛擬工單開線失敗!!!原因:" + result1.Msg + "\r\n";
                            ModelState.AddModelError("error", msg);
                            return View("PDS003");
                        }
                    }
                }
                else
                {
                    existFlag = true;

                    foreach (var item in result2.Data)
                    {
                        JObject jo = JObject.Parse(item.ToString());
                        wipID = int.Parse(jo["wipID"].ToString());
                        lineId = int.Parse(jo["lineID"].ToString());
                        flowId = int.Parse(jo["flowRuleID"].ToString());
                        
                    }
                }
                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("PDS003");
                    }
                    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();
                        var firstCol2 = worksheet.Cell(1, 2).Value.ToString();
                        var firstCol3 = worksheet.Cell(1, 3).Value.ToString();
                        var firstCol4 = worksheet.Cell(1, 4).Value.ToString();
                        var firstCol5 = worksheet.Cell(1, 5).Value.ToString();
                        var firstCol6 = worksheet.Cell(1, 6).Value.ToString();
                        var erroCol = "";


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

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

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

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

                        if (firstCol4 != "MB")
                            erroCol += "第四個欄位標題應該為MB\r\n";

                        if (firstCol5 != "MAC")
                            erroCol += "第五個欄位標題應該為MAC\r\n";

                        if (firstCol6 != "Panel")
                            erroCol += "第六個欄位標題應該為Panel\r\n";

                        var resultMsg = "";
                        var count = 0;

                        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();
                            var Cell4 = worksheet.Cell(i, 4).Value.ToString().ToUpper();
                            var Cell5 = worksheet.Cell(i, 5).Value.ToString().ToUpper();
                            var Cell6 = worksheet.Cell(i, 6).Value.ToString().ToUpper();

                            if (string.IsNullOrEmpty(Cell1) || string.IsNullOrEmpty(Cell2) || string.IsNullOrEmpty(Cell3) || string.IsNullOrEmpty(Cell4) || string.IsNullOrEmpty(Cell5) || string.IsNullOrEmpty(Cell6))
                            {
                                resultMsg += "第" + i + "列有缺少資料!!\r\n";
                            }
                            else
                            {
                                if (!existFlag)
                                {
                                    //設定工單條碼起訖
                                    WipBarcode wip_barcode = new WipBarcode();
                                    wip_barcode.WipNO = wipNO;
                                    wip_barcode.StartNO = Cell3;
                                    wip_barcode.EndNO = Cell3;
                                    wip_barcode.UnitNO = unitNo;
                                    wip_barcode.WipID = wipID;

                                    result1 = await _pcsApi.PostWipBarcode(JsonConvert.SerializeObject(wip_barcode));
                                    if (result1.Success)
                                    {
                                        resultMsg += "第" + i + "行:設定工單起訖成功!!!" + "\r\n";
                                    }
                                    else
                                    {
                                        resultMsg += "第" + i + "行:設定工單起訖失敗!!!原因:" + result1.Msg + "\r\n";
                                    }
                                }

                                //获取站别
                                var rule_station = await _basApi.GetRuleStationsByFlow(flowId);
                                int ruleStationID = rule_station[0].RuleStationID;
                                int stationID = rule_station[0].StationID;
                                //自動過站
                                var barCode = new BarCodeCheckDto
                                {
                                    wipNo = wipNO,
                                    barcode = Cell3,
                                    barcodeType = "S",
                                    stationID = stationID,
                                    line = lineId,
                                    unitNo = unitNo,
                                    inputItems = null,
                                    userID = user_id
                                };

                                var barcode_result = new ResultModel<string>();
                                try
                                {
                                    barcode_result = await _pcsApi.PassIngByCheck(JsonConvert.SerializeObject(barCode));
                                }
                                catch { }

                                if (barcode_result.Success)
                                {
                                    resultMsg += "第" + i + "行:資料過站成功!!!" + "\r\n";
                                }
                                else
                                {
                                    resultMsg += "第" + i + "行:資料過站失敗!!!原因:" + barcode_result.Msg + "\r\n";
                                }

                                //儲存資料

                                SNKeyPart snKeyPart = new SNKeyPart();
                                snKeyPart.StockInNo = fileTitle[2];
                                snKeyPart.StockInPn = fileTitle[3];
                                snKeyPart.KPDate = System.DateTime.Parse(Cell1);
                                snKeyPart.KPItem = int.Parse(Cell2);
                                snKeyPart.KPSn = Cell3;
                                snKeyPart.KPMb = Cell4;
                                snKeyPart.KPMac = Cell5;
                                snKeyPart.KPPanel = Cell6;
                                snKeyPart.CreateUserID = user_id;
                                snKeyPart.CreateDate = System.DateTime.Now;

                                result1 = await _pdsApi.PostSNKeyPart(JsonConvert.SerializeObject(snKeyPart));

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

                                /*
                                if (Cell1.Length > 20)
                                    erroCol += "第" + i + "列DATE資料過長!!\r\n";
                                */
                            }

                        }
                        if (resultMsg != "")
                        {
                            ModelState.AddModelError("error", resultMsg);
                            return View("PDS003");

                        }
                        else
                        {
                            ModelState.AddModelError("error", "資料寫入成功!!");
                            return View("PDS003");
                        }

                    }

                }


            }

            return View("PDS003");
        }

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> GetSNKeyPartByStockInNo(string no, int page = 0, int limit = 10)
        {
            var result_total = await _pdsApi.GetSNKeyPartByStockInNo(no, 0, limit);
            var result = await _pdsApi.GetSNKeyPartByStockInNo(no, page, limit);

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

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