using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore;
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 MaterialOutfitController : ControllerBase
    {
        private readonly AMESContext _context;

        /// <summary>
        /// 建構式
        /// </summary>
        public MaterialOutfitController(AMESContext context)
        {
            _context = context;
        }

        /// <summary>
        /// 查詢料號治具資訊資料檔
        /// </summary>
        // GET: api/MaterialOutfits
        [HttpGet]
        public async Task<ActionResult<IEnumerable<MaterialOutfit>>> GetMaterialOutfits()
        {
            IQueryable<MaterialOutfit> q = _context.MaterialOutfits;
            q = q.OrderBy(p => p.MaterialOutfitID);
            var MaterialOutfit = await q.ToListAsync();
            return MaterialOutfit;

        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        // GET: api/MaterialOutfits/5
        [HttpGet("{id}")]
        public async Task<IEnumerable<MaterialOutfit>> GetMaterialOutfit(int id)
        {
            IQueryable<MaterialOutfit> q = _context.MaterialOutfits;
            var result = await q.Where(p => p.MaterialOutfitID == id).ToListAsync();
            return result;
        }

        /// <summary>
        /// 料號基本資料檔 to ItemID
        /// </summary>
        /// <param name="id">ItemID</param>
        /// <returns></returns>
        [HttpGet("ByItemID/{id}")]
        public async Task<IEnumerable<MaterialOutfit>> GetMaterialOutfitByItemID(int id)
        {
            
            IQueryable<MaterialOutfit> q = _context.MaterialOutfits;
            var result = await q.Where(p => p.ItemID == id).ToListAsync();
            return result;
            
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="itemNo"></param>
        /// <param name="page"></param>
        /// <param name="limit"></param>
        /// <returns></returns>
        [Route("[action]")]
        [HttpGet]
        public async Task<ResultModel<dynamic>> GetMaterialOutfitByItemID2(string itemNo, int page = 0, int limit = 10)
        {
            ResultModel<dynamic> result = new ResultModel<dynamic>();
            var q = from a in _context.MaterialOutfits
                    join b in _context.OutfitInfoes on a.OutfitNo equals b.OutfitNo into data
                    from x in data.DefaultIfEmpty()
                    join c in _context.OutfitVarityInfoes on x.VarietyID equals c.VarityID
                    join d in _context.MaterialItems on a.ItemID equals d.ItemID
                    select new
                    {
                        a.MaterialOutfitID,
                        a.ItemID,
                        ItemNo = a.MaterialItem.ItemNo,
                        a.OutfitNo,
                        UnitName = a.Unit.UnitName,
                        StationName = a.RStation.StationName,
                        x.LocationNo,
                        c.VarityName
                    };

            if (itemNo != "" && itemNo != null)
            {
                q = q.Where(w => w.ItemNo == itemNo);
            }

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

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

            result.Data = await q.ToListAsync();

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

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


        }

        /// <summary>
        /// 料號基本資料檔 to ItemNo
        /// </summary>
        /// <param name="id">料號</param>
        /// <returns></returns>
        [HttpGet("ByItemNo/{id}")]
        public async Task<IEnumerable<MaterialOutfit>> GetMaterialOutfitByItemNo(string id)
        {
            MaterialItemController materialItemController = new MaterialItemController(_context);
            var result_Item = materialItemController.GetMaterialItemByItemNO(id);
            int ItemID = 0;

            if (result_Item.Result != null)
                ItemID = result_Item.Result.ItemID;

            IQueryable<MaterialOutfit> q = _context.MaterialOutfits.Where(w => w.ItemID == ItemID);
            return await q.ToListAsync();
        }

        // PUT: api/MaterialOutfits/5
        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://go.microsoft.com/fwlink/?linkid=2123754.
        [HttpPut("{id}")]
        public async Task<ResultModel<MaterialOutfit>> PutMaterialOutfit(int id, MaterialOutfit MaterialOutfit)
        {
            ResultModel<MaterialOutfit> result = new ResultModel<MaterialOutfit>();
            if (id != MaterialOutfit.MaterialOutfitID)
            {
                result.Success = false;
                result.Msg = "序號錯誤";
                return result;
            }

            _context.Entry(MaterialOutfit).State = EntityState.Modified;

            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        // POST: api/MaterialOutfits
        // To protect from overposting attacks, enable the specific properties you want to bind to, for
        // more details, see https://go.microsoft.com/fwlink/?linkid=2123754.
        [HttpPost]
        public async Task<ResultModel<MaterialOutfit>> PostMaterialOutfit(MaterialOutfit MaterialOutfit)
        {
            ResultModel<MaterialOutfit> result = new ResultModel<MaterialOutfit>();
            Helper helper = new Helper(_context);
            MaterialOutfit.MaterialOutfitID = helper.GetIDKey("MaterialOutfitID").Result;

            _context.MaterialOutfits.Add(MaterialOutfit);
            try
            {
                await _context.SaveChangesAsync();
                result.Success = true;
                result.Msg = "OK";
            }
            catch (Exception ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }
            return result;
        }

        // DELETE: api/MaterialOutfits/5
        [HttpDelete("{id}")]
        public async Task<ResultModel<MaterialOutfit>> DeleteMaterialOutfit(int id)
        {
            ResultModel<MaterialOutfit> result = new ResultModel<MaterialOutfit>();
            var MaterialOutfit = await _context.MaterialOutfits.Where(m => m.MaterialOutfitID == id).FirstOrDefaultAsync();
            if (MaterialOutfit == null)
            {
                result.Success = false;
                result.Msg = "序號不存在";
                return result;
            }

            _context.MaterialOutfits.Remove(MaterialOutfit);
            await _context.SaveChangesAsync();

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

        private bool MaterialOutfitExists(int id)
        {
            return _context.MaterialOutfits.Any(e => e.MaterialOutfitID == id);
        }
    }
}