using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Project.Class
{
    public enum eStatusMesage : byte
    {
        Front = 0,
        Rear,
        TopJig,
        Main,
    }
    public class StatusMessage
    {

        Dictionary<eStatusMesage, StatusMessageFormat> message;
        public StatusMessage()
        {
            this.message = new Dictionary<eStatusMesage, StatusMessageFormat>();
        }
        public StatusMessageFormat get(eStatusMesage msg)
        {
            lock (this.message)
            {
                if (this.message.ContainsKey(msg) == false)
                {
                    var nemsg = new StatusMessageFormat
                    {
                        Message = string.Empty
                    };
                    this.message.Add(msg, nemsg);
                    return nemsg;
                }

                else
                    return this.message[msg];
            }
        }

        public void Clear()
        {

        }

        public void set(eStatusMesage msg, StatusMessageFormat data)
        {
            lock (this.message)
            {
                if (this.message.ContainsKey(msg) == false)
                    this.message.Add(msg, data);
                else
                    this.message[msg] = data;
            }

        }
        public void set(eStatusMesage msg, string data, int progval = 0, int progmax = 0)
        {
            if (data.StartsWith("[") && data.Contains("]"))
            {
                var buf = data.Split(']');
                var cate = buf[0].Substring(1);
                var body = string.Join("]", buf, 1, buf.Length - 1);
                set(msg, cate, body, Color.Black, progval, progmax);
            }
            else set(msg, string.Empty, data, Color.Black, progval, progmax);

        }
        //public void set(eStatusMesage msg, string cate, string data, int progval = 0, int progmax = 0)
        //{
        //    set(msg, cate, data, Color.Black, progval, progmax);

        //}

        public void set(eStatusMesage msg, string cate, string data, Color fColor, int progval = 0, int progmax = 0)
        {
            lock (this.message)
            {
                if (this.message.ContainsKey(msg) == false)
                {
                    var nemsg = new StatusMessageFormat
                    {
                        Category = cate,
                        Message = data,
                        fColor = fColor,
                        ProgressMax = progmax,
                        ProgressValue = progval
                    };
                    this.message.Add(msg, nemsg);
                }
                else
                {
                    var m = this.message[msg];
                    m.Category = cate;
                    m.Message = data;
                    m.fColor = fColor;
                    if (progval != 0 || progmax != 0)
                    {
                        m.ProgressValue = progval;
                        m.ProgressMax = progmax;
                    }
                }
            }


        }
        public void set(eStatusMesage msg, string data, Color fColor, Color bColor1, Color bColor2)
        {
            lock (this.message)
            {
                if (this.message.ContainsKey(msg) == false)
                {
                    var nemsg = new StatusMessageFormat
                    {
                        Message = data,
                        fColor = fColor,
                        bColor1 = bColor1,
                        bColor2 = bColor2
                    };
                    this.message.Add(msg, nemsg);
                }
                else
                {
                    var m = this.message[msg];
                    m.Message = data;
                    m.fColor = fColor;
                    m.bColor2 = bColor2;
                    m.bColor1 = bColor1;
                }
            }


        }
    }
    public class StatusMessageFormat
    {
        public string Category { get; set; }
        public string Message { get; set; }
        public Color fColor { get; set; }
        public Color bColor1 { get; set; }
        public Color bColor2 { get; set; }
        public int ProgressValue { get; set; }
        public int ProgressMax { get; set; }
        public int ProgressPerc
        {
            get
            {
                if (ProgressMax == 0 || ProgressValue == 0) return 0;
                return (int)(ProgressValue / (ProgressMax * 1.0));
            }
        }
        public StatusMessageFormat()
        {
            Clear();
        }
        void setMessage(string t, string m, Color c)
        {
            this.Category = t;
            this.Message = m;
            this.fColor = c;

        }
        void setMessage(string m, Color c)
        {
            this.Category = string.Empty;
            this.Message = m;
            this.fColor = c;

        }
        public void Clear()
        {
            ProgressValue = 0;
            ProgressMax = 0;
            Category = string.Empty;
            Message = string.Empty;
            fColor = Color.Black;
            bColor1 = Color.White;
            bColor2 = Color.White;
        }
    }
}
