using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.Windows.Forms;

namespace Project
{
    public partial class MessageWindow
    {
        public enum eWindowPosition
        {
            center = 0,
            top = 1,
            bottom = 2
        }

        public enum eWindowType
        {
            information,
            error,
            attention,
        }

        fMsgWindow msgwin;

        public MessageWindow()
        {
            msgwin = new fMsgWindow("");
            msgwin.VisibleChanged += msgwin_VisibleChanged;
        }

        public bool needClose = false;
        public Boolean needShow = false;
        private CMessageData msgBuffer = new CMessageData();

        public void setMessage(CMessageData msgData)
        {
            //마지막데잍와 동일하고 버퍼에 데이터가 있다면 처리하지 않는다.
            if (msgBuffer == msgData) return;

            //신규 메세지를 추가
            msgBuffer = msgData;

            //화면이 표시되어야하므로 플래그 설정
            needShow = true;
        }

         public void setMessage(string msg,string tag,
            eWindowType winType = eWindowType.error,
            int width = 900, int height = 500,
            Boolean enbClose = true,
            Font fontTitle = null,
            Font fontBody = null)
        {
            setMessage(new CMessageData()
            {
                Tag = tag,
                EnableClose = enbClose,
                FontContent = fontBody,
                FontTitle = fontTitle,
                Message = msg,
                WindowSize = new Size(width, height),
                WindowType = winType
            });
        }


        public void setMessage(string msg,
            eWindowType winType = eWindowType.error,
            int width = 900, int height = 500,
            Boolean enbClose = true,
            Font fontTitle = null,
            Font fontBody = null)
        {
            setMessage(new CMessageData()
            {
                EnableClose = enbClose,
                FontContent = fontBody,
                FontTitle = fontTitle,
                Message = msg,
                WindowSize = new Size(width, height),
                WindowType = winType
            });
        }

        /// <summary>
        /// 메세지 버퍼의 내용을 폼으로 표시합니다.
        /// UI 쓰레드를 사용하므로 invoke 를 이용해 호출 하거나
        /// UI 쓰레드내에서 실행 하시기 바랍니다.
        /// </summary>
        public void showMessage()
        {
            //개체가 없어졌다면 새로생성해서 사용한다
            if (msgwin == null || msgwin.Disposing || msgwin.IsDisposed)
            {
                msgwin = new fMsgWindow("");
                msgwin.VisibleChanged += msgwin_VisibleChanged;
            }


            //등록된 메세지 버퍼의 내용을 화면에 표시한다.
            msgwin.TopMost = true;
            // msgwin.Disposed += (s1, e1) => { CloseMsg(item.Key); };
            msgwin.Width = this.msgBuffer.WindowSize.Width;
            msgwin.Height = msgBuffer.WindowSize.Height;
            msgwin.BackColor = Color.FromArgb(200, 200, 200);
            msgwin.StartPosition = FormStartPosition.CenterScreen;

            msgwin.setMessage(msgBuffer.Message);
            //set font
            if (msgBuffer.FontTitle != null) msgwin.lbTitle.Font = msgBuffer.FontTitle;
            if (msgBuffer.FontContent != null)
            {
                msgwin.lb1.Font = msgBuffer.FontContent;
                msgwin.lb2.Font = msgBuffer.FontContent;
                msgwin.lb3.Font = msgBuffer.FontContent;
                msgwin.lb4.Font = msgBuffer.FontContent;
                msgwin.lb5.Font = msgBuffer.FontContent;
                msgwin.lb6.Font = msgBuffer.FontContent;
                msgwin.lb7.Font = msgBuffer.FontContent;
            }

            switch (msgBuffer.WindowType)
            {
                case eWindowType.attention:
                    msgwin.lbTitle.BackColor = Color.Gold;
                    msgwin.lbTitle.BackColor2 = Color.Khaki;
                    msgwin.lbTitle.ShadowColor = Color.FromArgb(150, 150, 150);
                    msgwin.lbTitle.ForeColor = Color.FromArgb(50, 50, 50);
                    break;
                case eWindowType.error:
                    msgwin.lbTitle.BackColor = Color.Tomato;
                    msgwin.lbTitle.BackColor2 = Color.Red;
                    msgwin.lbTitle.ShadowColor = Color.FromArgb(50, 50, 50);
                    msgwin.lbTitle.ForeColor = Color.WhiteSmoke;
                    break;
                default:
                    msgwin.lbTitle.BackColor = Color.DarkTurquoise;
                    msgwin.lbTitle.BackColor2 = Color.LightSkyBlue;
                    msgwin.lbTitle.ShadowColor = Color.FromArgb(50, 50, 50);
                    msgwin.lbTitle.ForeColor = Color.WhiteSmoke;
                    break;
            }

            if (!msgBuffer.EnableClose) msgwin.EnableUserClose = false;
            if (msgwin.Visible == false) msgwin.Show();
            else
            {
                msgwin.Visible = true;
                msgwin.Activate();
            }

            needShow = false;
            needClose = false; //닫히게되어잇다면 그것을 off해줘야 다시 닫히지 않음 200923
        }
        
        /// <summary>
        /// sende는 CMessageData
        /// </summary>
        public event EventHandler WindowClose;
        /// <summary>
        /// sender는 CMessageData
        /// </summary>
        public event EventHandler WindowOpen;
        void msgwin_VisibleChanged(object sender, EventArgs e)
        {
            var f = sender as Form;
            if (f.Visible == false)
            {
                if (WindowClose != null) WindowClose(msgBuffer, new EventArgs());
            }
            else
            {
                if (WindowOpen != null) WindowOpen(msgBuffer, new EventArgs());
            }
        }
        
        public Boolean Visible
        {
            get
            {
                if (msgwin == null || msgwin.Disposing || msgwin.IsDisposed) return false;
                return msgwin.Visible;
            }
            set
            {
                if (msgwin == null || msgwin.Disposing || msgwin.IsDisposed)
                {
                    needShow = false;
                    needClose = false;
                    return;
                }

                if (value == true)
                {
                    if (msgwin.Visible == false)
                    {
                        msgwin.Show();
                        msgwin.Activate();
                    }
                    else
                    {
                        msgwin.Activate();
                    }
                    needShow = false;
                }
                else
                {
                    msgwin.Visible = false;
                    needClose = false;
                }

            }
        }

    }
}
