using System;
using System.Collections.Generic;

namespace SLC1_N
{
    public class ProductionRecord  // 记录产能
    {
        private readonly JsonConfig config;
        private readonly string configKey;

        public ProductionRecord(string configFilePath = "productiondata.json")
        {
            config = new JsonConfig(configFilePath);
            configKey = "ProductionData";
        }

        // 产能数据
        private class ProductionData
        {
            public int Total { get; set; }
            public int OK { get; set; }
            public int NG { get; set; }
            public DateTime LastUpdate { get; set; }

            public double OKRate => Total > 0 ? Math.Round(OK * 100.0 / Total, 2) : 0;
            public double NGRate => Total > 0 ? Math.Round(NG * 100.0 / Total, 2) : 0;
        }

        #region 公共接口

        /// <summary>
        /// OK加1
        /// </summary>
        public void AddOK()
        {
            var data = GetProductionData();
            data.Total++;
            data.OK++;
            data.LastUpdate = DateTime.Now;
            SaveProductionData(data);
        }

        /// <summary>
        /// NG加1
        /// </summary>
        public void AddNG()
        {
            var data = GetProductionData();
            data.Total++;
            data.NG++;
            data.LastUpdate = DateTime.Now;
            SaveProductionData(data);
        }

        /// <summary>
        /// 获取总产能
        /// </summary>
        public int GetTotal()
        {
            return GetProductionData().Total;
        }

        /// <summary>
        /// 获取OK产能
        /// </summary>
        public int GetOK()
        {
            return GetProductionData().OK;
        }

        /// <summary>
        /// 获取NG产能
        /// </summary>
        public int GetNG()
        {
            return GetProductionData().NG;
        }

        /// <summary>
        /// 获取合格率
        /// </summary>
        public double GetOKRate()
        {
            return GetProductionData().OKRate;
        }

        /// <summary>
        /// 获取不合格率
        /// </summary>
        public double GetNGRate()
        {
            return GetProductionData().NGRate;
        }

        /// <summary>
        /// 获取最后更新时间
        /// </summary>
        public DateTime GetLastUpdate()
        {
            return GetProductionData().LastUpdate;
        }

        /// <summary>
        /// 清除所有产能数据
        /// </summary>
        public void Clear()
        {
            var data = new ProductionData
            {
                Total = 0,
                OK = 0,
                NG = 0,
                LastUpdate = DateTime.Now
            };
            SaveProductionData(data);
        }

        /// <summary>
        /// 获取所有产能信息
        /// </summary>
        public Dictionary<string, object> GetAllInfo()
        {
            var data = GetProductionData();
            return new Dictionary<string, object>
            {
                { "Total", data.Total },
                { "OK", data.OK },
                { "NG", data.NG },
                { "OKRate", data.OKRate },
                { "NGRate", data.NGRate },
                { "LastUpdate", data.LastUpdate }
            };
        }

        #endregion

        #region 私有方法

        private ProductionData GetProductionData()
        {
            // 从配置中获取数据，如果不存在则创建新的
            if (config.ContainsKey(configKey))
            {
                var data = config.GetValue<ProductionData>(configKey);
                if (data != null) 
                    return data;
            }

            return new ProductionData();
        }

        private void SaveProductionData(ProductionData data)
        {
            config.SetValue(configKey, data);
        }

        #endregion
    }


    //public class MultiChannelProductionRecorder
    //{
    //    private readonly Dictionary<int, ProductionRecorder> _channelRecorders;

    //    public MultiChannelProductionRecorder(string baseConfigPath = "production")
    //    {
    //        _channelRecorders = new Dictionary<int, ProductionRecorder>();

    //        // 初始化4个通道
    //        for (int i = 1; i <= 4; i++)
    //        {
    //            string configPath = $"{baseConfigPath}_channel{i}.json";
    //            _channelRecorders[i] = new ProductionRecorder(configPath);
    //        }
    //    }

    //    public void AddOK(int channel)
    //    {
    //        if (_channelRecorders.ContainsKey(channel))
    //            _channelRecorders[channel].AddOK();
    //    }

    //    public void AddNG(int channel)
    //    {
    //        if (_channelRecorders.ContainsKey(channel))
    //            _channelRecorders[channel].AddNG();
    //    }

    //    public Dictionary<string, object> GetChannelInfo(int channel)
    //    {
    //        return _channelRecorders.ContainsKey(channel)
    //            ? _channelRecorders[channel].GetAllInfo()
    //            : new Dictionary<string, object>();
    //    }

    //    public void ClearChannel(int channel)
    //    {
    //        if (_channelRecorders.ContainsKey(channel))
    //            _channelRecorders[channel].Clear();
    //    }

    //    public void ClearAll()
    //    {
    //        foreach (var recorder in _channelRecorders.Values)
    //        {
    //            recorder.Clear();
    //        }
    //    }

    //    // 获取总计信息
    //    public Dictionary<string, object> GetSummaryInfo()
    //    {
    //        int total = 0, ok = 0, ng = 0;

    //        foreach (var recorder in _channelRecorders.Values)
    //        {
    //            var info = recorder.GetAllInfo();
    //            total += (int)info["Total"];
    //            ok += (int)info["OK"];
    //            ng += (int)info["NG"];
    //        }

    //        double okRate = total > 0 ? Math.Round(ok * 100.0 / total, 2) : 0;
    //        double ngRate = total > 0 ? Math.Round(ng * 100.0 / total, 2) : 0;

    //        return new Dictionary<string, object>
    //        {
    //            { "Total", total },
    //            { "OK", ok },
    //            { "NG", ng },
    //            { "OKRate", okRate },
    //            { "NGRate", ngRate }
    //        };
    //    }
    //}
}