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;
namespace AMESCoreStudio.WebApi.Controllers.AMES
{
    /// <summary>
    /// 
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class WipBarcodeController : Controller
    {
        private readonly AMESContext _context;

        /// <summary>
        /// 
        /// </summary>
        /// <param name="context"></param>
        public WipBarcodeController(AMESContext context)
        {
            _context = context;
        }

        /// <summary>
        /// 查詢工單資料Barcode
        /// </summary>
        /// <returns></returns>
        // GET: api/WipBarcode
        [HttpGet]
        public async Task<ActionResult<IEnumerable<WipBarcode>>> GetWipBarcode()
        {
            IQueryable<WipBarcode> q = _context.WipBarcodes;

            q = q.OrderBy(p => p.WipNO);

            //q = q.OrderByDescending(p => p.SystemID);

            var WipBarcodes = await q.ToListAsync();

            //return await _context.SystemInfoes.ToListAsync();

            return WipBarcodes;
        }

        /// <summary>
        /// 查詢工單資料Barcode By WipNO
        /// </summary>
        /// <param name="id">工單號碼</param>
        /// <returns></returns>
        // GET: api/WipBarcode/4
        [HttpGet("{id}")]
        public async Task<ActionResult<IEnumerable<WipBarcode>>> GetWipBarcode(string id)
        {
            IQueryable<WipBarcode> q = _context.WipBarcodes.Where(p => p.WipNO == id);
            var WipBarcodes = await q.ToListAsync();

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

            return WipBarcodes;
        }

        /// <summary>
        /// 查詢工單資料Barcode By 條碼前置碼
        /// </summary>
        /// <param name="id">工單號碼</param>
        /// <returns></returns>
        // GET: api/WipBarcode/4
        [HttpGet("BarcodeNo/{id}")]
        public async Task<ActionResult<IEnumerable<WipBarcode>>> GetWipBarcodeBarcodeNo(string id)
        {
            IQueryable<WipBarcode> q = _context.WipBarcodes.Where(p => p.StartNO.StartsWith(id));
            var WipBarcodes = await q.ToListAsync();
            return WipBarcodes;
        }

        /// <summary>
        /// 新增工單資料-條碼Barcode
        /// </summary>
        /// <param name="wipBarcode"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<WipBarcode>> PostWipBarcode([FromBody] WipBarcode wipBarcode)
        {
            ResultModel<WipBarcode> result = new ResultModel<WipBarcode>();
            try
            {
                Helper helper = new Helper(_context);
                wipBarcode.WipID = wipBarcode.WipID == 0 ? helper.GetIDKeyNoPost("WIP_ID").Result : wipBarcode.WipID;
                _context.WipBarcodes.Add(wipBarcode);
                await _context.SaveChangesAsync();
                result.Success = true;
            }
            catch (DbUpdateConcurrencyException ex)
            {
                result.Success = false;
                result.Msg = ex.InnerException.Message;
            }


            return result;
        }


        /// <summary>
        /// 更新工單資料-條碼Barcode
        /// </summary>
        /// <param name="wipBarcode"></param>
        /// <returns></returns>
        [HttpPut]
        public async Task<ResultModel<WipBarcode>> PutWipBarcode([FromBody] WipBarcode wipBarcode)
        {
            ResultModel<WipBarcode> result = new ResultModel<WipBarcode>();
            var wipNo = wipBarcode.WipNO;
            try
            {
                var result_old = _context.WipBarcodes.Where(w => w.WipNO == wipNo).ToList();
                if (result_old.Count != 0)
                {
                    foreach (var item in result_old)
                    {
                        _context.Entry(item).State = EntityState.Modified;
                        _context.Entry<WipBarcode>(item).Property("CreateDate").IsModified = false;
                        _context.Entry<WipBarcode>(item).Property("CreateUserID").IsModified = false;
                        item.UpdateDate = DateTime.Now;
                        item.Remarks = wipBarcode.Remarks;
                    }
                }
                else
                {
                    _context.WipBarcodes.Add(wipBarcode);
                }

                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="wipno">工單號碼</param>
        /// <param name="strno">起始區間</param>
        /// <param name="endno">結束區間</param>
        /// <returns></returns>
        [HttpDelete("{wipno}/{strno}/{endno}")]
        public async Task<ActionResult<WipBarcode>> DeleteWipBarcode(string wipno, string strno, string endno)
        {
            //var repairResponsibleUnits = await _context.BarcodeInfoes.FindAsync(id);
            var wipBarcode = await _context.WipBarcodes.Where(m => m.WipNO == wipno
                             && m.StartNO == strno
                             && m.EndNO == endno).FirstOrDefaultAsync();
            if (wipBarcode == null)
            {
                return NotFound();
            }

            _context.WipBarcodes.Remove(wipBarcode);
            await _context.SaveChangesAsync();

            return wipBarcode;
        }
    }
}