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
            {
                var wipInfos = await wipInfosController.GetWipInfoByWipNo(wipBoxDto.WipNo);

                wipInfos = wipInfos.Value.Where(w => w.UnitNO == wipBoxDto.UnitNo).ToList();
                if (wipInfos.Value.Count() > 0)
                {
                    int wipID = wipInfos.Value.Where(w => w.UnitNO == wipBoxDto.UnitNo).Select(s => s.WipID).FirstOrDefault(); //當前工單ID
                    var WipNo = wipBoxDto.WipNo; //當前工單
                    if (!string.IsNullOrEmpty(wipBoxDto.ExtraNo))
                    {
                        var BarcodeInfos = await barcodeInfoesController.GetBarcodeInfoesByExtraNo(wipBoxDto.ExtraNo);
                        BarcodeInfos = BarcodeInfos.Value.Where(w => w.WipID == wipID).ToList();
                        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)
                        {
                            //查詢該工單若有跟Barcodeinfo 相同的箱號,則為序號已裝箱過(為避免不同制程都有裝箱誤判為已裝箱過)
                            var WipBOX = await  GetWipBoxByWipID(wipID);
                            WipBOX = WipBOX.Value.Where(w => w.BoxNo == BarcodeInfos.Value.Select(s => s.BoxNo).FirstOrDefault()).ToList();
                            if (WipBOX.Value.Count() > 0)
                            {
                                resultModel.Success = false;
                                resultModel.Msg = "裝箱失敗 此序號已裝箱過";
                                return resultModel;
                            }
                        }

                    }

                     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 + wipBoxDto.UnitNo + "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;

                }
                else
                {
                    resultModel.Success = false;
                    resultModel.Msg = "制程單位:"+ wipBoxDto.UnitNo + " 查無此工單";
                    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);
        }
    }
}