using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using AMESCoreStudio.WebApi;
using AMESCoreStudio.WebApi.Models.AMES;
using AMESCoreStudio.CommonTools.Result;

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 檢驗结果維護資料檔
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class WipBoxController : ControllerBase
    {
        private readonly AMESContext _context;

        public WipBoxController(AMESContext context)
        {
            _context = context;
        }

        // GET: api/WipBox
        [HttpGet]
        public async Task<ActionResult<IEnumerable<WipBox>>> GetWipBoxes()
        {
            return await _context.WipBoxs.ToListAsync();
        }

        // GET: api/WipBox/5
        [HttpGet("{id}")]
        public async Task<ActionResult<WipBox>> GetWipBox(string id)
        {
            var wipBox = await _context.WipBoxs.FindAsync(id);

            //if (wipBox == null)
            //{
            //    return NotFound();
            //}

            return wipBox;
        }

        /// <summary>
        /// ByWipID
        /// </summary>
        /// <param name="id">WipID</param>
        /// <returns></returns>
        [HttpGet("ByWipID/{id}")]
        public async Task<ActionResult<IEnumerable<WipBox>>> GetWipBoxByWipID(int id)
        {
            return await _context.WipBoxs.Where(w => w.WipID == id).ToListAsync();
        }

        /// <summary>
        /// 更新工單箱號資料檔
        /// </summary>
        /// <param name="wipBox"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<WipBox>> PutWipBox(WipBox wipBox)
        {
            ResultModel<WipBox> result = new ResultModel<WipBox>();
            _context.WipBoxs.Attach(wipBox);
            wipBox.UpdateDate = DateTime.Now;
            // 指定更新某個欄位
            _context.Entry(wipBox).Property(p => p.BoxCnt).IsModified = true;
            _context.Entry(wipBox).Property(p => p.BoxStatus).IsModified = true;
            _context.Entry(wipBox).Property(p => p.WeightG).IsModified = true;
            _context.Entry(wipBox).Property(p => p.UpdateDate).IsModified = true;
            _context.Entry(wipBox).Property(p => p.UpdateUserID).IsModified = true;
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 新增工單箱號資料檔
        /// </summary>
        /// <param name="wipBox"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<WipBox>> PostWipBox(WipBox wipBox)
        {
            ResultModel<WipBox> result = new ResultModel<WipBox>();
            try
            {
                Helper helper = new Helper(_context);
                wipBox.BoxID = helper.GetIDKey("BOX_ID").Result;
                _context.WipBoxs.Add(wipBox);
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        
        [HttpDelete("{id}")]
        public async Task<ActionResult<WipBox>> DeleteWipBox(string id)
        {
            var wipBox = await _context.WipBoxs.FindAsync(id);
            if (wipBox == null)
            {
                return NotFound();
            }

            _context.WipBoxs.Remove(wipBox);
            await _context.SaveChangesAsync();

            return wipBox;
        }

        /// <summary>
        /// 自動裝箱
        /// </summary>
        /// <param name="id">BarcodeNO</param>
        /// <returns></returns>
        [HttpPost("ByBeerAP")]
        public async Task<ActionResult<ResultModel<string>>> PostWipBox(WipBoxDto wipBoxDto )
        {
            ResultModel<string> resultModel = new ResultModel<string> { Success = false };
            #region 宣告Coltroller 
            BarcodeInfoesController barcodeInfoesController = new BarcodeInfoesController(_context);
            WipInfosController wipInfosController = new WipInfosController(_context);
            #endregion
            try
            {
                if (! string.IsNullOrEmpty(wipBoxDto.ExtraNo))
                {
                    var BarcodeInfos = await barcodeInfoesController.GetBarcodeInfoesByExtraNo(wipBoxDto.ExtraNo);
                    if (BarcodeInfos.Value.Count() == 0)
                    {
                        BarcodeInfos = await barcodeInfoesController.GetBarcodeInfoesByNo(wipBoxDto.ExtraNo);

                    }
                    if (BarcodeInfos.Value.Count() == 0)
                    {

                        resultModel.Success = false;
                        resultModel.Msg = "裝箱失敗 查無序號";
                        return resultModel;
                    }
                    if (BarcodeInfos.Value.Where(w => w.BoxNo != null).Count() > 0)
                    {

                        resultModel.Success = false;
                        resultModel.Msg = "裝箱失敗 此序號已裝箱過";
                        return resultModel;
                    }
               
                }
               
                var WipInfos = await wipInfosController.GetWipInfoByWipNo(wipBoxDto.WipNo);
                int wipID = WipInfos.Value.Where(w=>w.UnitNO == wipBoxDto.UnitNo).Select(s => s.WipID).FirstOrDefault(); //當前工單ID
                var WipNo = wipBoxDto.WipNo; //當前工單
               // var BoxCnt = WipInfos.Value.Select(s => s.BoxCNT).FirstOrDefault(); //當前工單單箱入數
                var wipBoxs = await GetWipBoxByWipID(wipID);

                //// 當前箱號
                var NowBoxNo = string.Empty;
                if (wipBoxs.Value.Where(w => w.BoxStatus != 0).Count() == 0)
                {
                    //創建新箱號
                    if (wipBoxs.Value.Count() == 0)
                        NowBoxNo = WipNo + "BOX" + "001";
                    else
                    {
                        NowBoxNo = wipBoxs.Value.OrderByDescending(o => o.BoxNo).Select(s=> s.BoxNo).FirstOrDefault();
                        string BoxNoOrder = NowBoxNo.Substring(NowBoxNo.Length - 3, 3);
                        BoxNoOrder = (int.Parse(BoxNoOrder) + 1).ToString().PadLeft(3, '0');
                        NowBoxNo = NowBoxNo.Substring(0, NowBoxNo.Length - 3) + BoxNoOrder;

                    }

                }
                    
                else
                    NowBoxNo = wipBoxs.Value.Where(w => w.BoxStatus != 0).FirstOrDefault().BoxNo;


                var query_barCode = await barcodeInfoesController.GetBarcodeInfoesByBoxNo(NowBoxNo);
                var ByBox = query_barCode.Value.Count().ToString();// 本箱已裝數量

              
                bool checkbox = false;  //是否已滿箱需裝箱
                
                if (wipBoxDto.CloseBox == "Y")
                    checkbox = true;
                // if (boxQty == BoxCnt) //當滿箱=>自動裝箱=true 改為手動
                //     checkbox = true;
                //   int boxQty = int.Parse(ByBox) + 1;
                if (!string.IsNullOrEmpty(wipBoxDto.ExtraNo))
                {
                    ByBox = (int.Parse(ByBox) + 1).ToString(); 
                }

                var query_wipBox = await GetWipBox(NowBoxNo);
                var wipBox = new WipBox
                {
                    WipID = wipID,
                    BoxNo = NowBoxNo,
                    BoxCnt = int.Parse(ByBox),
                    BoxStatus = checkbox ? 0 : 1
                };

                if (query_wipBox.Value == null)
                     await PostWipBox(wipBox);
                else
                {
                    if (ByBox == "0")
                    {
                        resultModel.Success = false;
                        resultModel.Msg = "目前當前箱號裝箱數為0,無法關箱";
                        return resultModel;
                    }
                    else
                    {
                        wipBox = query_wipBox.Value;
                        wipBox.BoxCnt = int.Parse(ByBox);//int.Parse(ByBox) + 1;
                        wipBox.BoxStatus = checkbox ? 0 : 1;
                        await PutWipBox(wipBox);
                    }
                }
                if (!string.IsNullOrEmpty(wipBoxDto.ExtraNo))
                {
                    var BarcodeInfos = await barcodeInfoesController.GetBarcodeInfoesByExtraNo(wipBoxDto.ExtraNo);
                    var BarcodeInfo = BarcodeInfos.Value.FirstOrDefault();
                    BarcodeInfo.BoxNo = NowBoxNo;
                    await barcodeInfoesController.PutBarcodeInfoes(BarcodeInfo);
                }
                //若關箱 則自動增加新箱號
                if (checkbox)
                {
                    string BoxNoOrder = NowBoxNo.Substring(NowBoxNo.Length - 3, 3);
                    BoxNoOrder = (int.Parse(BoxNoOrder) + 1).ToString().PadLeft(3, '0');
                    NowBoxNo = NowBoxNo.Substring(0, NowBoxNo.Length - 3) + BoxNoOrder;
                    var wipBox1 = new WipBox
                    {
                        WipID = wipID,
                        BoxNo = NowBoxNo,
                        BoxCnt = 0,
                        BoxStatus =1
                    };
                    
                    //wipBox.BoxNo = NowBoxNo;
                    //wipBox.BoxStatus = 1;
                    //wipBox.BoxCnt = 0;
                    await PostWipBox(wipBox1);
                }
              
                resultModel.Success = true;
                resultModel.Msg = "裝箱完成";
                return resultModel;

            }

            catch (Exception ex)
            {
                resultModel.Success = false;
                resultModel.Msg = ex.InnerException.Message;
                return resultModel;
            }
        }

        private bool WipBoxExists(string id)
        {
            return _context.WipBoxs.Any(e => e.BoxNo == id);
        }
    }
}