<?php
/*
 * Copyright (c) 2012, webvariants GbR, http://www.webvariants.de
 *
 * This file is released under the terms of the MIT license. You can find the
 * complete text in the attached LICENSE file or online at:
 *
 * http://www.opensource.org/licenses/mit-license.php
 */

/**
 * CSS-Deployer
 *
 * Diese Klasse kümmert sich um das Ausliefern von CSS-Dateien.
 * Die Dateien zusammengefasst und an den Asset Service weitergereicht.
 * Dort nimmt sich der LessCSS Compiler LessPHP der Sache an.
 *
 * @author Christoph
 * @since  2.0
 */
class WV5_Deployer_CSS extends WV5_Deployer_Base {
	/**
	 * Datei komprimieren
	 *
	 * Diese Methode gibt seit v3.4.1 nur noch den Original-CSS-Code zurück,
	 * da CSSMin teils Mixins zerstört und der Asset-Cache eh im Anschluss selbst
	 * Less ausführen wird.
	 *
	 * @since  1.0
	 * @param  string  $filename  der Dateiname
	 * @param  boolean $debug     irrelevant
	 * @return string             originale CSS Code
	 */
	protected function minify($filename, $debug = false) {
		return file_get_contents($filename);
	}

	/**
	 * Dateien zusammenfügen und komprimieren
	 *
	 * Diese Methode führt die Verarbeitung der Dateien durch und gibt danach
	 * ein Array mit Status-Infos zurück.
	 *
	 * Die Dateien werden alle eingelesen, komprimiert und in einer gebündelten
	 * Datei gespeichert. Die Methode merkt sich die mtime der Dateien, um nicht
	 * bei jedem Aufruf die Dateien erneut komprimieren zu müssen. Das Speichern
	 * dieser Information erfolgt in der Registry.
	 *
	 * Im Ergebnis-Array sind folgende Elemente enthalten:
	 *
	 * - file (string; der Dateiname der generierten Datei)
	 * - mtime (int; Unix-Timestamp der letzten Aktualisierung)
	 * - mtime_hex (string; wie mtime, nur in lower hex)
	 * - hash (string; ein 6-stelliger Hash über die enthaltenen Dateien)
	 *
	 * @param  boolean $debug  wenn true, werden die Namen der Dateien als Kommentare eingefügt
	 *                         (hat keine Auswirkungen, wenn Scaffold aktiviert ist)
	 * @return mixed           ein Array mit den Ergebnisdaten oder false im Fehlerfalle
	 */
	public function create($debug = false) {
		if (empty($this->files)) {
			return false;
		}

		$hash      = substr(md5(implode('|', $this->files)), 0, 6);
		$status    = $this->checkFileStatus($hash);
		$isFresh   = $status['ok'];
		$cacheFile = WV5_Deployment::getCacheFolder().'/compressed_'.$hash.'.less';
		$result    = array(
			'file'      => $cacheFile,
			'mtime'     => $status['mtime'],
			'mtime_hex' => strtolower(dechex($status['mtime'])),
			'hash'      => $hash
		);

		if (!$isFresh || !file_exists($cacheFile)) {
			$compressed  = '@charset "UTF-8";';
			$compressed .= $this->compressFiles($hash, "\n", $debug);
			file_put_contents($cacheFile, $compressed);
		}

		return $result;
	}

	public function getTypeString() {
		return 'less';
	}
}
