<?php

$n = 0;
error_reporting(E_ALL);
$thisScript = $argv[$n++];
$rulesFile = $argv[$n++];
$baseDirectory = $argv[$n++];
$targetDirectory = $argv[$n++];
$mainDirectory = $argv[$n++];
require_once '../../configs/main.config.local.php';
echo "Using megalib from " . ABSPATH_MEGALIB . "\n";
require_once ABSPATH_MEGALIB . 'SourceCode.php';
require_once ABSPATH_MEGALIB . 'Structures.php';
require_once ABSPATH_MEGALIB . 'FileSystemMatcher.php';
echo "Loading the rules from {$rulesFile}\n";
$json = file_get_contents($rulesFile);
if ($json === false) {
    die("cannot open {$rulesFile}");
}
$rules = jsonDecodeAsMap($json);
echo "They are " . count($rules) . " rules\n";
$matcher = new RuleBasedFileSystemPatternMatcher($rules);
$matchedFilesGrouping = array('languages' => array('select' => array('locator', 'geshiLanguage'), 'groupedBy' => 'language'), 'technologies' => array('select' => array('role'), 'groupedBy' => 'technology'));
$sourceDir = addToPath($baseDirectory, $mainDirectory);
$resultDir = addToPath(addToPath($targetDirectory, $mainDirectory), '.rulesMatches');
echo "Match directory {$sourceDir}. The results are generated in {$resultDir}\n";
$matcher->generate($sourceDir, $resultDir, $matchedFilesGrouping, array('language', 'technology'));
echo "done";
$sourceDirectoryScanningMethod = $argv[$n++];
echo "Starting {$thisScript} {$baseDirectory} {$targetBaseDirectory} {$mainDirectory} {$sourceDirectoryMatchingRules} {$sourceDirectoryScanningMethod}\n";
require_once '../../configs/main.config.local.php';
echo "Using megalib from " . ABSPATH_MEGALIB;
require_once ABSPATH_MEGALIB . 'Files.php';
require_once ABSPATH_MEGALIB . 'SourceCode.php';
require_once ABSPATH_MEGALIB . 'SourceFileSystem.php';
require_once ABSPATH_MEGALIB . 'FileSystemMatcher.php';
ini_set('memory_limit', '80182M');
echo "WARNING: this script is eager in term of memory.\n";
echo "         Because of php poor memory managment, out of memory errors might occur.\n";
echo "         In this case change the value of sourceDirectoryScanningMethod in Makefile.var to 'perSubDirectories' \n";
echo "";
echo "sourceDirectoryScanningMethod={$sourceDirectoryScanningMethod}\n";
echo "sourceDirectoryMatchingRules={$sourceDirectoryMatchingRules}\n";
$matcher = new RuleBasedFileSystemPatternMatcher($sourceDirectoryMatchingRules);
echo $matcher->getRulesNumber() . " rules where found.";
echo "In this module rules are particularily important to define the 'elementKind' and 'geshiLanguage' properties ";
if ($sourceDirectoryScanningMethod === 'full') {
    echo "Scanning the whole directory {$mainDirectory} at once.\n";
    echo "this has the benefit of generating top level summary in {$targetBaseDirectory}\n";
    $srcdir = new SourceTopDirectory($baseDirectory, $mainDirectory, array(), $matcher);
    echo "generating the result in {$targetBaseDirectory}\n";
    $srcdir->generate($targetBaseDirectory);
} else {
    $subdirectories = listFileNames(addToPath($baseDirectory, $mainDirectory), 'dir');
    echo "Scanning all " . count($subdirectories) . " subdirectories one by one.\n";
    foreach ($subdirectories as $subdirectory) {
        $directoryToScan = addToPath($mainDirectory, basename($subdirectory));
        echo "\n\n====== scanning subdirectory {$directoryToScan} ================\n";
        $srcdir = new SourceTopDirectory($baseDirectory, $directoryToScan, array(), $matcher);