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>
    /// 生產工時資料檔Controller
    /// </summary>
    [Route("api/[controller]")]
    [ApiController]
    public class WorkingHoursCollectionsController : ControllerBase
    {
        private readonly AMESContext _context;

        /// <summary>
        /// 建構式
        /// </summary>
        /// <param name="context"></param>
        public WorkingHoursCollectionsController(AMESContext context)
        {
            _context = context;
        }

        /// <summary>
        /// 查詢生產工時資料檔
        /// </summary>
        /// <returns></returns>
        // GET: api/<WorkingHoursCollectionController>
        [HttpGet]
        public async Task<ActionResult<IEnumerable<WorkingHoursCollection>>> GetWorkingHoursCollection()
        {
            IQueryable<WorkingHoursCollection> q = _context.WorkingHoursCollections;
            q = q.OrderBy(p => p.TimeSheetID);
            var WorkingHoursCollection = await q.ToListAsync();
            return WorkingHoursCollection;
        }

        /// <summary>
        /// 生產工時資料檔 by ID
        /// </summary>
        /// <param name="id">WorkingHoursCollectionID</param>
        /// <returns></returns>
        [HttpGet("{id}")]
        public async Task<IEnumerable<WorkingHoursCollection>> GetWorkingHoursCollection(int id)
        {
            IQueryable<WorkingHoursCollection> q = _context.WorkingHoursCollections;
            var result = await q.Where(p => p.TimeSheetID == id).ToListAsync();
            return result;
        }

        /// <summary>
        ///  生產工時查詢
        /// </summary>
        /// <param name="unitNo"></param>
        /// <param name="stationid"></param>
        /// <param name="lineid"></param>
        /// <param name="user"></param>
        /// <param name="sdate"></param>
        /// <param name="edate"></param>
        /// <param name="itemno">料號</param>
        /// <returns></returns>
        [HttpGet("ByQuery/{unitNo}/{lineid}/{stationid}/{itemno}/{user}/{sdate}/{edate}")]
        public async Task<ActionResult<IEnumerable<WorkingHoursCollection>>> GetWorkingHoursCollectionsByQuery(string unitNo, string lineid, string stationid, string itemno, string user, string sdate, string edate)
        {
            IQueryable<WorkingHoursCollection> q = _context.WorkingHoursCollections;

            if (unitNo != "*")
                q = q.Where(p => p.UnitNo.Equals(unitNo));
            if (lineid != "*")
                q = q.Where(p => p.LineID.Equals(lineid));
            if (stationid != "*")
                q = q.Where(p => p.StationID.Equals(stationid));
            if (itemno != "*")
                q = q.Where(p => p.ItemNo.Equals(itemno));
            if (user != "*")
                q = q.Where(p => p.CreateUserID.Equals(user));

            DateTime dateValue;
            if (sdate != "*")
            {
                if (DateTime.TryParse(sdate, out dateValue))
                {
                    q = q.Where(p => p.OpenTime >= DateTime.Parse(sdate));
                }
            }
            if (edate != "*")
            {
                if (DateTime.TryParse(edate, out dateValue))
                {
                    q = q.Where(p => p.CloseTime <= DateTime.Parse(edate));
                }

            }


            var workingHoursCollections = await q.ToListAsync();

            return workingHoursCollections;
        }



        /// <summary>
        ///  生產工時Dto查詢 wipno
        /// </summary>
        /// <param name="unitNo"></param>
        /// <param name="stationid"></param>
        /// <param name="lineid"></param>
        /// <param name="user"></param>
        /// <param name="sdate"></param>
        /// <param name="edate"></param>
        /// <param name="itemno">料號</param>
        /// <param name="wipno">料號</param>
        /// <returns></returns>
        [HttpGet("DtoByQuery/{unitNo}/{lineid}/{stationid}/{wipno}/{itemno}/{user}/{sdate}/{edate}")]
        public async Task<ActionResult<IEnumerable<WorkingHoursCollectionDto>>> GetWorkingHoursCollectionDtoByQuery(string unitNo, string lineid, string stationid,string wipno, string itemno, string user, string sdate, string edate)
        {
            IQueryable<WorkingHoursCollection> q = _context.WorkingHoursCollections;

            if (unitNo != "*")
                q = q.Where(p => p.UnitNo.Equals(unitNo));
            if (lineid != "*")
                q = q.Where(p => p.LineID==int.Parse(lineid));
            if (stationid != "*")
                q = q.Where(p => p.StationID == int.Parse(stationid));
            if (itemno != "*")
                q = q.Where(p => p.ItemNo.Equals(itemno));
            if (wipno != "*")
                q = q.Where(p => p.WipNo.Equals(wipno));
            var user1 = _context.UserInfoes.Where(w => w.UserName == user).FirstOrDefault();
            if (user1 != null)
                q = q.Where(p => p.CreateUserID.Equals(user1.UserID));

            DateTime dateValue;
            if (sdate != "*")
            {
                if (DateTime.TryParse(sdate, out dateValue))
                {
                    q = q.Where(p => p.OpenTime >= DateTime.Parse(sdate));
                }
            }
            if (edate != "*")
            {
                if (DateTime.TryParse(edate, out dateValue))
                {
                    q = q.Where(p => p.OpenTime <= DateTime.Parse(edate).AddDays(1));
                }

            }


            var workingHoursCollectionDtos = await q.Select(s => new WorkingHoursCollectionDto
            {
                TimeSheetID = s.TimeSheetID,
                UnitNo = s.UnitNo,
                LineID = s.LineID,
                StationID = s.StationID,
                UnitName = s.Unit.UnitName,
                //LineName = s.Line.LineDesc,
                //StationName = s.Station.StationName,
                WipNo = s.WipNo,
                ItemNo = s.ItemNo,
                OPCNT = s.OPCNT,
                OpenTime = s.OpenTime,
                CloseTime = s.CloseTime,
                ProductionQty = s.ProductionQty,
                TotalCT = s.TotalCT,
                Memo = s.Memo,
                CreateUserID = s.CreateUserID,
                UpdateUserID = s.UpdateUserID
            }).ToListAsync();

            foreach (var data in workingHoursCollectionDtos)
            {
                var p1 = _context.UserInfoes.Where(w => w.UserID == data.CreateUserID).FirstOrDefault();
                data.CreateUser = p1.UserName;
                var dd = _context.StandardWorkTimes.Where(w => w.ItemNo == data.ItemNo);
                var d1 = dd.Where(w => w.UnitNo == data.UnitNo);
                var d2 = d1.Where(w => w.LineID == data.LineID);
                var d3 = d2.Where(w => w.StationID == data.StationID).FirstOrDefault();
                var l = _context.LineInfoes.Where(w => w.LineID == data.LineID).FirstOrDefault();
                var s = _context.StationWorkingHours.Where(w => w.StationWHID == data.StationID).FirstOrDefault();
                if (l != null)
                {
                    data.LineName = l.LineDesc;
                }
                if (s != null)
                {
                    data.StationName = s.StationWHName;
                }
                if (d3 != null)
                {
                    data.RuleCNT = d3.OPCNT;
                    data.RuleTime = d3.TotalCT;
                    if (data.TotalCT != null)
                    {
                        var tt = (double)((data.RuleCNT * data.RuleTime) / (data.TotalCT * data.OPCNT)); //標準工時 * 人數 / 該筆資料的實際標工(TOTAL_CT) * 人數 * 100 %
                        data.Effective = double.Parse(tt.ToString("0.00")); //標準工時 * 人數 / 該筆資料的實際標工(TOTAL_CT) * 人數 * 100 %
                    }
                }
                else {

                    data.Effective = 0.0;
                }
                if (data.UpdateUserID != null && data.UpdateUserID !=-1)
                {
                    var p2 = _context.UserInfoes.Where(w => w.UserID == data.UpdateUserID).FirstOrDefault();
                    data.UpdateUser = p2.UserName;
                }
               
            }
            workingHoursCollectionDtos = workingHoursCollectionDtos.OrderBy(o => o.CloseTime).ToList();
            return workingHoursCollectionDtos;
        }
        //public async Task<ActionResult<IEnumerable<WorkingHoursCollectionDto>>> GetWorkingHoursCollectionDtoByQuery(string unitNo, string lineid, string stationid, string wipno, string itemno, string user, string sdate, string edate)
        //{
        //    IQueryable<WorkingHoursCollection> q = _context.WorkingHoursCollections;
        //
        //    if (unitNo != "*")
        //        q = q.Where(p => p.UnitNo.Equals(unitNo));
        //    if (lineid != "*")
        //        q = q.Where(p => p.LineID.Equals(lineid));
        //    if (stationid != "*")
        //        q = q.Where(p => p.StationID.Equals(stationid));
        //    if (itemno != "*")
        //        q = q.Where(p => p.ItemNo.Equals(itemno));
        //    if (user != "*")
        //        q = q.Where(p => p.CreateUserID.Equals(user));
        //
        //    DateTime dateValue;
        //    if (sdate != "*")
        //    {
        //        if (DateTime.TryParse(sdate, out dateValue))
        //        {
        //            q = q.Where(p => p.OpenTime >= DateTime.Parse(sdate));
        //        }
        //    }
        //    if (edate != "*")
        //    {
        //        if (DateTime.TryParse(edate, out dateValue))
        //        {
        //            q = q.Where(p => p.CloseTime <= DateTime.Parse(edate));
        //        }
        //
        //    }
        //
        //
        //    var workingHoursCollectionDtos = await q.Select(s => new WorkingHoursCollectionDto
        //    {
        //        TimeSheetID = s.TimeSheetID,
        //        UnitNo = s.Unit.UnitNo,
        //        LineID = s.Line.LineID,
        //        StationID = s.Station.StationID,
        //        UnitName = s.Unit.UnitName,
        //        LineName = s.Line.LineDesc,
        //        StationName = s.Station.StationName,
        //        WipNo = s.WipNo,
        //        ItemNo = s.ItemNo,
        //        OPCNT = s.OPCNT,
        //        OpenTime = s.OpenTime,
        //        CloseTime = s.CloseTime,
        //        ProductionQty = s.ProductionQty,
        //        TotalCT = s.TotalCT,
        //        Memo = s.Memo,
        //        CreateUserID = s.CreateUserID,
        //        UpdateUserID = s.UpdateUserID
        //    }).ToListAsync();
        //
        //    foreach (var data in workingHoursCollectionDtos)
        //    {
        //        var p1 = _context.UserInfoes.Where(w => w.UserID == data.CreateUserID).FirstOrDefault();
        //        data.CreateUser = p1.UserName;
        //        var dd = _context.StandardWorkTimes.Where(w => w.ItemNo == data.ItemNo);
        //        var d1 = dd.Where(w => w.UnitNo == data.UnitNo);
        //        var d2 = d1.Where(w => w.LineID == data.LineID);
        //        var d3 = d2.Where(w => w.StationID == data.StationID).FirstOrDefault();
        //        if (d3 != null)
        //        {
        //            data.RuleCNT = d3.OPCNT;
        //            data.RuleTime = d3.TotalCT;
        //            if (data.TotalCT != null)
        //            {
        //                data.Effective = (double)((data.RuleCNT * data.RuleTime) / (data.TotalCT * data.OPCNT)); //標準工時 * 人數 / 該筆資料的實際標工(TOTAL_CT) * 人數 * 100 %
        //            }
        //        }
        //        else
        //        {
        //
        //            data.Effective = 0.0;
        //        }
        //        if (data.UpdateUserID != null)
        //        {
        //            var p2 = _context.UserInfoes.Where(w => w.UserID == data.UpdateUserID).FirstOrDefault();
        //            data.UpdateUser = p2.UserName;
        //        }
        //
        //    }
        //    return workingHoursCollectionDtos;
        //}



        /// <summary>
        /// 生產工時資料檔 to ItemNo
        /// </summary>
        /// <param name="id">料號No</param>
        /// <returns></returns>
        [HttpGet("ByItemNo/{id}")]
        public async Task<IEnumerable<WorkingHoursCollection>> GetWorkingHoursCollectionByItemNo(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<WorkingHoursCollection> q = _context.WorkingHoursCollections.Where(w => w.ItemNo == id);
            return await q.ToListAsync();
        }

        /// <summary>
        /// 新增生產工時資料檔
        /// </summary>
        /// <param name="WorkingHoursCollection"></param>
        /// <returns></returns>
        [HttpPost]
        public async Task<ResultModel<WorkingHoursCollection>> PostWorkingHoursCollection([FromBody] WorkingHoursCollection WorkingHoursCollection)
        {
            ResultModel<WorkingHoursCollection> result = new ResultModel<WorkingHoursCollection>();
            Helper helper = new Helper(_context);
            WorkingHoursCollection.TimeSheetID = helper.GetIDKey("TIMESHEET_ID").Result;

            _context.WorkingHoursCollections.Add(WorkingHoursCollection);
            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>
        [HttpPut("{id}")]
        public async Task<ResultModel<WorkingHoursCollection>> PutWorkingHoursCollection(int id,[FromBody] WorkingHoursCollection WorkingHoursCollection)
        {
            ResultModel<WorkingHoursCollection> result = new ResultModel<WorkingHoursCollection>();

            //2020-05-20 BB.Wang Modify 把總工時 - 扣除時間(0.10.30.60)
            //2021-03-29 Neil.Chyi Modify 組合板數量列入CT計算(Multi_B)
            //System.DateTime dtOpen = System.DateTime.Parse(model.OpenTime);
            if (WorkingHoursCollection.CloseTime != null)
            {
                System.DateTime dtClose = System.DateTime.Parse(WorkingHoursCollection.CloseTime.ToString());
                System.TimeSpan ts = dtClose.Subtract(WorkingHoursCollection.OpenTime);
                var totalCT = (ts.TotalMinutes - WorkingHoursCollection.DeductionTime) / WorkingHoursCollection.MultipleCount / WorkingHoursCollection.ProductionQty;

                WorkingHoursCollection.TotalCT = totalCT;
            }

            if (id != WorkingHoursCollection.TimeSheetID)
            {
                result.Success = false;
                result.Msg = "序號錯誤";
                return result;
            }

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


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

            _context.WorkingHoursCollections.Remove(WorkingHoursCollection);
            await _context.SaveChangesAsync();

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