<?php
/*******************************************************************************
 * Copyright (c) 2007-2008 Eclipse Foundation and others.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Antoine Toulme, Intalio Inc. bug 248845: Refactoring generate1.php into different files with a functional approach
*******************************************************************************/

require_once(dirname(__FILE__) . "/project.class.php"); 
require_once(dirname(__FILE__) . "/../file/file.class.php"); 

require_once(dirname(__FILE__) . "/backend_functions.php");

// constants
define("LEGAL_FILES_DIR", dirname(__FILE__) . "/../export/source_files_for_generate/");

class Fragment {
	public $files;
	public $plugin_id;
	public $language;
	public $train;
	public $filesize;
	
	/*
	 * Default constructor
	 */
	function Fragment($plugin_id, $files, $language, $train) {
		$this->plugin_id = $plugin_id;
		$this->files = $files;
		$this->language = $language;
		$this->train = $train;
	}
	
	
	static function select($language, $train) {
		/*
		 * Determine which plug-ins need to be in this language pack.
		 */
		if (strcmp($language->iso, "en_AA") == 0) {
			$sql = "SELECT DISTINCT f.project_id, f.version, f.file_id, f.name, f.plugin_id
				FROM files AS f
				INNER JOIN strings AS s ON f.file_id = s.file_id
				INNER JOIN release_train_projects as v ON (f.project_id = v.project_id AND f.version = v.version)
				WHERE f.is_active
				AND v.train_id = '" . $train->id . "'";
		} else {
			$sql = "SELECT DISTINCT f.project_id, f.version, f.file_id, f.name, f.plugin_id
				FROM files AS f
				INNER JOIN strings AS s ON f.file_id = s.file_id
				INNER JOIN translations AS t ON (s.string_id = t.string_id AND t.is_active)
				INNER JOIN release_train_projects as v ON (f.project_id = v.project_id AND f.version = v.version)
				WHERE t.language_id = " . $language->id . "
				AND f.is_active
				AND v.train_id = '" . $train->id . "'";
		}
		$file_result = mysqli_query($dbh, $sql);
		$plugins = array();
		while (($file_row = mysqli_fetch_assoc($file_result)) != null) {
			$f = new File();
			$f->file_id = $file_row['file_id'];
			$f->name = $file_row['name'];
			$f->plugin_id = $file_row['plugin_id'];
			$f->project_id = $file_row['project_id'];
			$f->version = $file_row['version'];
			$plugins[$file_row['plugin_id']][] = $f;
		}
		$fragments = array();
		foreach($plugins as $plugin_id => $files) {
			$fragment = new Fragment($plugin_id, $files, $language, $train);
			$fragments[] = $fragment;
		}
		
		return $fragments;
	}
	
	/*
	 * Generates a manifest file in its META-INF folder in the $fragment_root directory.
	 */
	function generate_manifest($fragment_root) {
		$fragment_id = $this->plugin_id .".nl._". $this->language->iso;
		exec("mkdir $fragment_root/META-INF" );
		$outp = fopen("$fragment_root/META-INF/MANIFEST.MF", "w");
		fwrite($outp, "Manifest-Version: 1.0\n");
		fwrite($outp, "Bundle-Name: ".$this->plugin_id." ".$this->language->name." NLS Support\n");
		fwrite($outp, "Bundle-SymbolicName: $fragment_id ;singleton=true\n");
		fwrite($outp, "Bundle-Version: ". $this->train->version ."_". $this->train->timestamp . "\n");
		fwrite($outp, "Bundle-Vendor: Eclipse.org\n");
		fwrite($outp, "Fragment-Host: $this->plugin_id\n");
		fclose($outp);
	}
	
	function generateFragment($fragment_root, $output_dir) {
		if (file_exists($fragment_root)) {
			exec("rm -rf $fragment_root; mkdir $fragment_root");
		} else {
			exec("mkdir -p $fragment_root");
		}
		exec("cp ". LEGAL_FILES_DIR. "about.html $fragment_root");
		$this->generate_manifest($fragment_root);
		foreach($this->files as $file) {
			$fullpath = $fragment_root . $file->appendLangCode($this->language->iso);
			$this->generate_properties_file($fullpath, $file->strings4PropertiesFile($this->language));
		}
		$this->jar($fragment_root, $output_dir);
	}
	
	/*
     * Outputs a properties file at the filepath location, creating the needed folders if need be.
     * The hash passed as the second parameter is supposed to contain a mapping from key to translation.
     *
     */
	function generate_properties_file($filepath, $keys2values) {
		preg_match("/^((.*)\/)?(.+?)$/", $filepath, $matches);
		exec("mkdir -p \"" . $matches[1] . "\"");
		$outp = fopen($filepath, "w");
		fwrite($outp, "# Copyright by many contributors; see http://babel.eclipse.org/\n");
		foreach ($keys2values as $key => $trans) {
  			fwrite($outp, "\n" . $key . "=");
			# echo "${leader1S}${leaderS}${leaderS}${leaderS}" . $key . "=";
			if ($trans) {
				# json_encode returns the string with quotes fore and aft.  Need to strip them.
				# $tr_string = preg_replace('/^"(.*)"$/', '${1}', json_encode($trans));
				# $tr_string = str_replace('\\\\', '\\', $tr_string);
				$tr_string = toescapedunicode($trans);
				fwrite($outp, $tr_string);
				# echo $trans;
			}
			fwrite($outp, "\n");
		}
		fclose($outp);
	}
	
	
	function jar($dir, $output_dir) {
		$jar_name = $output_dir . "/" . $this->fragment_filename();
		internalJar($dir, $jar_name);
		$this->filesize = filesize($jar_name);
	}
	
	function fragment_filename() {
		$fragment_filename = $this->fragment_id() ."_". $this->train->version ."_". $this->train->timestamp .".jar";
		return $fragment_filename;
	}
	
	function fragment_id() {
		return $this->plugin_id .".nl_". $this->language->iso;
	}
	
	function associated_projects() {
		$projects = array();
		foreach($this->files as $file) {
			$projects[$file->project_id] = new Project($file->project_id, $file->version);
		}	
		return array_values($projects);
	}
}