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 WipOutfitController : ControllerBase
    {
        private readonly AMESContext _context;

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

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

        // GET: api/WipOutfit/5
        [HttpGet("{id}")]
        public async Task<ActionResult<WipOutfit>> GetWipOutfit(int id)
        {
            var wipOutfit = await _context.WipOutfits.FindAsync(id);

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

            return wipOutfit;
        }

        /// <summary>
        /// ByWipNo 
        /// </summary>
        /// <param name="id">工單號碼</param>
        /// <returns></returns>
        [HttpGet("ByWipNo/{id}")]
        public async Task<ActionResult<IEnumerable<WipOutfitDto>>> GetWipOutfitByWipNo(string id)
        {
            var q = from q1 in _context.WipOutfits.Where(w => w.WipNo.Contains(id))
                    join q2 in _context.FactoryUnits on q1.UnitNo equals q2.UnitNo
                    join q3 in _context.Stationses on q1.StationID equals q3.StationID
                    into cp
                    from q3 in cp.DefaultIfEmpty()
                    join q4 in _context.OutfitCommodityInfoes on q1.PartNo equals q4.CommodityNo
                    select new WipOutfitDto
                    {
                        WipOutfitID = q1.WipOutfitID,
                        WipNo = q1.WipNo,
                        ItemNo = q1.ItemNo,
                        OutfitNo = q1.OutfitNo,
                        PartNo = q1.PartNo,
                        PartNoName = q4.CommodityName,
                        UnitNo = q1.UnitNo,
                        UnitNoName = q2.UnitName,
                        StationID = q1.StationID,
                        StationName = q3.StationName ?? ""
                    };

            return await q.ToListAsync();
        }

        /// <summary>
        /// 更新工單治具資料檔
        /// </summary>
        /// <param name="wipOutfit"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<WipOutfit>> PutWipOutfit(WipOutfit wipOutfit)
        {
            ResultModel<WipOutfit> result = new ResultModel<WipOutfit>();
            _context.Entry(wipOutfit).State = EntityState.Modified;
            //設置容器空間某一個模型的某一個欄位 不提交到資料庫
            //DbContent.Entry是要更新到資料庫的整個對象
            _context.Entry<WipOutfit>(wipOutfit).Property("CreateDate").IsModified = false;
            _context.Entry<WipOutfit>(wipOutfit).Property("CreateUserID").IsModified = false;
            wipOutfit.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>
        /// 新增工單治具資料檔
        /// </summary>
        /// <param name="wipOutfit"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<WipOutfit>> PostWipOutfit(WipOutfit wipOutfit)
        {
            ResultModel<WipOutfit> result = new ResultModel<WipOutfit>();
            Helper helper = new Helper(_context);
            wipOutfit.WipOutfitID = helper.GetIDKey("WIP_OUTFIT_ID").Result;
           
            try
            {
                _context.WipOutfits.Add(wipOutfit);
                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"></param>
        /// <returns></returns>
        [HttpDelete("{id}")]
        public async Task<ResultModel<WipOutfit>> DeleteWipOutfit(int id)
        {
            ResultModel<WipOutfit> result = new ResultModel<WipOutfit>();
            var wipOutfit = await _context.WipOutfits.FindAsync(id);

            try
            {
                if (wipOutfit != null)
                {
                    _context.WipOutfits.Remove(wipOutfit);
                    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;
        }

        private bool WipOutfitExists(int id)
        {
            return _context.WipOutfits.Any(e => e.WipOutfitID == id);
        }
    }
}