<?php
/**
 * Export do formátu Českých realit.
 *
 * @category Dalten
 * @package  Export
 */
class Dalten_Export_CeskerealityThree extends Dalten_Export_Ceskereality
{
	/**
	 * Zformátuje a podstrčí některé informace před exportem skrz Newspeak.
	 *
	 * @param array  $values     Pole s daty (POZOR! po zákroku hyperoptimalizátoru).
	 * @param string $config     Definice entity.
	 * @param string $entityName Jméno entity.
	 *
	 * @return array Zformátovaná data.
	 */
	protected function _format(array $values, $config, $entityName)
	{
		if ($entityName == 'listing') {
			if (!empty($values['nemovitost_podlazi_cislo'])) {
				$values['nemovitost_podlazi_cislo'] = $this->_podlaziCisloNaText($values['nemovitost_podlazi_cislo']);
			}
		}
		return $values;
	}

	/**
	 * Provede závěrečné úpravy po převodu Newspeakem.
	 *
	 * @param array  $convertedValues Převedené hodnoty.
	 * @param array  $originalValues  Originální údaje o nemovitosti.
	 * @param string $entityName      Jméno entity.
	 *
	 * @return array Definitivně převedená data entity.
	 */
	protected function _convert(array $convertedValues, array $originalValues, $entityName)
	{
		if ($entityName == 'listing') {
			$convertedValues['subtyp_n'] = $this->_getSubtyp($originalValues);

			$plochy = $this->_tranformAreas($originalValues);
			$videos = $this->_transformVideo($originalValues);

			if (!empty($originalValues['nemovitost_popis_zakladni'])) {
				$convertedValues['popis'] =
					$originalValues['nemovitost_popis_zakladni'] . ' ' . $originalValues['nemovitost_popis_detailni'];
			}

			$convertedValues['podrobnosti'] = $this->_podrobnosti($originalValues);

			if (!empty($originalValues['nemovitost_uir_ulice_kod'])) {
				$convertedValues['ruian_uroven'] = 7;
				$convertedValues['ruian_kod'] = (int)$originalValues['nemovitost_uir_ulice_kod'];
			} elseif (!empty($originalValues['nemovitost_uir_mcast_kod'])) {
				$convertedValues['ruian_uroven'] = 17;
				$convertedValues['ruian_kod'] = (int)$originalValues['nemovitost_uir_mcast_kod'];
			} elseif (!empty($originalValues['nemovitost_uir_cobce_kod'])) {
				$convertedValues['ruian_uroven'] = 5;
				$convertedValues['ruian_kod'] = (int)$originalValues['nemovitost_uir_cobce_kod'];
			} elseif (!empty($originalValues['nemovitost_uir_obec_kod'])) {
				$convertedValues['ruian_uroven'] = 3;
				$convertedValues['ruian_kod'] = (int)$originalValues['nemovitost_uir_obec_kod'];
			} elseif (!empty($originalValues['nemovitost_uir_okres_kod'])) {
				$convertedValues['ruian_uroven'] = 1;
				$convertedValues['ruian_kod'] = (int)$originalValues['nemovitost_uir_okres_kod'];
			}

            if ($originalValues['nemovitost_uir_stat'] != 'CZ') {
                // u nemovitostí ležících mimo ČR povinnou položku okres a obec_kod vyplňte kódem 0
                $convertedValues['okres'] = 0;
                $convertedValues['obec_kod'] = 0;
                $convertedValues['obec_cast_kod'] = 0;
                $convertedValues['nezverejnovat_polohu'] = 3; // nezobrazovat ulici
            }

			$convertedValues = $convertedValues + $plochy + $videos;

			if ($originalValues['nabidka_gps_presnost']>1) {
				$convertedValues['gps_lat'] = 0;
				$convertedValues['gps_lon'] = 0;
			}

			if ($convertedValues['cena']<5) {
			    $convertedValues['cena_neuvadet'] = 1;
            }

		}

		if ($entityName=='project') {
            $kategorie = [];
            if ($originalValues['pocet_bytu']>0) {
                $kategorie[] = '1'; // Byty a bytové domy
            }
            if ($originalValues['pocet_domu']>0) {
                $kategorie[] = '2'; // Rodinné domy
            }
            if ($originalValues['komercni_plochy_pocet']>0 || $originalValues['pocet_kancelari']>0) {
                $kategorie[] = '6'; // Komerční objekty
            }
            if (($originalValues['komercni_plochy_pocet']>0 || $originalValues['pocet_kancelari']>0) && $originalValues['pocet_bytu']>0) {
                $kategorie[] = '3'; // Multifunkční domy
            }
            if (empty($kategorie)) {
                $kategorie[] = '3'; // + ještě jednou Multifunkční domy - záložní kategorie kam padají všechny ostatní projekty
            }
            $convertedValues['kategorie'] = $kategorie;
        }

		if ($entityName=='broker') {
			$jmenoCele = $originalValues['uzivatel_os_jmeno'] . (!empty($originalvalues['uzivatel_os_prostredni_jmeno']) ?  ' ' . $originalvalues['uzivatel_os_prostredni_jmeno'] : '') . ' ' . $originalValues['uzivatel_os_prijmeni'];

			if (!empty($originalValues['uzivatel_tituly_pred_jmenem'])) {
				$jmenoCele = $originalValues['uzivatel_tituly_pred_jmenem'] . ' ' . $jmenoCele;
			}

			if (!empty($originalValues['uzivatel_tituly_za_jmenem'])) {
				$jmenoCele = $jmenoCele . ' ' . $originalValues['uzivatel_tituly_za_jmenem'];
			}

			$convertedValues['makler_jmeno'] = $jmenoCele;
		}

		return $convertedValues;
	}

	protected function _getSubtyp(array $originalValues)
	{
		$typ = $originalValues['nemovitost_typ'];

		$subtyp_n = 599; // ostatní komerční prostory

		if ($typ==4) {
			// byty
			$prevodBytu = array(
				1 => 202,
				2 => 202,
				9 => 203,
				3 => 204,
				10 => 205,
				4 => 206,
				11 => 207,
				5 => 208,
				12 => 209,
				6 => 210,
				13 => 211,
				7 => 211,
				14 => 211,
				8 => 211,
				16 => 211,
				17 => 211,
                18 => 220 // Pokoje
			);
			$subtyp_n = $prevodBytu[$originalValues['nemovitost_dispozice']];
		} elseif ($typ==6) {
			// domy a vily
			$subtyp_n = 101; // neumíme rozlišit RD od vily
		} elseif ($typ==10) {
			// chaty / chalupy
			if ($originalValues['nemovitost_typ_rekreacniho_objektu']==1) {
				$subtyp_n = 108; // chaty
			} else {
				$subtyp_n = 109; // chalupy
			}
		} elseif ($typ==1) {
			// zemědělské objekty
			$subtyp_n = 508;
		} elseif ($typ==3) {
			// pozemky
			$prevodPozemku = array(
				1 => 304,
				2 => 301,
				3 => 303,
				4 => 306,
				5 => 305,
				6 => 302,
				7 => 399,
                8 => 307
			);
			$subtyp_n = $prevodPozemku[$originalValues['nemovitost_druh_pozemku']];
		} elseif ($typ==11) {
			// malé objekty a garáže
			$prevodMalychObjektu = array(
				1 => 901, // garáž
				2 => 599, // ostatní > ostatní komerční prostory
				3 => 906, // garážová stání
				4 => 905, // vinné sklepy
			);
			$subtyp_n = $prevodMalychObjektu[$originalValues['nemovitost_typ_maleho_objektu']];
		} elseif ($typ==9) {
			// komerční prostory
			$prevodKomercniProstory = array(
				1 => 503,
				2 => 504,
				3 => 502,
				4 => 599,
				5 => 501,
                6 => 510,
                7 => 511
			);
			$subtyp_n = $prevodKomercniProstory[$originalValues['nemovitost_druh_prostor']];
		} elseif ($typ==2) {
			// komerční objekty
			$prevodKomercniObjekty = array(
				1 => 502,
				2 => 501,
				3 => 504,
				4 => 504,
				5 => 501,
				7 => 503,
				6 => 599,
                8 => 512
			);
			$subtyp_n = $prevodKomercniObjekty[$originalValues['nemovitost_ucel_budovy']];
		} elseif ($typ==5) {
			// historické objekty
			$subtyp_n = 110;
		} elseif ($typ==7) {
			// hotely, penziony a restaurace
			$prevodHotely = array(
				1 => 506, // hotel
				2 => 506, // penzion
				3 => 505 // restaurace
			);
			$subtyp_n = $prevodHotely[$originalValues['nemovitost_typ_zarizeni']];
		} elseif ($typ==8) {
			// nájemní domy
			$subtyp_n = 105;
		}

		return $subtyp_n;
	}

	/**
	 * Převede naše plochy na plochy Českých realit. Filozofie převodu převzaná z původního exportu.
	 *
	 * @param array $originalValues Pole obsahující originální informace o nemovitosti.
	 *
	 * @return array Pole jejich ploch.
	 */
	private function _tranformAreas(array $originalValues)
	{
		$plocha['1']  = $originalValues['nemovitost_plocha_uzitna']; // zemědělské
		$plocha['2']  = $originalValues['nemovitost_plocha_uzitna']; // komerční objekty
		$plocha['3']  = $originalValues['nemovitost_plocha_celkova']; // pozemky
		$plocha['4']  = $originalValues['nemovitost_plocha_celkova']; // byty
		$plocha['5']  = $originalValues['nemovitost_plocha_celkova']; // historické
		$plocha['6']  = $originalValues['nemovitost_plocha_uzitna']; // domy
		$plocha['7']  = $originalValues['nemovitost_plocha_uzitna']; // hotely
		$plocha['8']  = $originalValues['nemovitost_plocha_uzitna']; // nájemní domy
		$plocha['9']  = $originalValues['nemovitost_plocha_celkova']; // komerční prostory
		$plocha['10'] = $originalValues['nemovitost_plocha_uzitna']; // chaty
		$plocha['11'] = $originalValues['nemovitost_plocha_zastavena']; // malé objekty

		$areas = array();
        $areas['pl_celkova'] = $originalValues['nemovitost_plocha_celkova'];
        // pl_celkova je celková plocha, pokud pro daný typ nabídky neplatí něco jiného:
        if (!empty($plocha[ $originalValues['nemovitost_typ'] ])) {
            $areas['pl_celkova'] = $plocha[ $originalValues['nemovitost_typ'] ];
        }
        if ($originalValues['nemovitost_typ']==9 && empty($areas['pl_celkova'])) {
            // pro komerční prostory posíláme užitnou jako celkovou
            $areas['pl_celkova'] = $originalValues['nemovitost_plocha_uzitna'];
        }
		if ($originalValues['nemovitost_plocha_zastavena']) {
			$areas['pl_zastavena'] = $originalValues['nemovitost_plocha_zastavena'];
		}
		if ($originalValues['nemovitost_plocha_uzitna']) {
			$areas['pl_uzitna'] = $originalValues['nemovitost_plocha_uzitna'];
		}
		if ($originalValues['nemovitost_plocha_parcely']) {
			$areas['pl_pozemku'] = $originalValues['nemovitost_plocha_parcely'];
		}

		// plochy, které jsou povinné v závislosti na typech
		if ($originalValues['nemovitost_typ']==2) {
			$areas['pl_uzitna'] = $originalValues['nemovitost_plocha_celkova'];
		}
		if ($originalValues['nemovitost_typ']==3) {
			$areas['pl_pozemku'] = $originalValues['nemovitost_plocha_celkova'];
		}
		if ($originalValues['nemovitost_typ']==4) {
			$areas['pl_uzitna'] = $originalValues['nemovitost_plocha_uzitna'];
		}
		if ($originalValues['nemovitost_typ']==11) {
			$areas['pl_uzitna'] = $originalValues['nemovitost_plocha_zastavena'];
		}

		return $areas;
	}

    /**
     * Přeloží export virtuální a video prohlídky.
     *
     * @param array $originalValues
     * @return array
     */
    private function _transformVideo(array $originalValues)
    {
        $youtubeId = Dalten_Export_Helper_YoutubeIdExtractor::extractYoutubeId($originalValues['nemovitost_video_prohlidka']);
        $matterportId = $this->_getMatterportId($originalValues['nemovitost_virtualni_prohlidka']);

        $videos = array();
        if (!empty($youtubeId)) {
            $videos['video'] = $youtubeId;
        }
        if (!empty($matterportId)) {
            $videos['prohlidka3d'] = $matterportId;
            $videos['prohlidka3d_typ'] = 1;
        }

        return $videos;
    }

    /**
     * Vytáhne ID virtuální prohlíky Matterport.
     *
     * @param string $url Odkaz na YouTube.
     *
     * @return string
     */
    protected function _getMatterportId($url) {
        // https://my.matterport.com/show/?m=pGSH9wuaKZH
        $parsedUrl = parse_url($url);
        if (isset($parsedUrl['host']) && $parsedUrl['host']=='my.matterport.com' &&  trim($parsedUrl['path'],'/')=='show') {
            $parameters = array();
            parse_str($parsedUrl['query'], $parameters);
            if (!empty($parameters['m'])) {
                return $parameters['m'];
            }
        }
        return '';
    }

	/**
	 * Převede číslo podlaží na text.
	 *
	 * @param int $cisloPodlazi Číslo podlaží
	 *                          (viz http://upload.wikimedia.org/wikipedia/commons/2/24/Podlazi_vs_patro.svg)
	 *
	 * @return null|string Textové vyjádření v patrech.
	 */
	private function _podlaziCisloNaText($cisloPodlazi)
	{
		if ($cisloPodlazi == 1) {
			return 'přízemí';
		} elseif ($cisloPodlazi>1) {
			return ($cisloPodlazi-1) . '. patro';
		} elseif ($cisloPodlazi<0) {
			return abs($cisloPodlazi) . '. podzemní podlaží';
		}
		return null;
	}



	protected function _podrobnosti($originalValues)
	{
		$sablona = array(

            array(				//Dopravní spojení - 0
                "Autobus",
                "Vlak",
                "Metro",
                "MHD",
                "Silnice",
                "Dálnice"
            ),

            array(				//Parkování - 1
                "Garáž",
                "Parkování na ulici",
                "Parkoviště",
                "Vlastní parkovací stání"
            ),

            array(				//Příjezd - 2
                "Nezpevněný",
                "Rampa",
                "Zpevněný",
                "Beton",
                "Dlažba",
                "Asfalt"
            ),

            array(				//Elektrický proud - 3
                "110 V",
                "230 V",
                "400 V",
                "Na hranici pozemku",
                "Vlastní zdroj"
            ),

            array(				//Kanalizace - 4
                "Veřejná kanalizace",
                "Vlastní ČOV",
                "Žumpa, septik"
            ),

            array(      				//Zavedené inž. sítě - 5
                "Internet",
                "Kabelová TV",
                "Na hranici pozemku",
                "Plyn",
                "Telefon"
            ),

            array(				//Zdroj vody - 6
                "Domácí vodárna",
                "Pramen",
                "Studna kopaná",
                "Studna vrtaná",
                "Veřejný vodovod",
                "Místní zdroj"
            ),

            array( 				//Způsob vytápění - 7
                "Lokální - plynové",
                "Lokální - tuhá paliva",
                "Lokální - elektrické",
                "Ústřední - plynové",
                "Ústřední - tuhá paliva",
                "Ústřední - Elektrické",
                "Ústřední - Dálkové"
            ),

            array(				//Střecha - 8
                "Hambalkový",
                "Kombinovaný",
                "Příhradový",
                "Pultový",
                "Sedlový",
                "Valbový"
            ),

            array(				//Typ konstrukce - 9
                "Dřevěná",
                "Jiná",
                "Ocelová",
                "Roubená",
                "Skeletová",
                "Montovaná",
                "Zděná",
                "Kamenná",
                "Panelová"
            ),

            array(				//WC - 10
                "Splachovací",
                "Společný",
                "Suchý",
            ),

            array(       				//Okna - 11
                "Dřevěná",
                "Plastová",
                "Hliníková",
                "Kombinovaná",
            ),

            array(				//Balkony, lodžie, terasy - 12
                "Balkón",
                "Lodžie",
                "Terasa"
            ),

            array(				//Bazény - 13
                "Venkovní bazén",
                "Vnitřní bazén",
                "Koupací jezírko"
            ),

            array(				//Druh bytu - 14
                "Klasický",
                "Mezonet",
                "Loft",
                "Podkroví",
                "Ateliér",
                "Atypický"
            ),

            array(				//Vybavení bytu - 15
                "S vybavením",
                "Bez vybavení",
                "Částečně vybaveno"
            ),

            array(				//Vybavení podrobnosti - 16
                "Kuchyňská linka",
                "Lednice",
                "Pračka",
                "Sporák",
                "Myčka",
                "Obývací pokoj",
                "Postele"
            ),

            array(				//Vytápění podrobnosti - 17
                "Uhlí",
                "Dřevo",
                "Peletky, biomasa",
                "Plyn",
                "El.kotel",
                "El.přímotop",
                "Infra-panely",
                "Čerpadlo s vrtem",
                "Čerpadlo bez vrtu",
                "Solární term panely",
                "Fotovoltaické panely",
                "Rekuperační jednotka",
                "Klimatizace",
                "Krbová vložka",
                "Otevřený krb",
                "Krbová kamna",
                "Radiátory",
                "Podlahové vytápění"

            ),

            array(				//Ochrany a omezení - 18
                "Ochranné pásmo",
                "Národní park",
                "CHKO",
                "Historické centrum, památková zona",
                "Památka",
                "Věcné břemeno"
            ),

            array(				//Cena nezahrnuje - 19
                "DPH",
                "Poplatky",
                "Právní servis",
                "Provize",
                "Daň z převodu nemovitosti"
            ),

            array(              			//Zateplení - 20
                "Ano",
                "Zateplená polystyrenem",
                "Zateplená vatou",
            ),
        );

		$nalezeno = array();

		if ($this->_isMultiChecked($originalValues, 'nemovitost_doprava', 0)) $nalezeno[] = 'Vlak';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_doprava', 1)) $nalezeno[] = 'Dálnice';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_doprava', 2)) $nalezeno[] = 'Silnice';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_doprava', 3)) $nalezeno[] = 'MHD';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_doprava', 4)) $nalezeno[] = 'Autobus';

		// todo Garáž

        if ($this->_isMultiChecked($originalValues, 'nemovitost_elektrina', 1)) $nalezeno[] = '120 V';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_elektrina', 2)) $nalezeno[] = '230 V';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_elektrina', 3)) $nalezeno[] = '400 V';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_elektrina', 4)) $nalezeno[] = '400 V';
        // 5 bez přípojky neposíláme

		if ($this->_isMultiChecked($originalValues, 'nemovitost_odpad', 0)) $nalezeno[] = 'Veřejná kanalizace';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_odpad', 1)) $nalezeno[] = 'Vlastní ČOV';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_odpad', 2)) $nalezeno[] = 'Žumpa, septik';

		if ($this->_isMultiChecked($originalValues, 'nemovitost_telekomunikace', 0)) $nalezeno[] = 'Telefon';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_telekomunikace', 1)) $nalezeno[] = 'Internet';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_ostatni_rozvody', 1)) $nalezeno[] = 'Kabelová TV';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_plyn', 0) || $this->_isMultiChecked($originalValues, 'nemovitost_plyn', 1)) {
			$nalezeno[] = 'Plyn';
		}

		if ($this->_isMultiChecked($originalValues, 'nemovitost_topeni', 0)) $nalezeno[] = 'Lokální - plynové';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_topeni', 1)) $nalezeno[] = 'Lokální - tuhá paliva';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_topeni', 2)) $nalezeno[] = 'Lokální - elektrické';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_topeni', 3)) $nalezeno[] = 'Ústřední - plynové';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_topeni', 4)) $nalezeno[] = 'Ústřední - tuhá paliva';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_topeni', 5)) $nalezeno[] = 'Ústřední - Elektrické';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_topeni', 6)) $nalezeno[] = 'Ústřední - Dálkové';

		if ($this->_isMultiChecked($originalValues, 'nemovitost_druh_objektu', 1)) $nalezeno[] = 'Dřevěná konstrukce';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_druh_objektu', 2)) $nalezeno[] = 'Zděná';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_druh_objektu', 3)) $nalezeno[] = 'Kamenná';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_druh_objektu', 4)) $nalezeno[] = 'Montovaná';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_druh_objektu', 5)) $nalezeno[] = 'Panelová';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_druh_objektu', 6)) $nalezeno[] = 'Skeletová';
		if ($this->_isMultiChecked($originalValues, 'nemovitost_druh_objektu', 7)) $nalezeno[] = 'Jiná';

		if ($this->_isMultiChecked($originalValues, 'nemovitost_voda', 1)) $nalezeno[] = 'Místní zdroj';  // Zdroj pro celý objekt
		if ($this->_isMultiChecked($originalValues, 'nemovitost_voda', 2)) $nalezeno[] = 'Veřejný vodovod'; // Dálkový rozvod
		if ($this->_isMultiChecked($originalValues, 'nemovitost_voda', 3)) $nalezeno[] = 'Rozvod studené a teplé'; // Dálkový rozvod
		if ($this->_isMultiChecked($originalValues, 'nemovitost_voda', 4)) $nalezeno[] = 'Studna'; // Dálkový rozvod
		if ($this->_isMultiChecked($originalValues, 'nemovitost_voda', 5)) $nalezeno[] = 'Retenční nádrž'; // Dálkový rozvod

		if ($originalValues['nemovitost_balkon']==1) {
			$nalezeno[] = 'Balkón';
		}
		if ($originalValues['nemovitost_lodzie']==1) {
			$nalezeno[] = 'Lodžie';
		}
		if ($originalValues['nemovitost_terasa']==1) {
			$nalezeno[] = 'Terasa';
		}

		if ($originalValues['nemovitost_garaz']==1) {
			$nalezeno[] = 'Garáž';
		}

		if ($originalValues['pocet_mist_k_parkovani']>0) {
			$nalezeno[] = 'Vlastní parkovací stání';
		}

		$out = array();
		foreach ($sablona as $sekce) {
			$str = str_repeat('0', count($sekce));
			foreach ($sekce as $poloha=>$nazev) {
				if (in_array($nazev, $nalezeno)) {
					$str[$poloha] = '1';
				}
			}
			$out[] = $str;
		}
		return implode(' ', $out);
	}

	/**
	 * Vrací je-li v poli $data zaškrtnuté pole $fieldName jako multicheckbox na hodnotě $value.
	 *
	 * @param array  $data      Pole s daty.
	 * @param string $fieldName Název políčka.
	 * @param int    $value     Pořadí zašktávátka.
	 *
	 * @return bool Je to tak?
	 */
	private function _isMultiChecked(array $data, $fieldName, $value) {
		if (isset($data[$fieldName])) {
			if (substr($data[$fieldName], $value, 1)==1) {
				return true;
			}
		}
		return false;
	}
}
