using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using DevComponents.DotNetBar.Metro.ColorTables;
using System.Drawing;
namespace DevComponents.DotNetBar.Metro.Rendering
{
    public static class MetroRender
    {
        private static MetroRenderer[] _Renderers;
        static MetroRender()
        {
            _Renderers = new MetroRenderer[Enum.GetNames(typeof(Renderers)).Length];
            _Renderers[(int)Renderers.MetroForm] = new MetroFormRenderer();
            _Renderers[(int)Renderers.MetroTabItem] = new MetroTabItemPainter();
            _Renderers[(int)Renderers.MetroTabStrip] = new MetroTabStripPainter();
            _Renderers[(int)Renderers.MetroStatusBar] = new MetroStatusBarPainter();
            _Renderers[(int)Renderers.MetroToolbar] = new MetroToolbarPainter();
            _Renderers[(int)Renderers.MetroTileItem] = new MetroTileItemPainter();
        }
        /// 
        /// Renders the MetroTileItem.
        /// 
        /// MetroTileItem to render.
        /// Rendering event arguments.
        public static void Paint(MetroTileItem item, ItemPaintArgs pa)
        {
            MetroRenderer renderer = GetRenderer(Renderers.MetroTileItem);
            renderer.Render(GetRenderingInfo(item, pa, GetColorTable()));
        }
        /// 
        /// Renders the MetroForm.
        /// 
        /// Form to render.
        /// Rendering event arguments.
        public static void Paint(MetroAppForm form, PaintEventArgs e)
        {
            MetroRenderer renderer = GetRenderer(Renderers.MetroForm);
            renderer.Render(GetRenderingInfo(form, e, GetColorTable()));
        }
        /// 
        /// Renders the MetroForm.
        /// 
        /// Form to render.
        /// Rendering event arguments.
        internal static void Paint(BorderOverlay formOverlay, PaintEventArgs e)
        {
            MetroRenderer renderer = GetRenderer(Renderers.MetroForm);
            renderer.Render(GetRenderingInfo(formOverlay, e, GetColorTable()));
        }
        /// 
        /// Renders the MetroTabItem.
        /// 
        /// Form to render.
        /// Rendering event arguments.
        public static void Paint(MetroTabItem tab, ItemPaintArgs pa)
        {
            MetroRenderer renderer = GetRenderer(Renderers.MetroTabItem);
            renderer.Render(GetRenderingInfo(tab, pa, GetColorTable()));
        }
        /// 
        /// Renders the MetroTabStrip
        /// 
        /// TabStrip to render.
        /// Paint args
        public static void Paint(MetroTabStrip tabStrip, ItemPaintArgs pa)
        {
            MetroRenderer renderer = GetRenderer(Renderers.MetroTabStrip);
            MetroRendererInfo info = GetRenderingInfo(tabStrip, pa, GetColorTable());
            renderer.Render(info);
        }
        /// 
        /// Renders the MetroStatusBar.
        /// 
        /// Status bar to render
        /// Paint args
        public static void Paint(MetroStatusBar bar, ItemPaintArgs pa)
        {
            MetroRenderer renderer = GetRenderer(Renderers.MetroStatusBar);
            renderer.Render(GetRenderingInfo(bar, pa, GetColorTable()));
        }
        /// 
        /// Renders the MetroStatusBar.
        /// 
        /// Status bar to render
        /// Paint args
        public static void Paint(MetroToolbar bar, ItemPaintArgs pa)
        {
            MetroRenderer renderer = GetRenderer(Renderers.MetroToolbar);
            renderer.Render(GetRenderingInfo(bar, pa, GetColorTable()));
        }
        private static MetroRenderer GetRenderer(Renderers renderer)
        {
            return _Renderers[(int)renderer];
        }
        private static MetroRendererInfo _RenderingInfo = new MetroRendererInfo();
        private static MetroRendererInfo GetRenderingInfo(Control control, PaintEventArgs e, MetroColorTable colorTable)
        {
            _RenderingInfo.Control = control;
            _RenderingInfo.PaintEventArgs = e;
            _RenderingInfo.ColorTable = colorTable;
            _RenderingInfo.DefaultFont = control.Font;
            _RenderingInfo.RightToLeft = (control.RightToLeft == RightToLeft.Yes);
            return _RenderingInfo;
        }
        private static MetroRendererInfo GetRenderingInfo(Control control, ItemPaintArgs e, MetroColorTable colorTable)
        {
            _RenderingInfo.Control = control;
            _RenderingInfo.PaintEventArgs = e.PaintEventArgs;
            _RenderingInfo.DefaultFont = e.Font;
            _RenderingInfo.ColorTable = colorTable;
            _RenderingInfo.RightToLeft = e.RightToLeft;
            _RenderingInfo.ItemPaintArgs = e;
            return _RenderingInfo;
        }
        private static MetroRendererInfo GetRenderingInfo(MetroTabStrip control, ItemPaintArgs e, MetroColorTable colorTable)
        {
            _RenderingInfo.Control = control;
            _RenderingInfo.PaintEventArgs = e.PaintEventArgs;
            _RenderingInfo.DefaultFont = e.Font;
            if (e.Font.Bold)
                _RenderingInfo.DefaultPlainFont = new Font(e.Font, FontStyle.Regular);
            _RenderingInfo.ColorTable = colorTable;
            _RenderingInfo.RightToLeft = e.RightToLeft;
            _RenderingInfo.ItemPaintArgs = e;
            return _RenderingInfo;
        }
        private static MetroRendererInfo GetRenderingInfo(object control, ItemPaintArgs e, MetroColorTable colorTable)
        {
            _RenderingInfo.Control = control;
            _RenderingInfo.PaintEventArgs = e.PaintEventArgs;
            _RenderingInfo.DefaultFont = e.Font;
            _RenderingInfo.ColorTable = colorTable;
            _RenderingInfo.RightToLeft = e.RightToLeft;
            _RenderingInfo.ItemPaintArgs = e;
            return _RenderingInfo;
        }
        private static MetroColorTable _ColorTable = null;
        public static MetroColorTable GetColorTable()
        {
            if (_ColorTable == null)
            {
                UpdateColorTable(MetroColorGeneratorParameters.Default);
            }
            return _ColorTable;
        }
        internal static void UpdateColorTable(MetroColorGeneratorParameters colorParams)
        {
            if (StyleManager.IsVisualStudio2012(StyleManager.Style))
                _ColorTable = VisualStudio2012ColorTableInitializer.CreateColorTable(colorParams);
            else if (StyleManager.Style == eStyle.OfficeMobile2014)
                _ColorTable = OfficeMobile2014MetroInitializer.CreateColorTable(colorParams);
            else if (StyleManager.Style == eStyle.Office2016)
                _ColorTable = Office2016MetroInitializer.CreateColorTable(colorParams);
            else
                _ColorTable = MetroColorTableInitializer.CreateColorTable(colorParams);
        }
        
    }
    /// 
    /// Defines class for passing rendering information to renderer.
    /// 
    public class MetroRendererInfo
    {
        /// 
        /// Gets or sets the control to render.
        /// 
        public object Control = null;
        /// 
        /// Gets or sets the paint event arguments to use to render out control.
        /// 
        public PaintEventArgs PaintEventArgs = null;
        /// 
        /// Gets or sets the current color table.
        /// 
        public MetroColorTable ColorTable;
        /// 
        /// Gets or sets default font.
        /// 
        public Font DefaultFont = SystemFonts.DefaultFont;
        /// 
        /// Gets or sets default plain font.
        /// 
        public Font DefaultPlainFont = null;
        /// 
        /// Gets or sets right-to-left setting.
        /// 
        public bool RightToLeft = false;
        /// 
        /// Gets or sets the paint information for items.
        /// 
        public ItemPaintArgs ItemPaintArgs = null;
    }
    /// 
    /// Abstract renderer for rendering Metro-UI controls.
    /// 
    public abstract class MetroRenderer
    {
        
        /// 
        /// Renders the 
        /// 
        /// 
        public abstract void Render(MetroRendererInfo renderingInfo);
    }
    public enum Renderers : int
    {
        MetroForm,
        MetroTabItem,
        MetroTabStrip,
        MetroStatusBar,
        MetroToolbar,
        MetroTileItem
    }
}