/*
 * (C) Copyright 1996-2016 ECMWF.
 *
 * This software is licensed under the terms of the Apache Licence Version 2.0
 * which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
 * In applying this licence, ECMWF does not waive the privileges and immunities
 * granted to it by virtue of its status as an intergovernmental organisation nor
 * does it submit to any jurisdiction.
 */

/*! \file MapGenDecoder.cc
    \brief Implementation of the Template class MapGenDecoder.

    Magics Team - ECMWF 2005

    Started: Mon 12-Dec-2005

    Changes:

*/


#include "MapGenDecoder.h"
#include "CustomisedPoint.h"
#include "MagicsGlobal.h"

using namespace magics;


MapGenDecoder::MapGenDecoder() {}


MapGenDecoder::~MapGenDecoder() {}

/*!
 Class information are given to the output-stream.
*/

void MapGenDecoder::print(ostream& out) const {
    out << "MapGenDecoder[";
    out << "]";
}


void MapGenDecoder::decode() {
    if (!this->empty())
        return;
    try {
        char line[1024];
        ifstream in(path_.c_str());
        float lat, lon;
        int i = 0;
        while (in.good()) {
            in.getline(line, 1024);

            string test(line);

            if (test.empty())
                continue;
            if (strncmp(line, "# -b", 4) == 0)
                if (record_ < 0) {
                    if (this->empty())
                        push_back(new PointsList());
                    this->back()->push_back(new UserPoint(0, 0, 0, true));
                }
                else
                    push_back(new PointsList());
            else {
                sscanf(line, "%f %f", &lon, &lat);
                this->back()->push_back(new UserPoint(lon, lat, i++));
            }
        }

        in.close();
    }
    catch (...) {
        if (MagicsGlobal::strict()) {
            throw;
        }
        MagLog::error() << "MapGen file : cannot open " << path_ << endl;
    }
    MagLog::dev() << "Map gen file--->" << this->size() << endl;
}


void MapGenDecoder::customisedPoints(const std::set<string>&, magics::CustomisedPointsList& out) {
    PointsHandler& list = points();

    list.setToFirst();
    int i = 0;
    while (list.more()) {
        UserPoint point         = list.current();
        CustomisedPoint* cpoint = new CustomisedPoint();
        (*cpoint)["x"]          = point.x();
        (*cpoint)["y"]          = point.y();
        (*cpoint)["value"]      = i++;
        (*cpoint)["x_lower"]    = 0;
        (*cpoint)["y_lower"]    = 0;
        (*cpoint)["x_upper"]    = point.x();
        (*cpoint)["y_upper"]    = point.y();
        out.push_back(cpoint);
        list.advance();
    }
}
