<?php
class pogoda implements module {
	static $wojewodztwa = array(
		'Kuiavia-Pomerania' => 'kujawsko-pomorskie',
		'Kuyavian-Pomeranian' => 'kujawsko-pomorskie',
		'Kujawsko-Pomorskie' => 'kujawsko-pomorskie',
		
		'Lesser Poland' => 'małopolskie',
		
		'Lodz' => 'łódzkie',
		'Łódź' => 'łódzkie',
		
		'Lower Silesia' => 'dolnośląskie',
		'Lower Silesian' => 'dolnośląskie',
		
		'Lublin' => 'lubelskie',
		'Lubelskie' => 'lubelskie',
		
		'Lubuskie' => 'lubuskie',
		
		'Mazovia' => 'mazowieckie',
		'Masovian' => 'mazowieckie',
		'Mazowieckie' => 'mazowieckie',
		
		'Opole' => 'opolskie',
		
		'Subcarpathia' => 'podkarpackie',
		'Podkarpackie' => 'podkarpackie',
		
		'Podlachia' => 'podlaskie',
		
		'Pomerania' => 'pomorskie',
		'Pomorskie' => 'pomorskie',
		
		'Silesia' => 'śląskie',
		
		'Swietokrzyskie' => 'świętokrzyskie',
		
		'Warmia and Masuria' => 'warmińsko-mazurskie',
		
		'Western Pomerania' => 'zachodniopomorskie',
		
		'Greater Poland' => 'wielkopolskie',
		'Wielkopolskie' => 'wielkopolskie',
	);
	
	static function register_cmd() {
		return array(
			'pogoda' => 'cmd_pogoda',
			'p' => 'cmd_pogoda',
			'weather' => 'cmd_pogoda',
			'miasto' => 'cmd_miasto',
			'm' => 'cmd_miasto',
			'temp' => 'cmd_pogoda',
			'temperatura' => 'cmd_pogoda',
		);
	}
	
	static function help($cmd=NULL) {
		if($cmd === NULL) {
			GGapi::putRichText('pogoda ', TRUE);
			GGapi::putRichText('[miasto]', FALSE, TRUE);
			GGapi::putRichText("\n".'   Podaje pogodÄ™ dla miasta'."\n");
			
			GGapi::putRichText('miasto ', TRUE);
			GGapi::putRichText('miasto', FALSE, TRUE);
			GGapi::putRichText("\n".'   Ustala domyślne miasto dla funkcji pogoda'."\n\n");
		}
		elseif(substr($cmd, 0, 1)=='m')
		{
			GGapi::putRichText('miasto ', TRUE);
			GGapi::putRichText('miasto', FALSE, TRUE);
			GGapi::putRichText(' (alias: ');
			GGapi::putRichText('m', TRUE);
			GGapi::putRichText(')'."\n".'   Ustawia domyślne ');
			GGapi::putRichText('miasto', FALSE, TRUE);
			GGapi::putRichText(' dla funkcji pogoda dla danego numeru Gadu-Gadu.');
		}
		else
		{
			GGapi::putRichText('pogoda ', TRUE);
			GGapi::putRichText('miasto', FALSE, TRUE);
			GGapi::putRichText(' (alias: ');
			GGapi::putRichText('p', TRUE);
			GGapi::putRichText(')'."\n".'   Podaje pogodę dla danego miasta na najbliższe dni. Domyślne miasto można ustawić komendą ');
			GGapi::putRichText('miasto', TRUE);
		}
	}
	
	static function putIcon($icon) {
		if(!empty($icon)) {
			if(!file_exists('./data/pogoda/'.basename($icon))) {
				if(substr($icon, 0, 1) == '/') {
					$icon = 'http://www.google.com'.$icon;
				}
				$img = @file_get_contents($icon);
				if($img) {
					file_put_contents('./data/pogoda/'.basename($icon), $img);
				}
			}
			
			GGapi::putImage('./data/pogoda/'.basename($icon));
			GGapi::putText("\n");
		}

	}
	
	static function cmd_pogoda($name, $arg) {
		if(empty($arg)) {
			$arg = database::get($_GET['from'], 'pogoda', 'miasto');
			if(empty($arg)) {
				$arg = GGapi::getPublicData();
				$arg = trim($arg['city']);
				if(empty($arg)) {
					$arg = 'Warszawa';
					$forced = TRUE;
				}
				GGapi::putText('Nie ustawiono miasta (pomoc - wpisz: help miasto) - '.(!$forced ? 'na podstawie danych z katalogu publicznego ' : '').'wybieram miasto '.$arg."\n\n");
			}
		}
		
		$dane = @file_get_contents('http://www.google.pl/ig/api?weather='.urlencode(ucwords(funcs::utfToAscii($arg))));
		if(!$dane) {
			GGapi::putText('Przepraszamy, nie udało się połączyć z serwisem');
			return;
		}
		
		$dane = iconv('iso-8859-2', 'utf-8', $dane);
		
		$dane = @simplexml_load_string($dane);
		if(!$dane) {
			GGapi::putText('Przepraszamy, błąd przy pobieraniu danych');
			return;
		}
		
		if($dane->weather->problem_cause) {
			GGapi::putText('Problem w serwisie bądź danego miasta nie ma w bazie'."\n\n".'Przykład:'."\n".'pogoda Warszawa'."\n".'pogoda Kraków');
			return;
		}
		
		$short2day = array(
			'pon.' => 'Poniedziałek',
			'wt.' => 'Wtorek',
			'śr.' => 'Środa',
			'czw.' => 'Czwartek',
			'pt.' => 'PiÄ…tek',
			'sob.' => 'Sobota',
			'niedz.' => 'Niedziela',
		);
		
		$region = substr(strstr($dane->weather->forecast_information->city['data'], ', '), 2);
		$region = trim(str_replace('Voivodeship', '', $region));
		if(isset(self::$wojewodztwa[$region])) {
			$region = 'województwo '.self::$wojewodztwa[$region];
		}
		
		$miasto = trim((string)$dane->weather->forecast_information->postal_code['data']);
		if(($a=strpos($miasto, '-'))!==FALSE) {
			$miasto = substr($miasto, 0, $a).'-'.ucfirst(substr($miasto, $a+1));
		}
		
		GGapi::putRichText('Pogoda dla miasta '.$miasto.', '.$region."\n\n", TRUE);
		
		GGapi::putRichText('Teraz'."\n", TRUE);
		self::putIcon((string)$dane->weather->current_conditions->icon['data']);
		
		$condition = (string)$dane->weather->current_conditions->condition['data'];
		GGapi::putRichText($txt.($condition ? $condition."\n" : '').'Temp.: '.($dane->weather->current_conditions->temp_c['data']).'°C'."\n".($dane->weather->current_conditions->humidity['data'])."\n".($dane->weather->current_conditions->wind_condition['data']));
		
		$num = TRUE;
		foreach($dane->weather->forecast_conditions as $day) {
			GGapi::putRichText("\n\n".($num ? 'Później' : $short2day[(string)$day->day_of_week['data']])."\n", TRUE);
			self::putIcon((string)$day->icon['data']);
			GGapi::putRichText(($day->condition['data'])."\n".'Temp. od '.($day->low['data']).'°C do '.($day->high['data']).'°C');
			$num = FALSE;
		}
		
	}
	
	static function cmd_miasto($name, $arg) {
		$arg = trim(funcs::utfToAscii($arg));
		if(empty($arg)) {
			$arg = database::get($_GET['from'], 'pogoda', 'miasto');
			if(!empty($arg)) {
				GGapi::putText('Aktualnie ustawione miasto to: '.$arg);
				return;
			}
			
			$arg = GGapi::getPublicData();
			$arg = funcs::utfToAscii($arg['city']);
			
			if(empty($arg)) {
				GGapi::putText('Nie podano wymaganego argumentu ');
				GGapi::putRichText('miasto', FALSE, TRUE);
				return;
			}
			
			
			GGapi::putText('Z katalogu publicznego pobrano miasto '.$arg."\n\n");
		}
		
		$data = @file_get_contents('http://ws.geonames.org/search?name='.urlencode($arg));
		if($data) {
			$data = simplexml_load_string($data);
			if($data && $data->totalResultsCount > 0) {
				$data = $data->geoname[0];
			}
			else
			{
				GGapi::putText('Podane miasto nie zostało odnalezione!');
				return;
			}
		}
		else
		{
			GGapi::putText('Wystąpił błąd przy wyszukiwaniu miasta. Spróbuj ponownie później.');
			return;
		}
		
		if(!$data->geonameId || $data->geonameId=='756135') {
			$data = new SimpleXMLElement('<geoname><name>Warszawa</name><lat>52.25</lat><lng>21.0</lng><geonameId>756135</geonameId><countryCode>PL</countryCode><countryName>Poland</countryName></geoname>');
		}
		
		GGapi::putText('Miasto zostało ustawione na '.(string)$data->name);
		database::add($_GET['from'], 'pogoda', 'miasto', (string)$data->name);
		database::add($_GET['from'], 'pogoda', 'kraj', (string)$data->countryName);
		database::add($_GET['from'], 'pogoda', 'cc', (string)$data->countryCode);
		database::add($_GET['from'], 'pogoda', 'geo', array('lat' => (string)$data->lat, 'lon' => (string)$data->lng));
	}
}
?>