using AMESCoreStudio.CommonTools.Result;
using AMESCoreStudio.Web.Models;
using AMESCoreStudio.Web.ViewModels;
using AMESCoreStudio.Web.ViewModels.PCS;
using AMESCoreStudio.WebApi.DTO.AMES;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.Models.BAS;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Rendering;
using Microsoft.Extensions.Logging;
using Microsoft.AspNetCore.StaticFiles;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.IO;
using System.Linq;
using Newtonsoft.Json.Linq;
using System.Threading.Tasks;
using AMESCoreStudio.WebApi.Enum;
using Microsoft.Extensions.Localization;
using Microsoft.Extensions.Configuration;
using ClosedXML.Excel;
using Microsoft.VisualBasic;
using AMESCoreStudio.WebApi.Controllers.AMES;
using AMESCoreStudio.Web.Code;
using Castle.DynamicProxy.Contributors;
using DocumentFormat.OpenXml.Drawing.Charts;
using AspNetCore;
using AMESCoreStudio.Web.ViewModels.QRS;
using AMESCoreStudio.Web.ViewModels.AUS;

namespace AMESCoreStudio.Web.Controllers
{

    public class AUSController : Controller
    {
        private readonly ILogger<AUSController> _logger;
        private readonly ILogger<LoginController> _log;
        public readonly ISYS _sysApi;
        public readonly IPCS _pcsApi;
        public readonly IAUS _ausApi;
        public readonly IFileServerProvider _fileServerProvider;
        private readonly IStringLocalizer _sharedLocalizer;
        private readonly IConfiguration _configuration;

        /// <summary>
        /// 流水碼長度 改抓 GetWipNoNoLength取數量長度
        /// </summary>
        //public static int NoLength = 4;

        public AUSController(ILogger<AUSController> logger, ILogger<LoginController> log, IPCS pcsApi, IAUS ausApi, ISYS sysApi
            , IStringLocalizer<SharedResource> sharedLocalizer
            , IConfiguration configuration)
        {
            _logger = logger;
            _log = log;
            _pcsApi = pcsApi;
            _ausApi = ausApi;
            _sysApi = sysApi;
            _sharedLocalizer = sharedLocalizer;
            _configuration = configuration;

        }

        #region AUS001 條碼輸入作業

        [ResponseCache(Duration = 0)]
        [HttpGet]
        public async Task<IActionResult> AUS001()
        {
            var model = new AUS001ViewModel();

            await GetUserName();
            return View(model);
        }

        [HttpPost]
        public async Task<IActionResult> AUS001_GetWip(AUS001ViewModel model)
        {
            if ( model.PriorInput != model.ExtraBarcodeNo)
            {
                model.PriorInput = model.ExtraBarcodeNo;
                model.InputQTY += 1;
            }

            await GetUserName();
             //先查詢是否已有AUS Barcode Info, 沒有才去查BarcodeInfo
            var AusBarcode = await _ausApi.GetAUSBarcodeInfoByExtraBarcodeNo(model.ExtraBarcodeNo);
            if (AusBarcode.Count == 0)
            {
                if (model.ItemNO != null)
                {
                    var AUSInfos = new AUSBarcodeInfo
                    {
                        AUSBarcodeID = 0,
                        ExtraBarcodeNo = model.ExtraBarcodeNo,
                        ItemNo = model.ItemNO,
                        CreateUserID = GetLogInUserID(),
                        CreateDate = DateTime.Now,
                        UpdateDate = DateTime.Now

                    };
                    var postData = await _ausApi.PostAUSBarcodeInfo(JsonConvert.SerializeObject(AUSInfos));
                    if (postData.Success)
                    {
                        var Data = await _ausApi.GetAUSBarcodeInfoByExtraBarcodeNo(model.ExtraBarcodeNo);
                        model.AUSBarCodeID = Data.Select(s => s.AUSBarcodeID).FirstOrDefault();
                    }
                }
                else
                {
                    var query = await _pcsApi.GetBarcodeInfoesByExtraNo(model.ExtraBarcodeNo);
                    if (query.Count > 0)
                    {
                        if (query.Select(s => s.GetWipInfo.WipNO) != null  )
                        {
                            model.WipNO = query.Select(s => s.GetWipInfo.WipNO).FirstOrDefault();
                            var q = await _pcsApi.GetWipInfoByWipNO(model.WipNO);

                            if (q.Count != 0)
                            {
                                model.WipID = q.FirstOrDefault().WipID;
                                model.AUSBarCodeID = query.Select(s => s.BarcodeID).FirstOrDefault();
                                model.ItemNO = (await _pcsApi.GetWipAtt(model.WipNO)).ItemNO;
                                model.WipNO = q.FirstOrDefault().WipNO;
                                var AUSInfos = new AUSBarcodeInfo
                                {
                                    AUSBarcodeID = 0,
                                    ExtraBarcodeNo = model.ExtraBarcodeNo,
                                    ItemNo = model.ItemNO,
                                    CreateUserID = GetLogInUserID(),
                                    CreateDate = DateTime.Now,
                                    UpdateDate = DateTime.Now,
                                    WipNo = model.WipNO

                                };
                                var postData = await _ausApi.PostAUSBarcodeInfo(JsonConvert.SerializeObject(AUSInfos));
                                if (postData.Success)
                                {
                                    var AUSInfo = await _ausApi.GetAUSBarcodeInfoByExtraBarcodeNo(model.ExtraBarcodeNo);
                                    model.AUSBarCodeID = AUSInfo.Select(s => s.AUSBarcodeID).FirstOrDefault();

                                    var BarcodeItem = await _pcsApi.GetBarcodeItemByStr("0", query.Select(s => s.BarcodeNo).FirstOrDefault());

                                    List<AUSBarcodeItem> AUSItems = new List<AUSBarcodeItem>();
                                    foreach (var item in BarcodeItem)
                                    {
                                        var checkDataRedundancy = await _ausApi.CheckAUSBarcodeItemDataRedundancy(item.PartNo);
                                        if (checkDataRedundancy.Count() != 0)
                                        {
                                           // resultModel.Msg += "組件名稱【" + q_Kp.KpName + "】已有相同組件序號【" + KPs.inputData + "】紀錄 </br>";
                                        }
                                        else
                                        {

                                            var AUSItem = new AUSBarcodeItem
                                            {
                                                AUSBarcodeItemID = 0,
                                                AUSBarcodeID = model.AUSBarCodeID,
                                                ExtraBarcodeNo = model.ExtraBarcodeNo,
                                                ItemNo = item.ItemNo,
                                                KpItemNo = item.KpItemNo,
                                                PartNo = item.PartNo,
                                                CreateUserID = GetLogInUserID(),
                                                SysType = item.SysType,
                                                CreateDate = DateTime.Now,
                                                UpdateDate = DateTime.Now
                                            };
                                            AUSItems.Add(AUSItem);
                                        }
                                       
                                    }
                                    if (AUSItems.Count > 0)
                                    {
                                        var barcode_result = await _ausApi.PostAUSBarcodeItemList(JsonConvert.SerializeObject(AUSItems));
                                        if (barcode_result.Success)
                                        {
                                            var DataItem = await _ausApi.GetAUSBarcodeItemByExtraNo(model.ExtraBarcodeNo);
                                            model.AUSBarcodeItems = DataItem;
                                        }
                                    }
                                }
                            }
                        }
                    }
                }
            }
            else
            { //有查到資料,直接帶出AUS BarcodeItem
                model.ItemNO = AusBarcode.Select(s => s.ItemNo).FirstOrDefault();
                model.WipNO = AusBarcode.Select(s => s.WipNo).FirstOrDefault();
                model.AUSBarcodeItems = await _ausApi.GetAUSBarcodeItemByExtraNo(model.ExtraBarcodeNo);
                model.AUSBarCodeID = AusBarcode.Select(s => s.AUSBarcodeID).FirstOrDefault();
                model.WipNO = AusBarcode.Select(s => s.WipNo).FirstOrDefault();
            }

            #region 抓取數量


            if (model.WipNO == null)
            {
                model.QtyMemo = "";
            }
            else
            {
                var WipNoData = await _ausApi.GetAUSBarcodeInfoByWipNo(model.WipNO);
                model.AUS_WipNoQTY = WipNoData.Count; //工單AUS已刷數


                var q1 = await _pcsApi.GetWipInfoByWipNO(model.WipNO);
                model.EverPlanQTY = q1.Select(s => s.PlanQTY).FirstOrDefault();//昶亨計畫產量

                IResultModel<FqcInhouseMaster_WareDto> result = await _pcsApi.GetFqcInhouseMasterMultiQuery(wipNo: model.WipNO);
                if (result.Data.Count() != 0)
                {
                    model.EverFinishQTY = result.Data.Where(s => s.StatusName == "允收").Sum(s => int.Parse(s.BoxQty));
                }
                else
                {
                    model.EverFinishQTY = 0;//昶亨完成數
                }
                model.QtyMemo = "Plan : " + model.EverPlanQTY.ToString() + " /  Finish : " + model.EverFinishQTY.ToString() + " /  Wip : " + model.AUS_WipNoQTY.ToString();
            }
            #endregion
            return View("AUS001", model);
        }
        [HttpPost]
        public async Task<IActionResult> AUS001_Input(AUS001ViewModel model)
        {
            // ResultModel
            string Msg = string.Empty;
            bool Success = true;
            string Data = model.Input;
           // model.ExtraBarcodeNo = model.WipNO;
            #region 基本Input 輸入判斷
            if (string.IsNullOrWhiteSpace(model.ExtraBarcodeNo))
            {
                Msg += "Please scan rfc</br>";
            }
            if (string.IsNullOrWhiteSpace(model.ItemNO))
            {
                Msg += "Please scan Product</br>";
            }

            if (string.IsNullOrWhiteSpace(model.Input))
            {
                Msg += "Please scan Barcode</br>";
            }

            if (!string.IsNullOrWhiteSpace(Msg))
            {
                Success = false;
                return Json(new Result() { success = Success, msg = Msg, data = Data });
            }
            #endregion

          
                
                // Input為內部序號
          //  model.Barcode = true;
            var checkDataRedundancy = await _ausApi.CheckAUSBarcodeItemDataRedundancy(model.Input); //KP
            if (checkDataRedundancy.Count() != 0)
            {
           
                Msg = "A record with the same component serial number【" + model.Input + "】 already exists.</br>";
                Success = false;
                Data = string.Empty;
            }
            else
            {
                var AUSItem = new AUSBarcodeItem
                {
                    AUSBarcodeItemID = 0,
                    AUSBarcodeID = model.AUSBarCodeID,
                    ExtraBarcodeNo = model.ExtraBarcodeNo,
                    ItemNo = "",
                    PartNo = model.Input,
                    SysType = "I",
                    CreateUserID = GetLogInUserID(),
                    StateNo = "N",
                    CreateDate = DateTime.Now,
                };

                var barcode_result = await _ausApi.PostAUSBarcodeItem(JsonConvert.SerializeObject(AUSItem));
                if (!barcode_result.Success)
                    return Json(new Result() { success = barcode_result.Success, msg = barcode_result.Msg, data = null });
                // 過站判斷成功
                else
                {
                    Msg = barcode_result.Msg;
                    Data = string.Empty;
                }

            }
           
          

            return Json(new Result1() { success = Success, msg = Msg, data = Data, data1 = "" });
        }

        public async Task<IActionResult> AUS001DAsync(int id)
        {
            var barcodeItem = await _ausApi.DeleteAUSBarcodeItem(id);
            return Json(new Result() { success = (barcodeItem.Success), msg = barcodeItem.Msg });
        }
        #endregion


        public int GetLogInUserID()
        {
            int user_id = 0;
            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 async Task GetUserName()
        {
            int userId = GetLogInUserID();

            var user = await _sysApi.GetUserInfo(userId);
            if (!user.Any())
                ViewBag.UserNo = "";
            else
                ViewBag.UserNo = user.FirstOrDefault().UserNo + "(" + user.FirstOrDefault().UserName + ")";
        }
    }



}