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;

namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 工單KP資訊資料檔
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class WipKpsController : ControllerBase
    {
        private readonly AMESContext _context;

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

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

        // GET: api/WipKps/5
        [HttpGet("{id}")]
        public async Task<ActionResult<WipKp>> GetWipKp(int id)
        {
            var wipKp = await _context.WipKps.FindAsync(id);

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

            return wipKp;
        }

        /// <summary>
        /// ByWipNo 
        /// </summary>
        /// <param name="id">工單號碼</param>
        /// <returns></returns>
        [HttpGet("ByWipNo/{id}")]
        public async Task<ActionResult<IEnumerable<WipKpDto>>> GetWipKpByWipNo(string id)
        {
            var q = from q1 in _context.WipKps.Where(w => w.WipNo.Contains(id))
                    join q2 in _context.FactoryUnits on q1.UnitNo equals q2.UnitNo
                    join q3 in _context.Items on q1.KpNo equals q3.ItemNo
                    select new WipKpDto
                    {
                        WipKpID = q1.WipKpID,
                        WipNo = q1.WipNo,
                        ItemNo = q1.ItemNo,
                        KpName = q1.KpName,
                        KpNo = q1.KpNo,
                        KpSeq = q1.KpSeq,
                        Length = q1.Length,
                        Title = q1.Title,
                        UnitNo = q1.UnitNo,
                        UnitNoName = q2.UnitName,
                        KpNoName = q3.ItemName,
                        IsRepeat = q1.IsRepeat
                    };

            return await q.OrderBy(o => o.KpSeq).ToListAsync();
        }

        /// <summary>
        /// 更新工單KP資訊資料檔
        /// </summary>
        /// <param name="wipKp"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<WipKp>> PutWipKp(WipKp wipKp)
        {
            ResultModel<WipKp> result = new ResultModel<WipKp>();
            _context.Entry(wipKp).State = EntityState.Modified;
            //設置容器空間某一個模型的某一個欄位 不提交到資料庫
            //DbContent.Entry是要更新到資料庫的整個對象
            _context.Entry<WipKp>(wipKp).Property("CreateDate").IsModified = false;
            _context.Entry<WipKp>(wipKp).Property("CreateUserID").IsModified = false;
            wipKp.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>
        /// 更新工單KP資訊資料檔-狀態
        /// </summary>
        /// <param name="wipKp"></param>
        /// <returns></returns>
        [HttpPut("Status")]
        public async Task<ResultModel<WipKp>> PutWipKpByStatus(WipKp wipKp)
        {
            ResultModel<WipKp> result = new ResultModel<WipKp>();
            var resultWipKp = GetWipKp(wipKp.WipKpID).Result.Value;
            _context.Entry(resultWipKp).State = EntityState.Modified;
            resultWipKp.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>
        /// 新增工單KP資訊資料檔
        /// </summary>
        /// <param name="wipKp"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<WipKp>> PostWipKp(WipKp wipKp)
        {
            ResultModel<WipKp> result = new ResultModel<WipKp>();
            Helper helper = new Helper(_context);
            wipKp.WipKpID = helper.GetIDKey("WIP_KP_ID").Result;
            //wipKp.UpdateDate = DateTime.Now;
            //wipKp.UpdateUserID = 0;
            //wipKp.UpdateDate = DateTime.Now;
            //wipKp.UpdateUserID = 0;
            _context.WipKps.Add(wipKp);
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        /// <summary>
        /// 刪除工單KP資訊資料檔
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [HttpDelete("{id}")]
        public async Task<ResultModel<WipKp>> DeleteWipKp(int id)
        {
            ResultModel<WipKp> result = new ResultModel<WipKp>();
            var wipKp = await _context.WipKps.FindAsync(id);

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

        /// <summary>
        /// 刪除工單KP資訊資料檔 By KpNo(停用)
        /// </summary>
        /// <param name="id">KpNo</param>
        /// <returns></returns>
        [HttpDelete("ByKpNo/{id}")]
        public async Task<ResultModel<WipKp>> DeleteWipKpByKpNo(string id)
        {
            ResultModel<WipKp> result = new ResultModel<WipKp>();
            var wipKp = await _context.WipKps.Where(w => w.KpNo == id).ToListAsync();

            try
            {
                if (wipKp.Count != 0)
                {
                    _context.WipKps.RemoveRange(wipKp);
                    await _context.SaveChangesAsync();
                    result.Success = true;
                    result.Msg = "OK";
                }
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        private bool WipKpExists(int id)
        {
            return _context.WipKps.Any(e => e.WipKpID == id);
        }
    }
}