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;
using static AMESCoreStudio.Web.ViewModels.AUS.AUS002ViewModel;
using static AMESCoreStudio.WebApi.DTO.AMES.BarCodeCheckDto;

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 IBAS _basApi;
		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, IBAS basApi
			, IStringLocalizer<SharedResource> sharedLocalizer
			, IConfiguration configuration)
		{
			_logger = logger;
			_log = log;
			_pcsApi = pcsApi;
			_ausApi = ausApi;
			_sysApi = sysApi;
			_basApi = basApi;
			_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

		#region AUS002 條碼輸入作業

		[ResponseCache(Duration = 0)]
		[HttpGet]
		public async Task<IActionResult> AUS002()
		{
			var model = new AUS002ViewModel();
			await GetAusStation();
			await GetUserName();
			return View(model);
		}

		[HttpPost]
		public async Task<IActionResult> AUS002_GetWip(AUS002ViewModel model)
		{
			await GetUserName();
			await GetAusStation();
			if (model.Input == "reset")
			{
				int Station = model.Station;
				model = new AUS002ViewModel();
				model.Station = Station;
			}
			else if (model.Station <= 0)
			{
				model.Error = "Please select station";
			}
			else
			{
				if (model.ItemNO == null)
				{
					if (model.Input == null)
					{
						model.Error = "Please scan data";
					}
					else
					{
						model.ExtraBarcodeNo = model.Input;

						#region 查詢AUS工單號碼
						string Msg = string.Empty;

						var query = await _ausApi.GetWipBarcodeOtherByExtraNo(model.ExtraBarcodeNo);
						var MoidList = query.Select(w => w.WipNO).Distinct().ToList();
						if (MoidList.Count() == 0)
						{
							Msg += "Unable to find the corresponding work order.";

						}
						else
						{
							//將MoidList裡的每個工單遍歷都透過GetWipInfoByWipNO查詢工單資訊,並抓取UnitNo="A"的工單
							//如果有找到UnitNo="A"的工單有多筆資料,則回傳Multiple work orders found. 錯誤訊息
							//如果有找到UnitNo="A"的工單有一筆資料,則將該筆資料帶入model
							//如果有找到UnitNo="A"的工單沒有資料,則回傳Unable to find the corresponding work order. 錯誤訊息
							int moidnum = 0; //用來計算工單找的UnitNo=A的數量
							foreach (var item in MoidList)
							{

								var q = await _pcsApi.GetWipInfoByWipNO(item);
								q = q.Where(w => w.UnitNO == "A").ToList();
								if (q.Count() > 0)
								{
									model.ItemNO = q.Select(s => s.GetWipAtt.ItemNO).FirstOrDefault();
									model.WipNO = q.Select(s => s.WipNO).FirstOrDefault();
									model.Unit = q.Select(s => s.UnitNO).FirstOrDefault();
									model.Line = q.Select(s => s.LineID).FirstOrDefault() ?? 0;
									model.WipID = q.Select(s => s.WipID).FirstOrDefault();
									model.Input = "";
									moidnum += 1;
								}
							}
							if (moidnum > 1)
							{
								Msg += "Multiple work orders found.";

							}
							else if (moidnum == 0)
							{
								Msg += "Unable to find the corresponding work order.";

							}
							else
							{
								#region 用出貨序號查詢原始生產序號,並取出該序號已刷過的BarcodeItem
								var AUSInfo = await _pcsApi.GetBarcodeInfoesByExtraNo(model.ExtraBarcodeNo);
								
								if (AUSInfo.Count == 0)
								{
									Msg += "Unable to find original production serial number.";
								}
								else
								{
									model.AUSBarCodeID = AUSInfo.Select(s => s.BarcodeID).FirstOrDefault();
									model.AUSBarcodeNo = AUSInfo.Select(s => s.BarcodeNo).FirstOrDefault();
								}

								#endregion


							


								#region 組裝站帶出應刷KP 用BarcodeID 查詢已刷過的BarcodeItem
								if (model.Station == 30027 && model.AUSBarCodeID != 0)
								{
									var BarcodeItem = await _pcsApi.GetBarcodeItemByBarCodeID(model.AUSBarCodeID);
									BarcodeItem = BarcodeItem.Where(w => w.WipID != model.WipID && w.ItemNo.ToLower().StartsWith("module_")).ToList();
									//將BarcodeItem 裡的值塞入model.inputs
									model.Inputs = new List<Inputs002>();
									foreach (var item in BarcodeItem)
									{
										model.Inputs.Add(new Inputs002
										{
											ModuleName = item.ItemNo,
											MappingSN = item.PartNo,
											Completed = "No",
											KPItemName = item.KpItemNo,
										});
									}
									//model.Inputs.Add(new Inputs002
									//{
									//	ModuleName = "Module_AUS002",
									//	MappingSN = "123456",
									//	Completed = "No"
									//});

									//model.Inputs.Add(new Inputs002
									//{
									//	ModuleName = "Module_AUS003",
									//	MappingSN = "78901",
									//	Completed = "No"
									//});
								}
								#endregion


								if (model.PriorInput != model.ExtraBarcodeNo)
								{
									model.PriorInput = model.ExtraBarcodeNo;
									model.InputQTY += 1;
								}
							}
						}

						if (!string.IsNullOrWhiteSpace(Msg))
						{
							model.ExtraBarcodeNo = "";
							model.Input = "";
							model.Error = Msg;
							model.ExtraBarcodeNo = "";
							model.ItemNO = "";
							model.WipNO = "";
							model.Unit = "";
							model.Line = 0;
							model.WipID = 0;
							model.Input = "";
							ModelState.AddModelError("error", Msg);
							return View("AUS002", model);
						}
						#endregion
					}
				}
				else
				{
					//開始刷入KP
					//判斷model.inputs 是否有值
					//若有值,則判斷刷入的model.input是否有與model.inputs.MappingSN 相同的值
					//若有,則該筆資料model.inputs.Completed 填入Yes
					//若無,則不做任何動作
					if (model.Station == 30027)
					{
						bool isExist = false;
						foreach (var items in model.Inputs)
						{
							if (items.MappingSN == model.Input)
							{
								isExist = true;
								items.Completed = "Yes";
							}
						}
						model.Input = "";
						if (!isExist)
						{
							model.Error = "The input SN is not in the list.";
							ModelState.AddModelError("error", model.Error);
						}
					}

				}
			}
			return View("AUS002", model);
		}
		[HttpPost]
		public async Task<IActionResult> AUS002_Input(AUS002ViewModel model)
		{
			await GetUserName();
			await GetAusStation();
			//先以序號查詢出貨區間,再以區間查詢AUS工單號
			// ResultModel
			string Msg = string.Empty;
			bool Success = true;
			string Data = model.ExtraBarcodeNo;
			// model.ExtraBarcodeNo = model.WipNO;
			#region 基本Input 輸入判斷
			//檢查是否有輸入ExtraBarcodeNo

			if (string.IsNullOrWhiteSpace(model.ExtraBarcodeNo))
			{
				Msg += "Please scan data";
			}

			//判斷model.inputs裡的每一筆資料是否都有Completed = Yes

			foreach (var items in model.Inputs)
			{
				if (items.Completed == "No")
				{
					Msg += "Please complete all the Mapping SN";
					break;
				}
			}

			//檢查model.station 是否有值
			if (model.Station <= 0)
			{
				Msg += "Please select station";
			}

			if (!string.IsNullOrWhiteSpace(Msg))
			{
				Success = false;
			//	ModelState.AddModelError("error", Msg);
				return Json(new Result() { success = Success, msg = Msg, data = Data });
			}
			#endregion
			//將modee.ErrorCode 裡的值塞入keyPart
			List<BarCodeCheckDto.inputItem> keyParts = new List<BarCodeCheckDto.inputItem>();

			if (! string.IsNullOrEmpty(model.ErrorCode))
			{
				keyParts.Add(new BarCodeCheckDto.inputItem
				{
					inputType = "NG",
					inputData = model.ErrorCode,
					oldInputData = "",
					kpItemNo = ""
				});
			}

			var x = new BarCodeCheckDto
			{
				wipNo = model.WipNO,
				barcode = model.AUSBarcodeNo,
				barcodeType = "M",
				stationID = model.Station,
				line = model.Line,
				unitNo = model.Unit,
				inputItems = keyParts,
				userID = GetLogInUserID()
			};

			var barcode_result = await _pcsApi.PassIngByCheck(JsonConvert.SerializeObject(x));
			if (!barcode_result.Success)
			{
				Msg += model.ExtraBarcodeNo + "-" + barcode_result.Msg + "\n";
				Success = false;
			//	ModelState.AddModelError("error", Msg);
			}
			// 過站判斷成功
			else
			{
				Msg = barcode_result.Msg;
				Data = string.Empty;
				//寫入BarcodeItemChange
					foreach (var item in model.Inputs)
					{
						var barcodeItemChange = new BarcodeItemChange();

						barcodeItemChange.BarcodeID = model.AUSBarCodeID;// q1.Select(s => s.BarcodeID).FirstOrDefault();
						barcodeItemChange.PartNoOld = item.MappingSN; //序號
						barcodeItemChange.ChangeType = "NR";
						barcodeItemChange.ItemNo = item.ModuleName;  //類型
						barcodeItemChange.StationID = model.Station;
						barcodeItemChange.WipID = model.WipID;
						barcodeItemChange.KpItemNo = item.KPItemName; //料號
						barcodeItemChange.CreateUserID = GetLogInUserID();


						var result2= await _pcsApi.PostBarcodeItemChange(JsonConvert.SerializeObject(barcodeItemChange));

					}

				
			}




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


		/// <summary>
		/// 流程ID By站別
		/// </summary>
		/// <returns>StationID</returns>
		private async Task<List<RuleStation>> GetRuleStationByFlowRuleID(int flowruleID)
		{
			var result = await _basApi.GetRuleStationsByFlow(flowruleID, 0);
			result = result.Where(w => w.StationType == "M").OrderBy(o => o.Sequence).ToList();
			var RuleStations = new List<SelectListItem>();
			for (int i = 0; i < result.Count; i++)
			{
				RuleStations.Add(new SelectListItem(result[i].Sequence + "-" + result[i].Station.StationName, result[i].StationID.ToString()));
			}

			if (RuleStations.Count == 0)
			{
				RuleStations.Add(new SelectListItem("N/A", null));
			}

			ViewBag.GetRuleStationByFlowRuleIDList = RuleStations;
			return result;
		}
		#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 + ")";
		}

		public async Task GetAusStation()
		{

			var result = await _basApi.GetStationses();
			// 排除鎖定站
			result = result.Where(w => w.StationID != 0 && w.UnitNo == "A" && w.StatusNo =="A" ).ToList();
			result = result.Where(w => w.StationID == 30027 || w.StationID == 30030).ToList();
			var StationItems = new List<SelectListItem>();
			for (int i = 0; i < result.Count; i++)
			{
				StationItems.Add(new SelectListItem(result[i].StationName, result[i].StationID.ToString()));
			}
			ViewBag.StationList = StationItems;
		}



	}



}