<?php
/*******************************************************************************
 * Copyright (c) 2007-2019 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
 *    Denis Roy (Eclipse Foundation) - Bug 550544 - Babel server is not ready for PHP 7
*******************************************************************************/

require_once(dirname(__FILE__) . "/fragment.class.php"); 

class Feature {
	public $language;
	public $feature_id;
	public $train;
	public $fragments;
	public $output_dir;
	public $tmp_dir;
	
	/**
	 * default constructor
	 */ 
	function Feature($language, $train, $tmp_dir, $output_dir, $fragments = null) {
		$this->language = $language;
		$this->train = $train;
		if (!$fragments) {
			$fragments = Fragment::select($language, $train);
		}
		$this->fragments = $fragments;
		$this->output_dir = $output_dir;
		$this->tmp_dir = $tmp_dir;
		$projects = $this->associated_projects();
		if (count($projects) == 1) {
			$this->feature_id = "org.eclipse.babel.nls_". $projects[0]->id ."_". $language->iso;
		} else {
			$this->feature_id = "org.eclipse.babel.nls_".$language->iso;
		}
	}
	
	/**
	 * Returns an integer between 0 and 100 representing the percent completion 
	 * of the translation of this feature in this language.
	 */
	function pct_complete() {
	    global $dbh;
		if (strcmp($this->language->iso, "en_AA") == 0) {
			return 100;
		}
		foreach($this->associated_projects() as $project) {
			$sql = "SELECT pct_complete
				FROM project_progress
				WHERE project_id = \"". $project->id ."\"
					AND version = \"". $project->version ."\"
					AND language_id = " . $this->language->id;
			$project_pct_complete_result = mysqli_query($dbh, $sql);
			if ($project_pct_complete_result and 
				(($project_pct_complete = mysqli_fetch_assoc($project_pct_complete_result)) != null)) {
				if (!isSet($pct)) {
					$pct = $project_pct_complete['pct_complete'];
				} else {
					// there might be some better way to do the average.
					$pct = ($pct + $project_pct_complete['pct_complete'])/2;
				}
			} else {
				// for now we assume the project is not translated at all. 
				// We should maybe return some fixed value equivalent to "unknown"
				if (!isSet($pct)) {
					$pct = 0;
				} else {
					$pct = $pct/2;
				}
			}
		}
		
		if (!isSet($pct)) {
			return 0;
		}
		return $pct;
	}
	
	/*
	 * Copies all the necessary legal files in the destination folder specified.
	 */
	function copyLegalFiles($dir) {
		exec("cp ". LEGAL_FILES_DIR. "about.html $dir");
		exec("cp ". LEGAL_FILES_DIR. "eclipse_update_120.jpg $dir");
		exec("cp ". LEGAL_FILES_DIR. "epl-2.0.html $dir");
		exec("cp ". LEGAL_FILES_DIR. "feature.properties $dir");
		exec("cp ". LEGAL_FILES_DIR. "license.html $dir");
	}
	
	/**
	 * Generates the fragments and the feature.
	 */
	function generateAll() {
		$this->cleanupOutput();
		foreach($this->fragments as $fragment) {
			$this->generateFragment($fragment);
		}
		$this->generate();
	}
	
	/*
	 * Cleans the $output_dir/eclipse/features/ and $output_dir/eclipse/plugins folders.
	 */
	function cleanupOutput($output_dir = null, $create_eclipse_structure = true) {
		if (!$output_dir) {
			$output_dir = $this->output_dir;
		}
		if ($create_eclipse_structure) {
			$instructions = array("rm -Rf $output_dir/eclipse/features/", 
					"rm -Rf $output_dir/eclipse/plugins/",
					"mkdir -p $output_dir/eclipse/features/",
					"mkdir -p $output_dir/eclipse/plugins/");
		} else {
			$instructions = array("rm -Rf $output_dir/*");
		}
		foreach ($instructions as $cmd) {
			$retval = system($cmd, $return_code);
			if ($return_code != 0) {
				echo "### ERROR during the execution of: $cmd\n";
				echo $retval . "\n";
			}
		}
	}

	/**
	 * Copies the legal files and generates the feature.xml file in the feature folder.
	 */
	function generate($dir = null) {
		if (!$dir) {
			$dir = $this->output_dir."/eclipse/features/".$this->feature_id;
		}
		exec("mkdir -p $dir");
		$this->copyLegalFiles($dir);
		$this->generateFeatureXml($dir);
	}
	
	/**
	 * Generates a fragment.
	 */
	function generateFragment($fragment, $tmp_dir = null, $output_dir = null) {
		if (!$tmp_dir) {
			$tmp_dir = $this->tmp_dir;
		}
		if (!$output_dir) {
			$output_dir = $this->output_dir;
		}
		$fragment->generateFragment($tmp_dir, "$output_dir/eclipse/plugins/");
	}

	/*
	 * Generates the feature.xml file in the designated folder.
	 */
	function generateFeatureXml($dir) {
		$project_toStr = "";
		$projects_string_array = array();
		foreach($this->associated_projects() as $proj) {
			$projects_string_array[] = $proj->id;
		}
		$project_toStr = join(", ", $projects_string_array);
		$outp = fopen("$dir/feature.xml", "w");
			fwrite($outp, "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>" .
				"\n<feature id=\"" . $this->feature_id . "\"" .
				"\n\tlabel=\"Babel Language Pack for $project_toStr in " . $this->language->name . " (" . $this->pct_complete() . ")\"" .
				"\n\timage=\"eclipse_update_120.jpg\"" .
				"\n\tprovider-name=\"%providerName\"" .
				"\n\tversion=\"" . $this->train->version . "_" . $this->train->timestamp. "\">" .
				"\n\t<copyright>\n\t\t%copyright\n\t</copyright>" .
				"\n\t<license url=\"%licenseURL\">\n\t\t%license\n\t</license>" .
				"\n\t<description>Babel Language Pack for $project_toStr in " . $this->language->name . "</description>" );
				
		foreach ($this->fragments as $fragment) {
			fwrite($outp, "\n\t<plugin fragment=\"true\" id=\"" . $fragment->fragment_id(). "\" unpack=\"false\" " .
				"version=\"". $this->train->version. "_" . $this->train->timestamp . "\" download-size=\"" . $fragment->filesize. "\" install-size=\"" . $fragment->filesize . "\" />");
		}
		fwrite($outp, "\n</feature>");
		fclose($outp);
	}
	
	/**
	 * Returns the projects associated with this feature.
	 */
	function associated_projects() {
		$projects = array();
		foreach($this->fragments as $fragment) {
			foreach($fragment->associated_projects() as $proj) {
				$projects[$proj->id . "_" . $proj->version] = $proj;
			}
		}
		return array_values($projects);
	}
	
	/*
	 * jars the content of a directory $dir, places it in a file named $output
	 */
	function internalJar($dir, $output) {
		$cmd = "cd $dir; jar cfM $output .";
		$retval = system($cmd, $return_code);
		if ($return_code != 0) {
			echo "### ERROR during the execution of: $cmd\n";
			echo "$retval\n";
		}
	}
	
	/**
	 * Jars the feature into an output folder.
	 * This function is only used when defining features for a site, not for a normal feature creation
	 * Once the feature is jarred, its folder is removed.
	 */ 
	function jar($dir = null, $output_dir = null) {
		if (!$dir) {
			$dir = $this->output_dir ."/eclipse/features/";
		}
		if (!$output_dir) {
			$output_dir = $this->output_dir;
		}
		$feature_filename = $this->filename() . ".jar";
		$this->internalJar($dir, "$output_dir/eclipse/features/$feature_filename");
		// delete the folder of the feature
		system("rm -Rf \"$output_dir/eclipse/features/". $this->feature_id . "\"");
	}
	
	/*
	 * Returns the file name of the feature as guessed from the feature_id
	 * and the train information.
	 */
	function filename() {
		return $this->feature_id ."_". $this->train->version ."_". $this->train->timestamp;
	}
	
	/**
	 * Zips the feature as a zip to a destination folder.
	 */
	function zip($destination, $output_dir = null) {
		if (!$output_dir) {
			$output_dir = $this->output_dir;
		}
		$filename = $this->filename() . ".zip";
		$instructions = array(
						"cd $output_dir ; zip -r -q $filename eclipse", 
						"cd $output_dir ; mv $filename $destination");
		
		foreach ($instructions as $cmd) {
			$retval = system($cmd, $return_code);
			if ($return_code != 0) {
				echo "### ERROR during the execution of: $cmd";
				echo "\n$return_code $retval";
			}
		}
		return "$destination/$filename";
	}
	
	// Following functions help dealing with CSV files.
	
	/**
	 * Zips the feature as a zip to a destination folder.
	 */
	function zipAsCSV($destination, $output_dir = null) {
		if (!$output_dir) {
			$output_dir = $this->output_dir;
		}
		$filename = $this->filename() . ".zip";
		$instructions = array(
						"zip -r -q $filename $output_dir/* -d $output_dir/$filename",
						"mkdir -p $destination", 
						"cd $output_dir ; mv $filename $destination");
		
		foreach ($instructions as $cmd) {
			$retval = system($cmd, $return_code);
			if ($return_code != 0) {
				echo "### ERROR during the execution of: $cmd";
				echo "\n$return_code $retval";
			}
		}
		return "$destination/$filename";
	}
	
	function generateAsCSV() {
	    global $dbh;
		$this->cleanupOutput(null, false);
		$filename = $this->filename() . ".csv";
		$language = $this->language->id;
		$train = $this->train->id;
		$sql = <<<SQL
			SELECT s.name, s.value, s.string_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 s.non_translatable <> 1
			AND v.train_id = '$train'
SQL;
		$result = mysqli_query($dbh, $sql);
		$f = fopen("$this->output_dir/" . $this->filename() . ".csv", "w");
		while (($row = mysqli_fetch_assoc($result)) != null) {
		    $value_row = mysqli_fetch_assoc(mysqli_query($dbh, "SELECT value from translations where string_id = " . $row['string_id'] . " and language_id = " . $language));
			$value = '';
			if ($value_row != null) {
				$value = $value_row['value'];
            }
            fputcsv($f, array($row['name'], $row['value'], $value));
		}
		fclose($f);
	}
}