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

namespace AMESCoreStudio.Web.Controllers
{
    /// <summary>
    /// ASM管理模組
    /// </summary>
    public class ASMController : Controller
    {
        private readonly ILogger<ASMController> _logger;
        public readonly IPCB _pcbApi;
        public readonly IASM _asmApi;
        private readonly IWebHostEnvironment _env;
        public readonly IPCS _pcsApi;
        public readonly IBLL _bllApi;
        public ASMController(ILogger<ASMController> logger, IASM asmApi, IPCB pcbApi, IWebHostEnvironment env, IPCS pcsApi, IBLL bllApi)
        {
            _logger = logger;
            _pcbApi = pcbApi;
            _asmApi = asmApi;
            _env = env;
            _pcsApi = pcsApi;
            _bllApi = bllApi;
        }


        

        


        /// <summary>
        /// 登入UserID
        /// </summary>
        /// <returns></returns>
        public int GetLogInUserID()
        {
            int user_id = -1;
            HttpContext.Request.Cookies.TryGetValue("UserID", out string userID);

            if (userID != null)
            {
                if (int.Parse(userID.ToString()) >= 0)
                {
                    user_id = int.Parse(userID.ToString());
                }
            }
            return user_id;
        }

        public ActionResult ASM012()
        {
            return View();
        }

        public async Task<IActionResult> GetBoxBarcodeAsync(string ID)
        {
            var result = await _asmApi.GetBarcodeInfoesByBoxNo(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 });
        }

        //修改页面
        [HttpGet]
        public async Task<IActionResult> ASM012U(int id)
        {
            var result = await _asmApi.GetBarcodeInfoes(id);
            if (result.Count == 0)
            {
                return View();
            }

            return View(result[0]);
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> ASM012USaveAsync(BarcodeInfo model,string newBarcodeNo,string newExtraBarcodeNo)
        {
            int userID = GetLogInUserID();
            var old_barcodeInfo = await _asmApi.GetBarcodeInfoesByNo(model.BarcodeNo);
            string oldItemNo = old_barcodeInfo[0].GetWipInfo.GetWipAtt.ItemNO;
            

            if (ModelState.IsValid)
            {
                if (newBarcodeNo != null)
                {
                    var barcodeInfo = await _asmApi.GetBarcodeInfoesByNo(newBarcodeNo);

                    if (barcodeInfo.Count == 0)
                    {
                        ModelState.AddModelError("error", "查不到新生產序號");
                        return View("ASM012U", model);
                    }
                    else
                    {
                        if (newExtraBarcodeNo != null)
                        {
                            if (barcodeInfo[0].ExtraBarcodeNo != newExtraBarcodeNo)
                            {
                                ModelState.AddModelError("error", "新生產序號&新出貨序號不匹配");
                                return View("ASM012U", model);
                            }
                        }

                        if (model.BarcodeNo == newBarcodeNo)
                        {
                            ModelState.AddModelError("error", "新舊生產序號不能一樣");
                            return View("ASM012U", model);
                        }

                        string newItemNo = barcodeInfo[0].GetWipInfo.GetWipAtt.ItemNO;

                        if (oldItemNo != newItemNo)
                        {
                            ModelState.AddModelError("error", "新舊生產序號料號不一樣");
                            return View("ASM012U", model);
                        }

                        if (barcodeInfo[0].BoxNo != "" && barcodeInfo[0].BoxNo != null)
                        {
                            ModelState.AddModelError("error", "新生產序號已經綁定箱號");
                            return View("ASM012U", model);
                        }

                        if (barcodeInfo[0].StatusNo != "PKG" && barcodeInfo[0].StatusNo != "OVE")
                        {
                            ModelState.AddModelError("error", "新生產序號未完成包裝");
                            return View("ASM012U", model);
                        }

                        int newBarcodeId = barcodeInfo[0].BarcodeID;

                        int oldBarcodeId = model.BarcodeID;
                        string oldBarcodeNo = model.BarcodeNo;
                        string boxNo = old_barcodeInfo[0].BoxNo;
                        string oldExtraBarcodeNo = old_barcodeInfo[0].ExtraBarcodeNo;
                        newExtraBarcodeNo = barcodeInfo[0].ExtraBarcodeNo;

                        var result = await _asmApi.DisplaceBarcode4ASM012(oldBarcodeId, oldBarcodeNo, oldExtraBarcodeNo, newBarcodeId, newBarcodeNo, newExtraBarcodeNo, boxNo, userID);

                        if (result.Success)
                        {
                            var _msg = "置換成功!";
                            return RedirectToAction("Refresh", "Home", new { msg = _msg });
                        }
                        else
                        {
                            ModelState.AddModelError("error", "置換失败");
                            return View("ASM012U", model);
                        }
                    }
                }
                else
                {
                    if (newExtraBarcodeNo != null)
                    {
                        var barcodeInfo = await _asmApi.GetBarcodeInfoesByExtraNo(newExtraBarcodeNo);

                        if (barcodeInfo.Count == 0)
                        {
                            ModelState.AddModelError("error", "查不到新出貨序號");
                            return View("ASM012U", model);
                        }

                        if (model.ExtraBarcodeNo == newExtraBarcodeNo)
                        {
                            ModelState.AddModelError("error", "新舊出貨序號不能一樣");
                            return View("ASM012U", model);
                        }

                        string newItemNo = barcodeInfo[0].GetWipInfo.GetWipAtt.ItemNO;

                        if (oldItemNo != newItemNo)
                        {
                            ModelState.AddModelError("error", "新舊出貨序號料號不一樣");
                            return View("ASM012U", model);
                        }

                        if (barcodeInfo[0].BoxNo != "" && barcodeInfo[0].BoxNo != null)
                        {
                            ModelState.AddModelError("error", "新出貨序號已經綁定箱號");
                            return View("ASM012U", model);
                        }

                        if (barcodeInfo[0].StatusNo != "PKG" && barcodeInfo[0].StatusNo != "OVE")
                        {
                            ModelState.AddModelError("error", "新出貨序號未完成包裝");
                            return View("ASM012U", model);
                        }

                        int newBarcodeId = barcodeInfo[0].BarcodeID;

                        int oldBarcodeId = model.BarcodeID;
                        string oldExtraBarcodeNo = model.ExtraBarcodeNo;
                        string oldBarcodeNo = model.BarcodeNo;
                        string boxNo = old_barcodeInfo[0].BoxNo;
                        newBarcodeNo = barcodeInfo[0].BarcodeNo;

                        var result = await _asmApi.DisplaceExtraBarcode4ASM012(oldBarcodeId, oldBarcodeNo, oldExtraBarcodeNo, newBarcodeId, newBarcodeNo, newExtraBarcodeNo, boxNo, userID);

                        if (result.Success)
                        {
                            var _msg = "置換成功!";
                            return RedirectToAction("Refresh", "Home", new { msg = _msg });
                        }
                        else
                        {
                            ModelState.AddModelError("error", "置換失败");
                            return View("ASM012U", model);
                        }
                    }
                }
            }

            return View("ASM012U", model);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task<IActionResult> ASM012DAsync(int id)
        {
            int userID = GetLogInUserID();
            var barcodeInfo = await _asmApi.GetBarcodeInfoes(id);

            var result = await _asmApi.DeleteBarcode4ASM012(id, barcodeInfo[0].BarcodeNo, barcodeInfo[0].BoxNo, userID);
            return Json(new Result() { success = true, msg = "" });
        }
    }
}