<?php

/**
 * Class shopPankuzu
 *
 * @property $singleton
 *
 * @property string $domain
 * @property string $shop_url
 * @property string $shop_name
 * @property string $pref
 * @property string $area_sub_key
 * @property integer $area_sub_key_number
 * @property string $terminal
 * @property string $_home_string
 *
 * @property array $pc_area_tab_options
 * @property array $add_list
 *
 */
class shopPankuzu
{
    private static $singleton;

    public $domain = '';
    public $shop_url = '';
    public $shop_name = '';
    public $pref = '';
    public $area_sub_key = '';
    public $area_sub_key_number = 0;
    public $terminal = 'PC';
    private $_home_string = '九州で風俗デリヘル情報を探すなら「九州風俗サイト」';
    public $pc_area_tab_options = array(
        '1' => '福岡',
        '2' => '福岡市と近郊デリ',
        '3' => '福岡市アロマ',
        '4' => '北九州 飯塚筑豊',
        '5' => '久留米 筑後',
        '6' => 'ヘルス ソープ',
        '7' => '佐賀',
        '8' => '長崎',
        '9' => '熊本',
        '10' => '大分',
        '11' => '宮崎',
        '12' => '鹿児島',
        '13' => '山口',
    );
    public $add_list = array();

    private function __construct($shop_data, $terminal, $area_data)
    {
//        var_dump($shop_data);
//        echo '<br>';

        // URIを分割
        $this->domain = $this->_getDomain();
//        echo $this->domain . '<br>';

        // URLを取得
        $this->shop_url = $this->_getShopUrl($shop_data['dir_p']);
//        echo $this->shop_url . '<br>';

        // 店舗名
        $this->shop_name = $shop_data['name'];
//        echo $this->shop_name . '<br>';

        // デバイスを保存
        $this->terminal = $terminal;
//        echo $this->terminal . '<br>';

        // 地域を設定
        $target_areas = explode(',', trim($shop_data['area_p'], ','));
        $area_name = isset($target_areas[0]) ? $target_areas[0] : '';
        $this->_setShopPref($area_name, $area_data);
//        echo 'pref=' . $this->pref . '<br>';
//        echo 'area_sub_key=' . $this->area_sub_key . '<br>';

    }

    /**
     * シングルトンインスタンスの取得・設定
     * @param $url
     * @return PankuzuGenerator
     */
    public static function getInstance($shop_data = array(), $terminal = '', $area_data = array())
    {
        if (!isset(self::$singleton)) {
            self::$singleton = new self($shop_data, $terminal, $area_data);
        }

        return self::$singleton;
    }

    /**
     * 県と地域のキーを取得
     * @param $target_area_name
     * @param $AREA
     * @return void
     */
    private function _setShopPref($target_area_name, $area_options)
    {
        /**
         * configファイルに記載されている
         * $AREA['福岡']=array(
        "福岡市とその周辺" => array("福岡市","福岡市近郊","春日市","筑紫野市","太宰府市","宗像市","糸島市")
        ,"中洲周辺" => array("中洲１丁目","中洲２丁目","中洲３丁目")
        ,"北九州市とその周辺" => array("北九州市","行橋市","遠賀・中間","豊前市","古賀市","京都郡","飯塚市")
        ,"久留米市・筑後地区" => array("久留米市","小郡市","朝倉市","筑後市","八女市","柳川市","みやま市","大川市")
        ,"大牟田市・その他(荒尾)" => array("大牟田市","大牟田周辺(荒尾)")
        ,"飯塚市・筑豊地区" => array("筑豊","京築","飯塚市","直方市","田川市","嘉麻市","宮若市")
        );
        $AREA['佐賀']=array(
        "佐賀市とその周辺" => array("佐賀市","鳥栖市","神埼市","小城市","三養基郡")
        ,"唐津・伊万里地区" => array("唐津市","伊万里市")
        ,"武雄・嬉野地区" => array("武雄市","鹿島市","嬉野市")
        );
        $AREA['長崎']=array(
        "長崎市とその周辺" => array("長崎市")
        ,"佐世保地区" => array("佐世保市")
        ,"諫早・大村地区" => array("諫早市","大村市","東彼杵")
        ,"雲仙・島原地区" => array("雲仙・島原")
        ,"五島・壱岐・対馬" => array("五島市")
        );
        $AREA['熊本']=array(
        "熊本市とその周辺" => array("熊本市","熊本市下通り","宇土市")
        ,"荒尾・玉名地区" => array("荒尾市","玉名市","山鹿市","菊池市")
        ,"八代・人吉地区" => array("八代市","人吉市","水俣市")
        ,"天草" => array("天草市")
        ,"阿蘇" => array("阿蘇市")
        );
        $AREA['大分']=array(
        "大分・別府・佐伯" => array("大分市","別府市","佐伯市")
        ,"中津・宇佐" => array("中津市","宇佐市","日田市")
        );
        $AREA['宮崎']=array(
        "宮崎市とその周辺" => array("宮崎市","西都市","児湯郡")
        ,"延岡・日向地区" => array("延岡市","日向市")
        ,"えびの・都城地区" => array("都城市","小林市","えびの市")
        ,"日南" => array("日南市")
        );
        $AREA['鹿児島']=array(
        "鹿児島市" => array("鹿児島市")
        ,"川内・北薩摩地区" => array("出水市","薩摩川内市","大口市")
        ,"霧島・国分地区" => array("霧島市","姶良郡")
        ,"指宿・南薩摩地区" => array("指宿市")
        ,"大隅" => array("鹿屋市","志布志市")
        ,"屋久島・種子島・奄美" => array("屋久島")
        );
        $AREA['山口']=array(
        "下関市" => array("下関市")
        ,"萩・美祢地区" => array("萩市","美祢市")
        ,"山口・防府地区" => array("防府市","山口市","宇部市","山陽小野田")
        ,"周南・岩国地区" => array("周南市","岩国市","下松市")
        );
        $AREA['沖縄']=array(
        "那覇市" => array("那覇市")
        );
        $AREA['全国']=array(
        "全国" => array("全国","その他")
        ,"関東" => array("神奈川")
        ,"関西" => array("大阪")
        ,"中国" => array("広島")
        ,"九州" => array("九州全域")
        ,"広域" => array("九州全域・広島・大阪")
        );
         */
//        echo $target_area_name . '<br>';
        $key_number = 0;
        foreach ($area_options as $pref => $sub_areas) {
//            echo $pref . '<br>';
//            var_dump($sub_areas);
//            echo  '<br>';
            foreach ($sub_areas as $sub_area_key => $sub_area_names) {
//                echo $sub_area_key . '<br>';
//                var_dump($sub_area_names);
//                echo '<br>';
                if (in_array($target_area_name, $sub_area_names)) {
                    $this->pref = $pref;
                    $this->area_sub_key = $sub_area_key;
                    $this->area_sub_key_number = $key_number;
                    return;
                }
            }
            $key_number++;
        }
        return;
    }

    /**
     * 地域の件名とサブキーからタブを取得
     */
    private function _getShopPcTabKey()
    {
        if (!$this->pref)
            return '';

        if (!$this->area_sub_key)
            return '';

        if (in_array($this->pref, $this->pc_area_tab_options)) {
            $area_options = array_flip($this->pc_area_tab_options);
            return $area_options[$this->pref];
        }

        return '';
    }

    function getPcHeadUrl()
    {
        $tab_id = $this->_getShopPcTabKey();
        if (!$tab_id)
            return '';
        return "{$this->domain}/pc/?Sk={$tab_id}";
    }

    function getSpHeadUrl()
    {
        return "{$this->domain}/sp/shoplist.php?K1[]={$this->area_sub_key_number}";
    }



    function generatePankuzuJson($shop_data, $ara_params, $tab_key, $terminal)
    {

        $shop_name = $shop_data['name'];
        $area_name = $shop_data['area_p'];
        $genre_name = $shop_data['genre_p'];
        $dir_name = $shop_data['dir_p'];






    }

    private function _getDomain()
    {
        $protocol = empty($_SERVER['HTTPS']) ? 'http' : 'https';
        $host = $_SERVER['HTTP_HOST'];
        $domain = "{$protocol}://{$host}";
        return $domain;
    }

    private function _getShopUrl($dir_path)
    {
        return "{$this->domain}/{$dir_path}";
    }

    public function addList($params)
    {
        $this->add_list[] = array(
            'url' => $params['url'],
            'label' => $params['label'],
            'ld_text' => $params['ld_text'],
        );
    }

    /**
     * Get Pankuzu data list
     * @return array
     */
    private function _getList()
    {
        $list = array();

        // 地域のURLを取得
        if ($this->terminal == 'PC') {
            $head_url = $this->getPcHeadUrl();
            if ($head_url) {
                $tab_key = $this->_getShopPcTabKey();
                $pankuzu = array();
                $pankuzu['url'] = $head_url;
                $pankuzu['label'] = $this->pc_area_tab_options[$tab_key];
                $pankuzu['ld_text'] = $this->pc_area_tab_options[$tab_key];

                $list[] = $pankuzu;
            }
        } elseif ($this->terminal == 'SP') {
            $head_url = $this->getSpHeadUrl();
            if ($head_url) {
                $pankuzu = array();
                $pankuzu['url'] = $head_url;
                $pankuzu['label'] = $this->area_sub_key;
                $pankuzu['ld_text'] = $this->area_sub_key;
                $list[] = $pankuzu;
            }
        }

        // 店舗のURLを取得
        $pankuzu = array();
        $pankuzu['url'] = $this->shop_url;
        $pankuzu['label'] = $this->shop_name;
        $pankuzu['ld_text'] = $this->shop_name;
        $list[] = $pankuzu;


        if ($this->shop_url && $this->isTop() === false && $this->add_list) {
            foreach ($this->add_list as $add_list) {
                $pankuzu = array();
                $pankuzu['url'] = "{$this->domain}{$add_list['url']}";
                $pankuzu['label'] = $add_list['label'];
                $pankuzu['ld_text'] = $add_list['ld_text'];
                $list[] = $pankuzu;
            }
        }

        return $list;
    }

    /**
     * JsonLdの生成
     * @return string
     */
    public function getJsonLd()
    {
        $items = $this->_getList();
//        var_dump($items);
        if (!$items)
            return '';

        $itemListElement = array(
            array(
                '@type' => 'ListItem',
                'position' => 1,
                'item' => array(
                    '@id' => $this->domain,
                    'name' => mb_convert_encoding($this->_home_string, 'UTF-8', 'SJIS')
                )
            ),
        );

        $position = 2;
        foreach ($items as $item) {
            $element = array(
                '@type' => 'ListItem',
                'position' => $position,
                'item' => array(
                    '@id' => $item['url'],
                    'name' => mb_convert_encoding($item['ld_text'], 'UTF-8', 'SJIS'),
                )
            );
            array_push($itemListElement, $element);
            $position++;
        }

        $json_ld = array(
            '@context' => 'http://schema.org',
            '@type' => 'BreadcrumbList',
            'itemListElement' => $itemListElement,
        );

        // php5.3ではJSON_UNESCAPED_UNICODEオプションが存在しない
//        $json = json_encode($json_ld, JSON_UNESCAPED_UNICODE);
        $json = $this->_raw_json_encode($json_ld);
        $json = mb_convert_encoding($json, 'SJIS', 'UTF-8');
        $json = str_replace('\\/', '/', $json);

//        echo '<br>';
//        echo '$json_ld: ';
//        var_dump($json_ld);
//        echo '<br>';
//
//        echo '<br>';
//        echo '$itemListElement: ';
//        var_dump($itemListElement);
//        echo '<br>';
//        echo '<br>';


        if ($json) {
            return <<<EOM
<script type="application/ld+json">
{$json}
</script>
EOM;

        }

        return '';
    }

    private function _raw_json_encode($input, $flags = 0) {
        $fails = implode('|', array_filter(array(
            '\\\\',
            $flags & JSON_HEX_TAG ? 'u003[CE]' : '',
            $flags & JSON_HEX_AMP ? 'u0026' : '',
            $flags & JSON_HEX_APOS ? 'u0027' : '',
            $flags & JSON_HEX_QUOT ? 'u0022' : '',
        )));
        $pattern = "/\\\\(?:(?:$fails)(*SKIP)(*FAIL)|u([0-9a-fA-F]{4}))/";
        $callback = function ($m) {
            return html_entity_decode("&#x$m[1];", ENT_QUOTES, 'UTF-8');
        };
        return preg_replace_callback($pattern, $callback, json_encode($input, $flags));
    }


    /**
     * 店舗のトップページか？
     * @return bool
     */
    public function isTop()
    {
        if (!$this->shop_url)
            return false;

        $shop_urls = array();
        $shop_urls[] = $this->shop_url;
        $shop_urls[] = "{$this->shop_url}/pc";
        $shop_urls[] = "{$this->shop_url}/pc/";
        $shop_urls[] = "{$this->shop_url}/pc/?";
        $shop_urls[] = "{$this->shop_url}/sp";
        $shop_urls[] = "{$this->shop_url}/sp/";
        $shop_urls[] = "{$this->shop_url}/sp/?";

        $request_uri = "{$this->domain}{$_SERVER['REQUEST_URI']}";

        if (in_array($request_uri, $shop_urls)) {
            return true;
        }

        return false;

    }



    /**
     * デリか調べる
     * @param $genre_name
     * @return bool
     */
    private function _getShopIsDeli($genre_name)
    {
        // $GENRE=array('デリバリーヘルス','人妻デリヘル','デリバリーアロマ','デリバリーSM','外人デリヘル','ニューハーフデリヘル','ソープランド','アロマエステ','トクヨク','ヘルス','ホテルヘルス','オナクラ','アロマエステ（非風俗）','クラブ','スナック','ラウンジ','メールレディ','モデルプロダクション','アダルトショップ','出会い系','ライブチャット','その他','スペシャルリンク');

        $deli=array('デリバリーヘルス','人妻デリヘル','デリバリーSM','外人デリヘル','ニューハーフデリヘル');
        if (in_array($genre_name, $deli)) {
            return true;
        }
        return false;
    }


    /**
     * アロマか
     * @param $genre_name
     * @return bool
     */
    private function _getShopIsAroma($genre_name)
    {
        // $GENRE=array('デリバリーヘルス','人妻デリヘル','デリバリーアロマ','デリバリーSM','外人デリヘル','ニューハーフデリヘル','ソープランド','アロマエステ','トクヨク','ヘルス','ホテルヘルス','オナクラ','アロマエステ（非風俗）','クラブ','スナック','ラウンジ','メールレディ','モデルプロダクション','アダルトショップ','出会い系','ライブチャット','その他','スペシャルリンク');

        $aroma=array('デリバリーアロマ','アロマエステ','アロマエステ（非風俗）');
        if (in_array($genre_name, $aroma)) {
            return true;
        }
        return false;
    }
}