using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Microsoft.Extensions.Logging;
using AMESCoreStudio.Web.Models;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using AMESCoreStudio.WebApi;
using System.Collections.Generic;
using Microsoft.AspNetCore.Mvc.Rendering;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.WebApi.Models.BAS;
using AMESCoreStudio.Web.ViewModels;
using AMESCoreStudio.Web.ViewModels.PCS;
using AMESCoreStudio.WebApi.DTO.AMES;
using System.Linq;
using AMESCoreStudio.CommonTools.Result;
using System;
using System.IO;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Hosting;
using System.ComponentModel.DataAnnotations;
using AspNetCore.Reporting;
using System.Text.Encodings;
using AMESCoreStudio.WebApi.Enum;

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

        //#region 下拉選單
        /// <summary>
        /// SOP_Type
        /// </summary>
        /// <param name="SelectedValue"></param>
        private void GetSteelPlateStatusSelect(string SelectedValue = null)
        {
            List<string> values = new List<string>();
            if (SelectedValue != null)
            {
                values = SelectedValue.Split(',').ToList();
            }
            var q = Enum.GetValues(typeof(EnumPCB.EnumSteelPlateStatus)).Cast<EnumPCB.EnumSteelPlateStatus>()
                       .Select(s => new SelectListItem
                       {
                           Text = EnumPCB.GetDisplayName(s).ToString(),
                           Value = s.ToString()
                       }).ToList();

            ViewBag.GetSteelPlateStatusSelect = q;
        }
        //#endregion

        #region PCB013 鋼板量測紀錄
        public ActionResult PCB013()
        {
            return View();
        }

        public async Task<IActionResult> PCB013QueryAsync(string steelPlateNo, string pcbPartNo
                     , string side, string status, int page = 0, int limit = 10)
        {
            IResultModel<SteelPlateInfoDto> result = await _pcbApi.GetSteelPlateInfoQuery(steelPlateNo: steelPlateNo, pcbPartNo: pcbPartNo
            , side: side, status: status, page: page, limit: limit);

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

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

        //修改页面
        [HttpGet]
        public async Task<IActionResult> PCB013U(int id)
        {
            var result = await _pcbApi.GetSteelPlateInfo(id);
            return View(result);
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> PCB013Async(SteelPlateInfo model)
        {
            if (ModelState.IsValid)
            {
                IResultModel result;
                if (model.SteelPlateID == 0)
                {
                    model.CreateUserID = GetLogInUserID();
                    model.CreateDate = DateTime.Now;
                    model.UpdateUserID = GetLogInUserID();
                    model.UpdateDate = DateTime.Now;
                    result = await _pcbApi.PostSteelPlateInfo(JsonConvert.SerializeObject(model));
                }
                else
                {
                    model.UpdateUserID = GetLogInUserID();
                    model.UpdateDate = DateTime.Now;
                    result = await _pcbApi.PutSteelPlateInfo(JsonConvert.SerializeObject(model));
                }

                if (result.Success)
                {
                    var _msg = model.SteelPlateID == 0 ? "新增成功!" : "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {

                    ModelState.AddModelError("error", result.Msg);
                }
            }

            if (model.SteelPlateID == 0)
            {
                return View("PCB013C", model);
            }
            return View("PCB013U", model);
        }


        public IActionResult PCB013A(int steelPlateID, string steelPlateNo)
        {
            GetSteelPlateStatusSelect();
            ViewBag.steelPlateID = steelPlateID;
            ViewBag.steelPlateNo = steelPlateNo;
            return View();
        }

        /// <summary>
        /// 鋼板量測記錄
        /// </summary>
        /// <param name="model"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<IActionResult> PCB013ASave(SteelPlateMeasure model)
        {

            IResultModel result;
            // 量測基準 35 小於通知寄信
            if (double.Parse(model.Tension1) < 35 || double.Parse(model.Tension2) < 35 || double.Parse(model.Tension3) < 35 ||
                double.Parse(model.Tension4) < 35 || double.Parse(model.Tension5) < 35)
            {
                model.MeasureResult = "F";
                //string Subject = $"FQC自動派送發信 FQC單號:{inhouseNo} 料號:{Material}";
                //string Body = $@"FQC單號:{inhouseNo} 料號:{Material} <br/>
                //                 檢驗結果為:{Result}";

                //await _bllApi.PostToMail(Subject, Body, string.Join(',', MailGroup), "", false, path);
            }
            else
            {
                model.MeasureResult = "P";
            }    
            model.CreateUserID = GetLogInUserID();
            model.CreateDate = DateTime.Now;
            model.UpdateUserID = GetLogInUserID();
            model.UpdateDate = DateTime.Now;
            result = await _pcbApi.PostSteelPlateMeasure(JsonConvert.SerializeObject(model));


            if (result.Success)
            {
                var _msg = "新增量測記錄成功!";
                return RedirectToAction("Refresh", "Home", new { msg = _msg });
            }
            else
            {

                ModelState.AddModelError("error", result.Msg);
            }


            if (model.SteelPlateID == 0)
            {
                return View("PCB013A", model);
            }
            return View("PCB013A", model);
        }

        /// <summary>
        /// 鋼板量測紀錄 View
        /// </summary>
        /// <param name="steelPlateID"></param>
        /// <param name="steelPlateNo"></param>
        /// <returns></returns>
        [HttpGet]
        public IActionResult PCB013V(int steelPlateID, string steelPlateNo)
        {
            ViewBag.steelPlateID = steelPlateID;
            ViewBag.steelPlateNo = steelPlateNo;
            return View();
        }

        [HttpGet]
        public async Task<IActionResult> PCB013VQuery(int steelPlateID, string steelPlateNo, int page = 0, int limit = 10)
        {
            var result = await _pcbApi.GetSteelPlateMeasureBySteelPlateID(steelPlateID, page, limit);

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

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

        #region PCB014 錫膏使用管控
        public ActionResult PCB014()
        {
            return View();
        }

        public async Task<IActionResult> PCB014QueryAsync(string solderPasteNo, string status, int page = 0, int limit = 10)
        {
            IResultModel<SolderPasteInfoDto> result = await _pcbApi.GetSolderPasteInfoQuery(solderPasteNo: solderPasteNo, status: status, page: page, limit: limit);

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

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

        //修改页面
        [HttpGet]
        public async Task<IActionResult> PCB014U(int id)
        {
            var result = await _pcbApi.GetSolderPasteInfo(id);
            return View(result);
        }

        //頁面提交,id=0 添加,id>0 修改
        [HttpPost]
        public async Task<IActionResult> PCB014Async(SolderPasteInfo model)
        {
            // 日期判斷
            if (model.EffectiveDate < model.ManufactoringDate)
            {
                ModelState.AddModelError("error", "有效日期不能小於製造日期");
            }
            else if (ModelState.IsValid)
            {
                IResultModel result;

                if (model.SolderPasteID == 0)
                {
                    model.CreateUserID = GetLogInUserID();
                    model.CreateDate = DateTime.Now;
                    model.UpdateUserID = GetLogInUserID();
                    model.UpdateDate = DateTime.Now;
                    result = await _pcbApi.PostSolderPasteInfo(JsonConvert.SerializeObject(model));
                }
                else
                {
                    model.UpdateUserID = GetLogInUserID();
                    model.UpdateDate = DateTime.Now;
                    result = await _pcbApi.PutSolderPasteInfo(JsonConvert.SerializeObject(model));
                }

                if (result.Success)
                {
                    var _msg = model.SolderPasteID == 0 ? "新增成功!" : "修改成功!";
                    return RedirectToAction("Refresh", "Home", new { msg = _msg });
                }
                else
                {
                    ModelState.AddModelError("error", result.Msg);
                }
            }


            if (model.SolderPasteID == 0)
            {
                return View("PCB014C", model);
            }
            return View("PCB014U", model);
        }
        #endregion

        /// <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;
        }
    }
}