#!/usr/bin/env node

/*

This scripts drops all extended map_style keys in redis and regenerates
the XML caches in all the base ones to target the configured mapnik_version.

Optionally (with --convert) it also re-writes the CartoCSS if needed
to target the configured mapnik_version.

It is recommended to make a backup of the redis database before using
this script.

*/

var path = require('path');

// Reset all styles in the store
var grainstore = require('../node_modules/windshaft/node_modules/grainstore/lib/grainstore');
var mapnik = require('mapnik');
var redis = require('redis');

function usage(me, exitcode) {
  console.log("Usage: " + me + " [--convert] <environment>");
  process.exit(exitcode);
}

var doConvert = false;

var node_path = process.argv.shift(); 
var script_path = process.argv.shift(); 
var me = path.basename(script_path);
var ENV;
var arg;
while ( arg = process.argv.shift() ) {
  if ( arg == '--convert' ) {
    doConvert = true;
  }
  else if ( ! ENV ) {
    ENV = arg;
  }
  else {
    usage(me, 1);
  }
}

if ( ! ENV ) usage(me, 1);

global.environment = require('../config/environments/' + ENV);
var serverOptions = require('../lib/cartodb/server_options'); // _after_ setting global.environment

var MAPNIK_VERSION = global.environment.mapnik_version || mapnik.versions.mapnik;

console.log( (doConvert ? "Converting" : "Resetting" ) + ' all styles to target ' + MAPNIK_VERSION);

var dbnum = 0;

var mml_store = new grainstore.MMLStore(serverOptions.redis, serverOptions.grainstore);

var failures = [];

var client = redis.createClient(serverOptions.redis.port, serverOptions.redis.host);
client.on('connect', function() {
  client.select(dbnum);
  client.keys('map_style|*', function(err, matches) {

    processNext = function() {
      if ( ! matches.length ) process.exit(failures.length);
      var k = matches.shift();

      if ( /map_style\|.*\|.*\|/.test(k) ) {
        // See https://github.com/Vizzuality/Windshaft-cartodb/issues/58
        //console.warn("Key " + k + " is EXTENDED, dropping");
        client.del(k, function(err) {
          if ( err ) console.warn("Error dropping key " + k);
          processNext();
        });
        return;
      } 

      var params = RegExp(/map_style\|(.*)\|(.*)/).exec(k);
      var db = params[1];
      var tab = params[2];
      var out = 'map_style|' + db + '|' + tab + ': ';

      var mml_builder = mml_store.mml_builder({dbname:db, table:tab},
                                              function(err, payload) {

          if ( err ) { console.warn(out + err.message); failures.push(k); processNext(); }
          else {
            mml_builder.resetStyle(function(err, data) {
              if ( err ) { console.warn(out + err.message); failures.push(k); }
              else console.log(out + 'OK' + ( doConvert ? ' (converted)' : '' ));
              processNext();
            }, doConvert);
          }
      });

    };

    processNext();

  });

});
