#include "rapidjson/document.h"
#include "rapidjson/prettywriter.h"
#include <delaunator.hpp>
#include "../../test/test_utils.hpp"
#include <cstdio>
#include <fstream>
#include <vector>
#include <initializer_list>
// #include "prettyprint.hpp"
#include <iostream>

std::string serialize_to_json(delaunator::Delaunator const& delaunator) {
    rapidjson::StringBuffer sb;
    rapidjson::PrettyWriter<rapidjson::StringBuffer> writer(sb);
    writer.StartObject();
        writer.String("type"); writer.String("FeatureCollection");
        writer.String("crs");
            writer.StartObject();
                writer.String("type"); writer.String("name");
                writer.String("properties");
                    writer.StartObject();
                        writer.String("name"); writer.String("urn:ogc:def:crs:EPSG::900913");
                    writer.EndObject();
            writer.EndObject();
        writer.String("features");
            writer.StartArray();
                for(std::size_t i = 0; i < delaunator.triangles.size(); i+=3) {
                    writer.StartObject();
                        writer.String("type"); writer.String("Feature");
                        writer.String("properties"); writer.StartObject(); writer.EndObject();
                        writer.String("geometry");
                            writer.StartObject();
                                writer.String("type"); writer.String("Polygon");
                                writer.String("coordinates");
                                    writer.StartArray();
                                    writer.StartArray();
                                        writer.StartArray();
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i]]);
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i] + 1]);
                                        writer.EndArray();
                                        writer.StartArray();
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i + 1]]);
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i + 1] + 1]);
                                        writer.EndArray();
                                        writer.StartArray();
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i + 2]]);
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i + 2] + 1]);
                                        writer.EndArray();
                                        writer.StartArray();
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i]]);
                                            writer.Double(delaunator.coords[2 * delaunator.triangles[i] + 1]);
                                        writer.EndArray();
                                    writer.EndArray();
                                    writer.EndArray();
                            writer.EndObject();
                    writer.EndObject();
                }
            writer.EndArray();
    writer.EndObject();
    return std::string(sb.GetString());
}

int main(int, char* argv[]) {
    const char* filename = argv[1];
    const char* output = argv[2];
    std::string json = test_utils::read_file(filename);
    std::vector<double> coords = test_utils::get_geo_json_points(json);
    delaunator::Delaunator delaunator(coords);
    const char* out_json = serialize_to_json(delaunator).c_str();

    if (output) {
        printf("Writing to file %s", output);
        std::ofstream stream;
        stream.open(output);
        stream << out_json;
        stream.close();
    } else {
        std::puts(out_json);
    }
    return 0;
}
