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;
using AMESCoreStudio.WebApi.DTO.AMES;

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 檢驗單明細資料檔
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class FqcInhouseDetailController : ControllerBase
    {
        private readonly AMESContext _context;

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

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

        /// <summary>
        /// By 入庫單號 序號
        /// </summary>
        /// <param name="inhouseNo">入庫單號</param>
        /// <param name="seq">序號</param>
        /// <returns></returns>
        [HttpGet("{inhouseNo}/{seq}")]
        public async Task<ActionResult<IEnumerable<FqcInhouseDetail>>> GetFqcInhouseDetail(string inhouseNo, int seq)
        {
            var fqcInhouseDetail = await _context.FqcInhouseDetails
                                    .Where(w => w.InhouseNo == inhouseNo && w.SeqID == seq)
                                    .ToListAsync();

            return fqcInhouseDetail;
        }

        /// <summary>
        /// Query By 箱號
        /// </summary>
        /// <param name="id">箱號</param>
        /// <returns></returns>
        [HttpGet("BySerialNo/{id}")]
        public async Task<ActionResult<IEnumerable<FqcInhouseDetail>>> GetFqcInhouseDetailBySerialNo(string id)
        {
            var fqcInhouseDetail = await _context.FqcInhouseDetails.Where(w => w.SerialNo == id).ToListAsync();
            return fqcInhouseDetail;
        }

        /// <summary>
        /// FQC細項資料
        /// </summary>
        /// <returns></returns>
        [HttpGet("FqcInhouseDetailByFQC007V")]
        public async Task<ResultModel<FqcResultDto>> GetFqcInhouseDetailByFQC007V(string inhouseNo, int seqID, string boxNo)
        {
            ResultModel<FqcResultDto> result = new ResultModel<FqcResultDto>();
            var fqcResultDto = new List<FqcResultDto>();
            var FqcInhouseDetails = await _context.FqcInhouseDetails.Where(w => w.SerialNo == boxNo && w.InhouseNo == inhouseNo
                                                                 && w.SeqID == seqID).FirstOrDefaultAsync();

            // 取FQC_ID
            if (FqcInhouseDetails != null)
            {
                var BarcodeInfo = new List<BarcodeInfo>();
                if (FqcInhouseDetails.SerialType == "B")
                    BarcodeInfo = await _context.BarcodeInfoes.Where(w => w.BoxNo == FqcInhouseDetails.SerialNo).ToListAsync();
                else
                    BarcodeInfo = await _context.BarcodeInfoes.Where(w => w.BarcodeNo == FqcInhouseDetails.SerialNo).ToListAsync();

                // 先塞入資料
                foreach (var item in BarcodeInfo)
                {
                    fqcResultDto.Add(new FqcResultDto
                    {
                        BarcodeNo = item.BarcodeNo,
                        ExtraBarcodeNo = item.ExtraBarcodeNo,
                        BoxNo = item.BoxNo,
                        StatusNo = ""
                    });
                }

                var FqcResultMaster = await _context.FqcResultMasters.Where(w => w.InhouseNo == FqcInhouseDetails.InhouseNo
                                                                            && w.SeqID == FqcInhouseDetails.SeqID)
                                                                            .FirstOrDefaultAsync();
                // 取抽驗結果
                if (FqcResultMaster != null)
                {
                    var FqcResultDetail = await _context.FqcResultDetails.Where(w => w.FqcID == FqcResultMaster.FqcID).ToListAsync();
                    var NgReasons = await _context.NGReasons.ToListAsync();
                    foreach (var item in FqcResultDetail)
                    {
                        foreach (var item2 in fqcResultDto)
                        {
                            if (item.BarcodeNo == item2.BarcodeNo)
                            {
                                item2.StatusNo = item.StatusNo;
                                item2.NgReasonNo = item.NgReasonNo;
                                item2.NgReasonDesc = NgReasons.Where(w => w.NGReasonNo == item.NgReasonNo).FirstOrDefault() == null ? "" : NgReasons.Where(w => w.NGReasonNo == item.NgReasonNo).FirstOrDefault().NGReasonDesc;
                                item2.NgMemo = item.NgMemo;
                                item2.CreateName = await new Helper(_context).GetUserName(item.CreateUserID);
                                continue;
                            }
                        }
                    }
                }
            }

            result.Data = fqcResultDto.ToList();

            if (result == null)
            {
                result.Msg = "查無資料";
                result.Success = false;
                return result;
            }

            result.Success = true;
            result.Msg = "OK";
            return result;
        }

        /// <summary>
        /// FQC細項資料(全部)
        /// </summary>
        /// <returns></returns>
        [HttpGet("FqcInhouseDetailByFQC007All")]
        public async Task<ResultModel<FqcResultDto>> GetFqcInhouseDetailByFQC007All(string inhouseNo, int seqID)
        {
            ResultModel<FqcResultDto> result = new ResultModel<FqcResultDto>();
            var fqcResultDto = new List<FqcResultDto>();
            var FqcInhouseDetails = await _context.FqcInhouseDetails.Where(w => w.InhouseNo == inhouseNo
                                                                 && w.SeqID == seqID).ToListAsync();

            // 取FQC_ID
            if (FqcInhouseDetails.Count != 0)
            {
                foreach (var item in FqcInhouseDetails)
                {
                    var BarcodeInfo = new List<BarcodeInfo>();
                    if (item.SerialType == "B")
                        BarcodeInfo = await _context.BarcodeInfoes.Where(w => w.BoxNo == item.SerialNo).ToListAsync();
                    else
                        BarcodeInfo = await _context.BarcodeInfoes.Where(w => w.BarcodeNo == item.SerialNo).ToListAsync();

                    // 先塞入資料
                    foreach (var item1 in BarcodeInfo)
                    {
                        fqcResultDto.Add(new FqcResultDto
                        {
                            BarcodeNo = item1.BarcodeNo,
                            ExtraBarcodeNo = item1.ExtraBarcodeNo,
                            BoxNo = item1.BoxNo,
                            StatusNo = ""
                        });
                    }

                    var FqcResultMaster = await _context.FqcResultMasters.Where(w => w.InhouseNo == item.InhouseNo
                                                                                && w.SeqID == item.SeqID)
                                                                                .FirstOrDefaultAsync();

                    var NgReasons = await _context.NGReasons.ToListAsync();

                    // 取抽驗結果
                    if (FqcResultMaster != null)
                    {
                        var FqcResultDetail = await _context.FqcResultDetails.Where(w => w.FqcID == FqcResultMaster.FqcID).ToListAsync();
                        foreach (var item1 in FqcResultDetail)
                        {
                            foreach (var item2 in fqcResultDto)
                            {
                                if (item1.BarcodeNo == item2.BarcodeNo)
                                {
                                    item2.StatusNo = item1.StatusNo == "P" ? "PASS" : "NG";
                                    item2.NgReasonNo = item1.NgReasonNo;
                                    item2.NgReasonDesc = NgReasons.Where(w => w.NGReasonNo == item1.NgReasonNo).FirstOrDefault() == null ? "" : NgReasons.Where(w => w.NGReasonNo == item1.NgReasonNo).FirstOrDefault().NGReasonDesc;
                                    item2.NgMemo = item1.NgMemo;
                                    item2.IsSample = "Y";
                                    item2.CreateName = await new Helper(_context).GetUserName(item.CreateUserID);
                                    continue;
                                }
                            }
                        }
                    }
                }
            }

            result.Data = fqcResultDto.ToList();

            if (result == null)
            {
                result.Msg = "查無資料";
                result.Success = false;
                return result;
            }

            result.Success = true;
            result.Msg = "OK";
            return result;
        }

        /// <summary>
        /// 新增檢驗單明細資料檔
        /// </summary>
        /// <param name="fqcInhouseDetail"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<FqcInhouseDetail>> PutFqcInhouseDetail(FqcInhouseDetail fqcInhouseDetail)
        {
            ResultModel<FqcInhouseDetail> result = new ResultModel<FqcInhouseDetail>();
            _context.Entry(fqcInhouseDetail).State = EntityState.Modified;
            //設置容器空間某一個模型的某一個欄位 不提交到資料庫
            _context.Entry<FqcInhouseDetail>(fqcInhouseDetail).Property("CreateDate").IsModified = false;
            _context.Entry<FqcInhouseDetail>(fqcInhouseDetail).Property("CreateUserID").IsModified = false;
            fqcInhouseDetail.UpdateDate = DateTime.Now;
            fqcInhouseDetail.UpdateUserID = 0;

            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="fqcInhouseDetail"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<FqcInhouseDetail>> PostFqcInhouseDetail(FqcInhouseDetail fqcInhouseDetail)
        {
            ResultModel<FqcInhouseDetail> result = new ResultModel<FqcInhouseDetail>();
            try
            {
                _context.FqcInhouseDetails.Add(fqcInhouseDetail);
                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="no">入庫單號</param>
        /// <param name="seq">順序</param>
        /// <returns></returns>
        [HttpDelete("{no}/{seq}")]
        public async Task<ActionResult<FqcInhouseDetail>> DeleteFqcInhouseDetail(string no, int seq)
        {
            ResultModel<FqcInhouseDetail> result = new ResultModel<FqcInhouseDetail>();

            var fqcInhouseDetail = await _context.FqcInhouseDetails.Where(p => p.InhouseNo == no && p.SeqID == seq).FirstOrDefaultAsync();
            if (fqcInhouseDetail == null)
            {

                return fqcInhouseDetail;
            }

            _context.FqcInhouseDetails.Remove(fqcInhouseDetail);
            await _context.SaveChangesAsync();

            return fqcInhouseDetail;
        }

        private bool FqcInhouseDetailExists(string id)
        {
            return _context.FqcInhouseDetails.Any(e => e.InhouseNo == id);
        }
    }
}