using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using DotNetHarness.Resource;
using DotNetHarness.Rendering;
using DotNetHarness.Feature;
using DotNetHarness.Tile;

namespace DotNetHarness
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void lstApiCategories_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (lstApiCategories.SelectedItem == null)
                return;

            lstOperations.DataSource = GetApiOperationsForCategory(lstApiCategories.SelectedItem.ToString());
        }

        private string[] GetApiOperationsForCategory(string category)
        {
            string[] ops = new string[0];
            switch (category)
            {
                case "Resource":
                    ops = new string[] { "ApplyResourcePackage", "EnumerateResources", "GetResourceContent", "SetResource", "SetResourceData", "EnumerateResourceData", "GetResourceData", "ResourceExists", "DeleteResource", "CopyResource", "MoveResource", "DeleteResourceData", "RenameResourceData", "EnumerateUnmanagedData" };
                    break;
                case "Feature":
                    ops = new string[] { "CreateFeatureSource", "RegisterProvider", "SelectFeatures", "SelectAggregates", "GetFeatureProviders", "GetConnectPropertyValues", "GetCapabilities", "DescribeSchema", "GetSchemas", "GetClasses", "GetSpatialContexts", "ExecuteSql", "ExecuteSqlNonQuery", "EnumerateDataStores", "TestConnection", "GetSchemaMapping" };
                    break;
                case "Rendering":
                    ops = new string[] { "RenderMap", "RenderDynamicOverlay", "RenderTile" };
                    break;
                case "Tile":
                    ops = new string[] { "GetTile", "ClearTileCache" };
                    break;
            }
            return ops;
        }

        private void lstOperations_SelectedIndexChanged(object sender, EventArgs e)
        {
            string cat = lstApiCategories.SelectedItem.ToString();
            string op = lstOperations.SelectedItem.ToString();

            Control c = GetControlForOperation(cat, op);
            splitContainer1.Panel2.Controls.Clear();
            c.Dock = DockStyle.Fill;
            splitContainer1.Panel2.Controls.Add(c);
        }

        private Control GetControlForOperation(string cat, string op)
        {
            if (cat == "Resource")
            {
                switch (op)
                {
                    case "ApplyResourcePackage":
                        return new ApplyResourcePackageControl();
                    case "ResourceExists":
                        return new ResourceExistsControl();
                    case "EnumerateResourceData":
                        return new EnumerateResourceDataControl();
                    case "EnumerateResources":
                        return new EnumerateResourcesControl();
                    case "GetResourceContent":
                        return new GetResourceContentControl();
                    case "GetResourceContents":
                        return new MultiGetResourceContentControl();
                    case "SetResource":
                        return new SetResourceControl();
                    case "SetResourceData":
                        return new SetResourceDataControl();
                    case "GetResourceData":
                        return new GetResourceDataControl();
                    case "CopyResource":
                        return new CopyResourceControl();
                    case "MoveResource":
                        return new MoveResourceControl();
                    case "DeleteResource":
                        return new DeleteResourceControl();
                    case "EnumerateUnmanagedData":
                        return new EnumerateUnmanagedDataControl();
                }
            }
            else if (cat == "Feature")
            {
                switch (op)
                { 
                    case "CreateFeatureSource":
                        return new CreateFeatureSourceCtrl();
                    case "RegisterProvider":
                        return new RegisterProviderCtrl();
                    case "SelectFeatures":
                        return new SelectFeaturesControl();
                    case "SelectAggregates":
                        return new SelectAggregatesControl();
                    case "GetSpatialContexts":
                        return new GetSpatialContextsControl();
                    case "GetFeatureProviders":
                        return new GetFeatureProvidersControl();
                    case "GetCapabilities":
                        return new GetCapabilitiesControl();
                    case "GetSchemaMapping":
                        return new GetSchemaMappingCtrl();
                    case "GetSchemas":
                        return new GetSchemasControl();
                    case "GetClasses":
                        return new GetClassesControl();
                    case "ExecuteSql":
                        return new ExecuteSqlControl();
                    case "ExecuteSqlNonQuery":
                        return new ExecuteSqlNonQueryControl();
                    case "TestConnection":
                        return new TestConnectionControl();
                    case "EnumerateDataStores":
                        return new EnumerateDataStoresControl();
                }
            }
            else if (cat == "Rendering")
            {
                switch (op)
                { 
                    case "RenderMap":
                        return new RenderMapControl();
                    case "RenderDynamicOverlay":
                        return new RenderDynamicOverlayControl();
                    case "RenderTile":
                        return new RenderTileControl();
                }
            }
            else if (cat == "Tile")
            {
                switch (op)
                {
                    case "GetTile":
                        return new GetTileControl();
                }
            }

            return new Control();
        }
    }
}