<?php

include $basePath . "schemas/schemas.inc.php";

require ($basePath . 'couchdb/settee/src/settee.php');

function createDocumentsDesignDoc() {
    /* "views": {
      "web_server": {
      "map": "function(doc) {\n  emit(doc.web_server, 1);\n}",
      "reduce": "function (key, values, rereduce) {\n    return sum(values);\n}"
      },
      "byAgency": {
      "map": "function(doc) {\n  emit(doc.agencyID, 1);\n}",
      "reduce": "function (key, values, rereduce) {\n    return sum(values);\n}"
      },
      "byURL": {
      "map": "function(doc) {\n  emit(doc.url, doc);\n}"
      },
      "agency": {
      "map": "function(doc) {\n  emit(doc.agencyID, doc);\n}"
      },
      "byWebServer": {
      "map": "function(doc) {\n  emit(doc.web_server, doc);\n}"
      },
      "getValidationRequired": {
      "map": "function(doc) {\nif (doc.mime_type == \"text/html\" \n&& typeof(doc.validation) == \"undefined\") {\n  emit(doc._id, doc._attachments);\n}\n}"
      }
      } */
}

function createAgencyDesignDoc() {
    global $db;
    $obj = new stdClass();
    $obj->_id = "_design/" . urlencode("app");
    $obj->language = "javascript";
    $obj->views->all->map = "function(doc) {   emit(doc._id, doc); };";
    $obj->views->byABN->map = "function(doc) {   emit(doc.abn, doc); };";
    $obj->views->byCanonicalName->map = "function(doc) {  
            if (doc.parentOrg || doc.orgType == 'FMA-DepartmentOfState') {
        emit(doc.name, doc); 
        }
};";
    $obj->views->byDeptStateName->map = "function(doc) {  
            if (doc.orgType == 'FMA-DepartmentOfState') {
        emit(doc.name, doc._id); 
        }
};";
    $obj->views->parentOrgs->map = "function(doc) {
            if (doc.parentOrg) {
        emit(doc._id, doc.parentOrg);
        }
};";
    $obj->views->byName->map = 'function(doc) { 
        if (typeof(doc["status"]) == "undefined" || doc["status"] != "suspended") {
        emit(doc.name, doc._id); 
if (typeof(doc.shortName) != "undefined" && doc.shortName != doc.name) {
       	 emit(doc.shortName, doc._id); 
}
 for (name in doc.otherNames) {
if (doc.otherNames[name] != "" && doc.otherNames[name] != doc.name) {
       	 emit(doc.otherNames[name], doc._id); 
}
        }
 for (name in doc.foiBodies) {
if (doc.foiBodies[name] != "" && doc.foiBodies[name] != doc.name) {
       	 emit(doc.foiBodies[name], doc._id); 
}
        }
        }
};';

    $obj->views->foiEmails->map = "function(doc) {  
        emit(doc._id, doc.foiEmail);
};";

    $obj->views->byLastModified->map = "function(doc) {   emit(doc.metadata.lastModified, doc); }";
    $obj->views->getActive->map = 'function(doc) { if (doc.status == "active") {  emit(doc._id, doc); } };';
    $obj->views->getSuspended->map = 'function(doc) { if (doc.status == "suspended") {  emit(doc._id, doc); } };';
    $obj->views->getScrapeRequired->map = "function(doc) {   

var lastScrape = Date.parse(doc.metadata.lastScraped);

var today = new Date();

if (!lastScrape || lastScrape.getTime() + 1000 != today.getTime()) {
 emit(doc._id, doc); 
}

};";
    $obj->views->showNamesABNs->map = "function(doc) {   emit(doc._id, {name: doc.name, abn: doc.abn}); };";
    $obj->views->getConflicts->map = "function(doc) {
  if (doc._conflicts) {
    emit(null, [doc._rev].concat(doc._conflicts));
  }
}";
    // http://stackoverflow.com/questions/646628/javascript-startswith
    $obj->views->score->map = 'if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

function(doc) {
    count = 0;
    if (doc["status"] != "suspended") {
        for(var propName in doc) {
            if(typeof(doc[propName]) != "undefined" && doc[propName] != "") {
                count++;
            }
        }
        portfolio = doc.parentOrg;
        if (doc.orgType == "FMA-DepartmentOfState") {
            portfolio = doc._id;
        }
        if (doc.orgType == "Court-Commonwealth" || doc.orgType == "FMA-DepartmentOfParliament") {
            portfolio = doc.orgType;
        }
        emit(count+doc._id, {id:doc._id, name: doc.name, score:count, orgType: doc.orgType, portfolio:portfolio});
    }
}';
    $obj->views->scoreHas->map = 'if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}
if(!String.prototype.endsWith){
	String.prototype.endsWith = function(suffix) {
	    return this.indexOf(suffix, this.length - suffix.length) !== -1;
	};
}
function(doc) {
if (typeof(doc["status"]) == "undefined" || doc["status"] != "suspended") {
for(var propName in doc) {
      if(typeof(doc[propName]) != "undefined" && (propName.startsWith("has") || propName.endsWith("URL"))) {
  	emit(propName, 1);
	}
}
  emit("total", 1);
  }
}';
    $obj->views->scoreHas->reduce = 'function (key, values, rereduce) {
    return sum(values);
}';
    $obj->views->fieldNames->map = '
function(doc) {
for(var propName in doc) {
     	emit(propName, doc._id);
	}
  
}';
    $obj->views->fieldNames->reduce = 'function (key, values, rereduce) {
    return values.length;
}';
    // allow safe updates (even if slightly slower due to extra: rev-detection check).
    return $db->save($obj, true);
}

if (php_uname('n') == "vanille") {
    $serverAddr = 'http://192.168.178.21:5984/';
} else
if (php_uname('n') == "KYUUBEY") {

    $serverAddr = 'http://127.0.0.1:5984/';
} else {
    $serverAddr = 'http://127.0.0.1:5984/';
}
$server = new SetteeServer($serverAddr);

function setteErrorHandler($e) {
    echo $e->getMessage() . "<br>" . PHP_EOL;
}

