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.BAS;
using AMESCoreStudio.CommonTools.Result;

namespace AMESCoreStudio.WebApi.Controllers.BAS
{
    /// <summary>
    /// BAS002生產製程單位維護相關
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class FactoryUnitsController : ControllerBase
    {
        private readonly AMESContext _context;

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

        /// <summary>
        /// 获取全部單位资料
        /// </summary>
        /// <returns></returns>
        // GET: api/FactoryUnits
        [HttpGet]
        public async Task<ActionResult<IEnumerable<FactoryUnit>>> GetFactoryUnit()
        {
            IQueryable<FactoryUnit> q = _context.FactoryUnits;
            q = q.OrderBy(p => p.UnitNo);

            var FactoryUnit = await q.ToListAsync();
            return FactoryUnit;
        }

        /// <summary>
        /// 用ID获取该單位资料
        /// </summary>
        /// <returns></returns>
        // GET: api/FactoryUnits/5
        [HttpGet("{id}")]
        public async Task<ActionResult<IEnumerable<FactoryUnit>>> GetFactoryUnit(string id)
        {
            IQueryable<FactoryUnit> q = _context.FactoryUnits;
            q = q.Where(p => p.UnitNo.Equals(id));
            var factoryUnit = await q.ToListAsync();

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

            return factoryUnit ;
        }

        /// <summary>
        /// 更改單位资料
        /// </summary>
        /// <returns></returns>
        // PUT: api/FactoryUnits/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<FactoryUnit>> PutFactoryUnit(string id, FactoryUnit factoryUnit)
        {
            ResultModel<FactoryUnit> result = new ResultModel<FactoryUnit>();
            if (id != factoryUnit.UnitNo)
            {
                result.Success = false;
                result.Msg = "序號錯誤";
                return result;
            }

            _context.Entry(factoryUnit).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;
        }

        /// <summary>
        /// 新增單位资料
        /// </summary>
        /// <returns></returns>
        // POST: api/FactoryUnits
        // 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<FactoryUnit>> PostFactoryUnit(FactoryUnit factoryUnit)
        {
            ResultModel<FactoryUnit> result = new ResultModel<FactoryUnit>();
            Helper helper = new Helper(_context);
            //factoryUnit.UnitName = factoryUnit.UnitName.Trim();
            factoryUnit.SEQ = helper.GetIDKey("UNIT_ID").Result; //SHANI?
            factoryUnit.StatusNo = "A";

            _context.FactoryUnits.Add(factoryUnit);

            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>
        /// <returns></returns>
        // DELETE: api/FactoryUnits/5
        [HttpDelete("{id}")]
        public async Task<ResultModel<FactoryUnit>> DeleteFactoryUnit(string id)
        {
            ResultModel<FactoryUnit> result = new ResultModel<FactoryUnit>();
            var factoryUnit = await _context.FactoryUnits.FindAsync(id);
            if (factoryUnit == null)
            {
                result.Success = false;
                result.Msg = "序號錯誤";
                return result;
            }
            //////
            var factoryUnitNew = new FactoryUnit();
            factoryUnitNew = factoryUnit;

            _context.Entry(factoryUnitNew).State = EntityState.Modified;
            if(factoryUnit.StatusNo =="A")
                factoryUnitNew.StatusNo = "S";
            else
                factoryUnitNew.StatusNo = "A";


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



            /////

            ////_context.FactoryUnits.Remove(factoryUnit);
            ////await _context.SaveChangesAsync();

            ////return factoryUnit;
        }

        private bool FactoryUnitExists(int id)
        {
            return _context.FactoryUnits.Any(e => e.SEQ == id);
        }
        private bool FactoryUnitExistsStr(string id)
        {
            return _context.FactoryUnits.Any(e => e.UnitNo == id);
        }
    }
}