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

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 抽驗標準資料檔
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class QcCriterionController : ControllerBase
    {
        private readonly AMESContext _context;

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

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

        // GET: api/QcCriterion/5
        [HttpGet("{id}")]
        public async Task<ActionResult<QcCriterion>> GetQcCriterion(int id)
        {
            var qcCriterion = await _context.QcCriteria.FindAsync(id);

            if (qcCriterion == null)
            {
                return NotFound();
            }

            return qcCriterion;
        }

        /// <summary>
        /// ByQuotID
        /// </summary>
        /// <param name="id">QuotID</param>
        /// <returns></returns>
        [HttpGet("ByQuotID/{id}")]
        public async Task<ActionResult<IEnumerable<QcCriterion>>> GetQcCriterionByQuotID(int id)
        {
            var qcCriterion = await _context.QcCriteria.Where(w => w.QuotID == id).ToListAsync();
            return qcCriterion;
        }

        /// <summary>
        /// 根據抽驗係數與數量 回傳CritID
        /// </summary>
        /// <param name="id">QuotID</param>
        /// <param name="Qty">抽驗數量</param>
        /// <returns></returns>
        [HttpGet("GetCritID/{id}/{Qty}")]
        public async Task<ActionResult<int>> GetQcCriterion_CritID(int id, int Qty)
        {
            var qcCriterion = await _context.QcCriteria.Where(w => w.QuotID == id).ToListAsync();

            qcCriterion = qcCriterion.Where(w => w.QcStart <= Qty && Qty <= w.QcEnd).ToList();

            if (qcCriterion.FirstOrDefault() != null)
                return qcCriterion.FirstOrDefault().CritID;

            return 0;
        }

        /// <summary>
        /// 查詢抽驗標準維護
        /// </summary>
        /// <param name="quotID">抽驗係數ID</param>
        /// <param name="AQLType">AQL類型</param>
        /// <param name="QCQty">批量</param>
        /// <param name="page">頁數</param>
        /// <param name="limit"></param>
        /// <returns></returns>
        [HttpGet("QcCriterionQuery")]
        public async Task<ResultModel<QcCriterionDto>> GetQcCriterionQuery(int quotID = 0, string AQLType = "", int QCQty = 0, int page = 0, int limit = 10)
        {
            ResultModel<QcCriterionDto> result = new ResultModel<QcCriterionDto>();

            IQueryable<QcCriterionDto> q = from q1 in _context.QcQuots
                                           join q2 in _context.QcCriteria on q1.QuotID equals q2.QuotID
                                           select new QcCriterionDto
                                           {
                                               QuotID = q1.QuotID,
                                               QuotDescription = q1.QuotDescription,
                                               AqlType = q1.AqlType,
                                               Aql = q1.Aql,
                                               CritID = q2.CritID,
                                               CritNo = q2.CritNo,
                                               AcQty = q2.AcQty,
                                               ReQty = q2.ReQty,
                                               QcQty = q2.QcQty,
                                               QcStart = q2.QcStart,
                                               QcEnd = q2.QcEnd,
                                               IntervalNumber = q2.QcStart + " ~ " + q2.QcEnd,
                                               QuotName = q2.GetQcQuot.QuotName,
                                               CreateDate = q2.CreateDate,
                                               UpdateUserID = q2.UpdateUserID,
                                               UpdateDate = q2.UpdateDate
                                           };


            if (quotID != 0)
                q = q.Where(w => w.QuotID == quotID);

            if (!string.IsNullOrWhiteSpace(AQLType))
                q = q.Where(w => w.AqlType == AQLType);

            if (QCQty != 0)
                q = q.Where(w => w.QcStart <= QCQty && w.QcEnd >= QCQty);

            // 紀錄筆數
            result.DataTotal = q.Count();

            // Table 頁數
            if (page > 0)
            {
                q = q.Skip((page - 1) * limit).Take(limit);
            }

            result.Data = await q.ToListAsync();
            result.Data.Select(s => s.AqlType =
            EnumFQC.GetDisplayName((EnumFQC.EnumAQL_Type)System.Enum.Parse(typeof(EnumFQC.EnumAQL_Type), s.AqlType)))
            .ToList();
            return result;
        }

        /// <summary>
        /// 更新抽驗標準
        /// </summary>
        /// <param name="qcCriterion"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<QcCriterion>> PutQcCriterion(QcCriterion qcCriterion)
        {
            ResultModel<QcCriterion> result = new ResultModel<QcCriterion>();
            _context.Entry(qcCriterion).State = EntityState.Modified;
            qcCriterion.UpdateDate = DateTime.Now;
            qcCriterion.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="qcCriterion"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<QcCriterion>> PostQcCriterion(QcCriterion qcCriterion)
        {
            ResultModel<QcCriterion> result = new ResultModel<QcCriterion>();
            Helper helper = new Helper(_context);
            qcCriterion.CritID = helper.GetIDKey("CRIT_ID").Result;
            _context.QcCriteria.Add(qcCriterion);
            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="id">CRIT_ID</param>
        /// <returns></returns>
        [HttpDelete("{id}")]
        public async Task<ResultModel<string>> DeleteQcCriterion(int id)
        {
            ResultModel<string> result = new ResultModel<string>();
            var qcCriterion = await _context.QcCriteria.FindAsync(id);

            try
            {
                if (qcCriterion == null)
                {
                    result.Success = false;
                    result.Msg = "找不到要刪除資料";
                }
                else
                {
                    _context.QcCriteria.Remove(qcCriterion);
                    await _context.SaveChangesAsync();
                    result.Success = true;
                    result.Msg = "OK";
                }
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        private bool QcCriterionExists(int id)
        {
            return _context.QcCriteria.Any(e => e.CritID == id);
        }
    }
}