using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using OSGeo.MapGuide.ObjectModels.LayerDefinition;
using OSGeo.MapGuide.ObjectModels.FeatureSource;
using OSGeo.MapGuide.MaestroAPI;
using OSGeo.MapGuide.MaestroAPI.Schema;
using Maestro.Editors.WatermarkDefinition;

namespace Maestro.Editors.LayerDefinition
{
    /// <summary>
    /// Editor control for Vector Layer Definitions
    /// </summary>
    public partial class VectorLayerEditorCtrl : EditorBase
    {
        /// <summary>
        /// Initializes a new instance of the <see cref="VectorLayerEditorCtrl"/> class.
        /// </summary>
        public VectorLayerEditorCtrl()
        {
            InitializeComponent();
            resSettings.FeatureClassChanged += new EventHandler(OnFeatureClassChanged);
            layerStyles.Owner = this;
        }

        void OnFeatureClassChanged(object sender, EventArgs e)
        {
            layerProperties.PopulatePropertyList();
        }

        private IEditorService _edsvc;
        private IVectorLayerDefinition _vl;

        internal IEditorService EditorService { get { return _edsvc; } }

        /// <summary>
        /// Sets the initial state of this editor and sets up any databinding
        /// within such that user interface changes will propagate back to the
        /// model.
        /// </summary>
        /// <param name="service"></param>
        public override void Bind(IEditorService service)
        {
            _edsvc = service;
            _vl = (IVectorLayerDefinition)((ILayerDefinition)service.GetEditedResource()).SubLayer;

            service.RegisterCustomNotifier(this);
            resSettings.Bind(service);
            layerProperties.Bind(service);
            layerStyles.Bind(service);

            //Add watermark component if supported
            var sl2 = _vl as ISubLayerDefinition2;
            if (sl2 != null)
            {
                this.Controls.Remove(resSettings);
                this.Controls.Remove(layerProperties);
                this.Controls.Remove(layerStyles);

                var wm = new WatermarkCollectionEditorCtrl(service.ResourceService, sl2);
                wm.Dock = DockStyle.Top;

                this.Controls.Add(wm);
                this.Controls.Add(layerStyles);
                this.Controls.Add(layerProperties);
                this.Controls.Add(resSettings);
            }
        }

        /// <summary>
        /// Raises the <see cref="E:System.Windows.Forms.UserControl.Load"/> event.
        /// </summary>
        /// <param name="e">An <see cref="T:System.EventArgs"/> that contains the event data.</param>
        protected override void OnLoad(EventArgs e)
        {
            //HACK: Maybe the controls were still in the process of databinding which
            //is why the feature class would still be empty. Nevertheless, it will be
            //set at this point so it's safe to call here.
            layerProperties.PopulatePropertyList();
        }

        internal IEditorService Editor
        {
            get { return _edsvc; }
        }

        internal string EditExpression(string expr)
        {
            var fs = (IFeatureSource)_edsvc.ResourceService.GetResource(_vl.ResourceId);

            return _edsvc.EditExpression(expr, fs.GetClass(_vl.FeatureName), fs.Provider, _vl.ResourceId);
        }

        internal void UpdateDisplay()
        {
            
        }

        internal void HasChanged()
        {
            _edsvc.HasChanged();
        }

        internal void SetLastException(Exception ex)
        {
            
        }

        internal void FlagDirty() { OnResourceChanged(); }

        internal string GetFdoProvider()
        {
            var fs = (IFeatureSource)_edsvc.ResourceService.GetResource(_vl.ResourceId);
            return fs.Provider;
        }

        internal ClassDefinition SelectedClass
        {
            get { return resSettings.GetSelectedClass(); }
        }

        internal string FeatureSourceId
        {
            get { return resSettings.FeatureSourceID; }
        }
    }
}