<?php

/**
 * ownCloud - Documents App
 *
 * @author Victor Dubiniuk
 * @copyright 2013 Victor Dubiniuk victor.dubiniuk@gmail.com
 *
 * This file is licensed under the Affero General Public License version 3 or
 * later.
 */

namespace OCA\Documents;

class Helper {

	const APP_ID = 'documents';

	public static function getNewFileName($view, $path, $prepend = ' '){
		$fileNum = 1;

		while ($view->file_exists($path)){
			$fileNum += 1;
			$path = preg_replace('/(\.odt|' . $prepend . '\(\d+\)\.odt)$/', $prepend . '(' . $fileNum . ').odt', $path);
		};

		return $path;
	}
	
	public static function getArrayValueByKey($array, $key, $default=''){
		if (array_key_exists($key, $array)){
			return $array[$key];
		}
		return $default;
	}

	public static function isVersionsEnabled(){
		return \OCP\App::isEnabled('files_versions');
	}

	public static function getRandomColor(){
		$str = dechex(floor(rand(0, 16777215)));
		return '#' . str_pad($str, 6, "0", STR_PAD_LEFT);
	}

	public static function getMemberColor($name){
		$hash = md5($name);
		$maxRange = hexdec('ffffffffffffffffffffffffffffffff');
		$hue = hexdec($hash) / $maxRange * 256;
		return '#' . self::convertHSLToRGB($hue, 90, 60);
	}

	public static function debugLog($message){
		self::log($message, \OCP\Util::DEBUG);
	}

	public static function warnLog($message){
		self::log($message, \OCP\Util::WARN);
	}

	public static function errorLog($message){
		self::log($message, \OCP\Util::ERROR);
	}

	public static function log($message, $level){
		\OCP\Util::writeLog(self::APP_ID, $message, $level);
	}

	protected static function convertHSLToRGB($iH, $iS, $iV){
		if ($iH < 0){
			$iH = 0;   // Hue:
		}
		if ($iH > 360){
			$iH = 360; //   0-360
		}
		if ($iS < 0){
			$iS = 0;   // Saturation:
		}
		if ($iS > 100){
			$iS = 100; //   0-100
		}
		if ($iV < 0){
			$iV = 0;   // Lightness:
		}
		if ($iV > 100){
			$iV = 100; //   0-100
		}

		$dS = $iS / 100.0; // Saturation: 0.0-1.0
		$dV = $iV / 100.0; // Lightness:  0.0-1.0
		$dC = $dV * $dS;   // Chroma:     0.0-1.0
		$dH = $iH / 60.0;  // H-Prime:    0.0-6.0
		$dT = $dH;	   // Temp variable

		while ($dT >= 2.0)
			$dT -= 2.0; // php modulus does not work with float
		$dX = $dC * (1 - abs($dT - 1));	 // as used in the Wikipedia link

		switch ($dH){
			case($dH >= 0.0 && $dH < 1.0):
				$dR = $dC;
				$dG = $dX;
				$dB = 0.0;
				break;
			case($dH >= 1.0 && $dH < 2.0):
				$dR = $dX;
				$dG = $dC;
				$dB = 0.0;
				break;
			case($dH >= 2.0 && $dH < 3.0):
				$dR = 0.0;
				$dG = $dC;
				$dB = $dX;
				break;
			case($dH >= 3.0 && $dH < 4.0):
				$dR = 0.0;
				$dG = $dX;
				$dB = $dC;
				break;
			case($dH >= 4.0 && $dH < 5.0):
				$dR = $dX;
				$dG = 0.0;
				$dB = $dC;
				break;
			case($dH >= 5.0 && $dH < 6.0):
				$dR = $dC;
				$dG = 0.0;
				$dB = $dX;
				break;
			default:
				$dR = 0.0;
				$dG = 0.0;
				$dB = 0.0;
				break;
		}

		$dM = $dV - $dC;
		$dR += $dM;
		$dG += $dM;
		$dB += $dM;
		$dR *= 255;
		$dG *= 255;
		$dB *= 255;

		$dR = str_pad(dechex(round($dR)), 2, "0", STR_PAD_LEFT);
		$dG = str_pad(dechex(round($dG)), 2, "0", STR_PAD_LEFT);
		$dB = str_pad(dechex(round($dB)), 2, "0", STR_PAD_LEFT);
		return $dR.$dG.$dB;
	}
	
	public static function findOpenOffice(){
		$cmd = '';
		if (is_string(\OC_Config::getValue('preview_libreoffice_path', null))){
			$cmd = \OC_Config::getValue('preview_libreoffice_path', null);
		}

		$whichLibreOffice = shell_exec('which libreoffice');
		if ($cmd === '' && !empty($whichLibreOffice)){
			$cmd = 'libreoffice';
		}

		$whichOpenOffice = shell_exec('which openoffice');
		if ($cmd === '' && !empty($whichOpenOffice)){
			$cmd = 'openoffice';
		}
		
		if (empty($cmd)){
			Helper::warnLog('Pure configuration issue. Missing open office binary that is mandatory for conversion.');
			Helper::debugLog('If openoffice or libreoffice is already installed please specify the path to it using preview_libreoffice_path config. Refer to admin manual for details.');
			throw new \RuntimeException('Missing open office binary that is mandatory for conversion.');
		}
		
		return $cmd;
	}

}
