﻿using System;
using System.Collections.Generic;
using System.IO;
//using System.Linq;
using System.Text;
using OSGeo.OGR;

namespace OGRTest
{
    public class OGRTest
    {
        public class TigerFeatureDefn
        {
            public string FeatureName;
            public string FeatureId;

            public TigerFeatureDefn(string name, string id)
            {
                this.FeatureName = name;
                this.FeatureId = id;
            }
        }

        private List<TigerFeatureDefn> _featureDefns = new List<TigerFeatureDefn>();

        public OGRTest()
        {
            _featureDefns.Add(new TigerFeatureDefn("Interstates", "A1"));
            _featureDefns.Add(new TigerFeatureDefn("Highways", "A2"));
            _featureDefns.Add(new TigerFeatureDefn("MajorRoads", "A3"));
            _featureDefns.Add(new TigerFeatureDefn("MinorRoads", "A4"));
            _featureDefns.Add(new TigerFeatureDefn("UnimprovedRoad", "A5"));
            _featureDefns.Add(new TigerFeatureDefn("RailroadMainLine", "B1"));
            _featureDefns.Add(new TigerFeatureDefn("RailroadSpur", "B2"));
            _featureDefns.Add(new TigerFeatureDefn("RailroadYard", "B3"));
            _featureDefns.Add(new TigerFeatureDefn("Stream", "H1"));
            _featureDefns.Add(new TigerFeatureDefn("ManMadeStream", "H2"));
        }

        public void Start(string fileName)
        {
            // Register OGR
            Ogr.RegisterAll();

            // Get ESRI Shapefile Driver
            Driver drv = Ogr.GetDriverByName("ESRI Shapefile");
            if (drv == null)
            {
                Console.WriteLine("Can't get driver.");
                return;
            }

            // TODO: drv.name is still unsafe with lazy initialization (Bug 1339)
            // Console.WriteLine("Using driver " + drv.name);

            foreach (TigerFeatureDefn defn in _featureDefns)
            {
                System.Console.WriteLine("Generating {0}", defn.FeatureName);
                AddFeature(drv, defn.FeatureName, defn.FeatureId);
            }
        }

        private void AddFeature(Driver drv, string target, string featureType)
        {
            // Create datasource
            DataSource ds = drv.CreateDataSource(target, new string[] { });
            if (drv == null)
            {
                Console.WriteLine("Can't create the datasource.");
                return;
            }

            // Create layer
            Layer layer = ds.CreateLayer(target, null, wkbGeometryType.wkbLineString, new string[] { });
            if (layer == null)
            {
                Console.WriteLine("Layer creation failed.");
                return;
            }

            // Add features
            for (int i = 0; i < 5000; i++)
            {
                int points = 0;
                StringBuilder sb = new StringBuilder();
                sb.Append("LINESTRING(10.0 20.0,30.0 50.0)");
                points = 2;

                Feature feature = new Feature(layer.GetLayerDefn());

                //Geometry geom = Geometry.CreateFromWkt(sb.ToString());

                //if (feature.SetGeometry(geom) != 0)
                //{
                //    Console.WriteLine("Failed add geometry to the feature");
                //    return;
                //}

                //if (layer.CreateFeature(feature) != 0)
                //{
                //    Console.WriteLine("Failed to create feature in shapefile");
                //    return;
                //}
            }
        }
    }
}

