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>
    /// Qc Rate
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class QcRateController : ControllerBase
    {
        private readonly AMESContext _context;

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

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

        /// <summary>
        /// 查詢 QcRate
        /// </summary>
        /// <param name="year">西元</param>
        /// <param name="month">月份</param>
        /// <param name="qcRateType">類別</param>
        /// <param name="productType">產品別</param>
        /// <param name="page">頁數</param>
        /// <param name="limit">筆數</param>
        /// <returns></returns>
        [HttpGet("QcRatesQuery")]
        public async Task<ResultModel<QcRate>> GetQcRatesQuery(string year, string month, string qcRateType, string productType, int page = 0, int limit = 10)
        {
            ResultModel<QcRate> result = new ResultModel<QcRate>();

            var resultQuery = await _context.QcRates.ToListAsync();

            if (!string.IsNullOrWhiteSpace(year) && year != "0")
                resultQuery = resultQuery.Where(w => w.Yrer == year).ToList();

            if (!string.IsNullOrWhiteSpace(month) && month != "0")
                resultQuery = resultQuery.Where(w => w.Month == month).ToList();

            if (!string.IsNullOrWhiteSpace(qcRateType) && qcRateType != "0")
                resultQuery = resultQuery.Where(w => w.QcRateType == qcRateType).ToList();

            if (!string.IsNullOrWhiteSpace(productType) && productType != "0")
                resultQuery = resultQuery.Where(w => w.ProductType == productType).ToList();

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

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

            result.Data = resultQuery.OrderBy(o => o.Yrer).ThenBy(o => o.Month).ToList();
            return result;
        }

        /// <summary>
        /// 更新 Qc Rate
        /// </summary>
        /// <param name="qcRate"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<QcRate>> PutQcRate(QcRate qcRate)
        {
            ResultModel<QcRate> result = new ResultModel<QcRate>();
            _context.Entry(qcRate).State = EntityState.Modified;
            _context.Entry<QcRate>(qcRate).Property("CreateDate").IsModified = false;
            _context.Entry<QcRate>(qcRate).Property("CreateUserID").IsModified = false;
            qcRate.UpdateDate = DateTime.Now;
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 新增 Qc Rate
        /// </summary>
        /// <param name="qcRate"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<QcRate>> PostQcRate(QcRate qcRate)
        {
            ResultModel<QcRate> result = new ResultModel<QcRate>();
            _context.QcRates.Add(qcRate);
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 刪除 Qc Rate
        /// </summary>
        /// <param name="qcRate"></param>
        /// <returns></returns>
        [HttpDelete]
        public async Task<ResultModel<string>> DeleteQcRate(QcRate qcRate)
        {
            ResultModel<string> result = new ResultModel<string>();
            var qcRateItem = await _context.QcRates.Where(w => w.Yrer == qcRate.Yrer &&
                                                               w.Month == qcRate.Month &&
                                                               w.QcRateType == qcRate.QcRateType &&
                                                               w.ProductType == qcRate.ProductType)
                                                   .FirstOrDefaultAsync();

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