<?php

namespace App\Console\Commands;

use App\Models\Article;
use App\Models\PortalStatusArticle;
use Illuminate\Support\Arr;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
use App\Console\Commands\Converters\AtHomeLandConverter;
use App\Console\Commands\Converters\AtHomeHouseConverter;
use App\Console\Commands\Converters\AtHomeMansionConverter;
use Illuminate\Support\Facades\Auth;
use App\Models\MstStore;
use DOMDocument;
use DOMXPath;

class PostArticleToAtHome extends Command
{
    protected $signature = 'batch:athome {id?} {user?}';

    protected $description = 'Command description';

    private $user;

    //const ACCOUNT = '404083750002';
    //const PASSWORD = '3241gokiso';

    const DIRECTORY = 'import/athome';

    public function __construct()
    {
        parent::__construct();
    }

    public function handle()
    {
        logAtHome("[handle function] Start =============");
        $buildingId = $this->argument('id');
        $this->user = $this->argument('user');

        $companyId = $this->user->company_id;
        logAtHome("[handle function] -- Data article: builing_id = $buildingId, user_id = " . $this->user->id . ", company_id = $companyId .");
        Auth::login($this->user);


        $article = Article::where('company_id', $companyId)
            ->where('building_id', $buildingId)
            ->first();

        $articlePortal = PortalStatusArticle::getDataById($buildingId, 3);
        $article->athome_no = null;
        if(!empty($articlePortal)){
            $article->athome_no = $articlePortal->portal_id;
        }
        logAtHome('[handle function]-- articles.athome_no = ' . $article->athome_no . '.');

        if(!$this->checkLogged()) {
            $this->login();
            $this->loginATTB();
        }
        if($article->athome_no != null){
            $checkStatusId = $this->checkStatusId($article);
            if($checkStatusId == false){
                session()->flash('message_ok', 'レコードが削除されたため、athomeに入稿できませんでした');
                logAtHome('[handle function] End: The record was deleted and could not be uploaded to AtHome.');
                return false;
            }
        }

        //$this->checkId($article);
        //$this->statusCheck($article);
        //$this->hankyoOpen();
        logAtHome("[handle function] Value of article property is: " . $article->property);
        if(in_array($article->property, [1, 2, 3])) {
            logAtHome('[handle function] Run updateOrCreateLand method');
           $this->updateOrCreateLand($article);
        } elseif(in_array($article->property, [4, 5])) {
            logAtHome('[handle function] Run updateOrCreateHouse method');
           $this->updateOrCreateHouse($article);
        } elseif($article->property == null) {
            logAtHome('[handle function] Run updateOrCreateMansion method');
            $this->updateOrCreateMansion($article);
        }

        logAtHome('[handle function] End: Submitted to AtHome.');
    }

    private function initDefaultCurl()
    {
        $curl = curl_init();

        $userAgent = 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0';
        $cookiePath = Storage::path(self::DIRECTORY.'/cookie.txt');

        touch($cookiePath);

        curl_setopt($curl, CURLOPT_USERAGENT, $userAgent);
        curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
        curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
        curl_setopt($curl, CURLOPT_COOKIEJAR, $cookiePath);
        curl_setopt($curl, CURLOPT_COOKIEFILE, $cookiePath);
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);

        curl_setopt($curl, CURLOPT_HEADER, true);
        curl_setopt($curl, CURLOPT_VERBOSE, true);

        return $curl;
    }

    private function login()
    {
        logAtHome("[login Function]-- Login AtHome: Start.");
        $user = $this->user;
        $shop = MstStore::getDataByCode($user->company_id, $user->store_id);
        $account = $shop->athome_id;
        $password = $shop->athome_pw;

        $url = 'https://members.athome.jp/login';

        $data = [
            'loginId' => $account,
            'password' => $password,
        ];
        logAtHome("[Login Function] loginId $account and password $password");
        $curl = $this->initDefaultCurl();

        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        logAtHome("[Login Function] result with status code " . curl_getinfo($curl, CURLINFO_HTTP_CODE));
        logAtHome("[Login Function] -- Login AtHome: End.");
        return curl_exec($curl);
    }

    private function loginATTB()
    {
        logAtHome("[loginATTB Function]-- loginATTB AtHome: Start.");
        $bukkenTorokuUrl = 'https://members.athome.jp/atbb/bukkenToroku?from=global_menu_bukkenTorokuKokai';
        $response = $this->goToPage($bukkenTorokuUrl, []);

        $refreshPattern = '/<meta http-equiv="Refresh" content="0;URL=(.*?)">/';
        preg_match($refreshPattern, $response, $refreshMatches);

        $response = $this->goToPage($refreshMatches[1]);

        if(strpos($response, '強制終了させてATBBを利用する')) {
            $forceLoginUrl = 'https://atbb.athome.co.jp/front-web/login/force';

            $response = $this->goToPage($forceLoginUrl);
        }
        logAtHome("[loginATTB Function] -- loginATTB AtHome: End.");
        return $response;
    }

    public function checkLogged()
    {
        $url = 'https://atbb.athome.co.jp/front-web/mainservlet/bfcm003s201';

        $response = $this->goToPage($url);
        $position = strpos($response, 'HTTP/1.1 302 Found');
        logAtHome("[checkLogged Function] result of position " . $position);
        return $position === false;
    }

    private function goToPage($url, array $data = null)
    {
        $curl = $this->initDefaultCurl();

        curl_setopt($curl, CURLOPT_URL, $url);

        if($data != null) {
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
        }
        logAtHome("[goToPage Function] result with status code " . curl_getinfo($curl, CURLINFO_HTTP_CODE));
        return curl_exec($curl);
    }

    private function updateOrCreateLand($article, $tries = 0)
    {
        logAtHome("[updateOrCreateLand function]-- updateOrCreateLand AtHome: Start.");
        $options = [];

        if($article->athome_no != null) {
            $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';

            $options['page_data'] = [
                'bukkenId' => $article->athome_no,
                'bukkenVersionNumber' => 1,
                'jishaTashaKubun' => 1,
                'sousaBunrui' => 5
            ];
        } else {
            $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk002s001';

            $options['page_data'] = [
                'atbbJoiBukkenShumokuCode' => '01',
                'bukkenShumokuCode' => 'undefined'
            ];
        }

        $options['request_file'] = 'land.json';
        $options['converter'] = AtHomeLandConverter::class;

        if($article->athome_no != null) {
            $options['submit_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s006';
            $options['submit_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';
        } else {
            $options['submit_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s004';
            $options['submit_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk002s001';
        }


        if($article->athome_no != null) {
            $options['confirm_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk104s002';
            $options['confirm_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s006';
        } else {
            $options['confirm_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk104s001';
            $options['confirm_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s004';
        }
        logAtHome("[updateOrCreateLand Function] options is ". json_encode($options));
        $success = $this->updateOrCreate($article, $options);
        logAtHome("[updateOrCreateLand Function] success is ". $success);
        if(!$success && $tries <= 3) {
            $this->login();
            $this->loginATTB();
            $this->updateOrCreateLand($article, $tries + 1);
        }
        logAtHome("[updateOrCreateLand Function] -- updateOrCreateLand AtHome: End.");
    }

    private function updateOrCreateHouse($article, $tries = 0)
    {
        logAtHome("[updateOrCreateHouse Function] Start");
        $options = [];

        if($article->athome_no != null) {
            $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';

            $options['page_data'] = [
                'bukkenId' => $article->athome_no,
                'bukkenVersionNumber' => 1,
                'jishaTashaKubun' => 1,
                'sousaBunrui' => 5
            ];
        } else {
            $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk002s001';

            $options['page_data'] = [
                'atbbJoiBukkenShumokuCode' => '02',
                'bukkenShumokuCode' => 'undefined'
            ];
        }

        $options['request_file'] = 'house.json';
        $options['converter'] = AtHomeHouseConverter::class;

        if($article->athome_no != null) {
            $options['submit_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s006';
            $options['submit_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';
        } else {
            $options['submit_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s004';
            $options['submit_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk002s001';
        }

        if($article->athome_no != null) {
            $options['confirm_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk104s002';
            $options['confirm_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s006';
        } else {
            $options['confirm_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk104s001';
            $options['confirm_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s004';
        }
        logAtHome("[updateOrCreateHouse Function] options is ". json_encode($options));
        $success = $this->updateOrCreate($article, $options);
        logAtHome("[updateOrCreateHouse Function] success is ". $success);
        if(!$success && $tries <= 3) {
            $this->login();
            $this->loginATTB();
            $this->updateOrCreateHouse($article, $tries + 1);
        }
        logAtHome("[updateOrCreateHouse Function] End");
    }

    private function updateOrCreateMansion($article, $tries = 0)
    {
        logAtHome("[updateOrCreateMansion Function] Start");
        $options = [];

        if($article->athome_no != null) {
            $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';

            $options['page_data'] = [
                'bukkenId' => $article->athome_no,
                'bukkenVersionNumber' => 1,
                'jishaTashaKubun' => 1,
                'sousaBunrui' => 5
            ];
        } else {
            $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk002s001';

            $options['page_data'] = [
                'atbbJoiBukkenShumokuCode' => '03',
                'bukkenShumokuCode' => 'undefined'
            ];
        }

        $options['request_file'] = 'mansion.json';
        $options['converter'] = AtHomeMansionConverter::class;

        if($article->athome_no != null) {
            $options['submit_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s006';
            $options['submit_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';
        } else {
            $options['submit_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s004';
            $options['submit_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk002s001';
        }


        if($article->athome_no != null) {
            $options['confirm_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk104s002';
            $options['confirm_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s006';
        } else {
            $options['confirm_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk104s001';
            $options['confirm_referer'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk103s004';
        }
        logAtHome("[updateOrCreateMansion Function] options is ". json_encode($options));
        $success = $this->updateOrCreate($article, $options);
        logAtHome("[updateOrCreateMansion Function] success is ". $success);
        if(!$success && $tries <= 3) {
            $this->login();
            $this->loginATTB();
            $this->updateOrCreateMansion($article, $tries + 1);
        }
        logAtHome("[updateOrCreateMansion Function] End");
    }

    private function updateOrCreate($article, array $options)
    {
        logAtHome("[updateOrCreate Function] Start checklog");
        $user = $this->user;
        $shop = MstStore::getStoreCode($user->store_id);

        $pageUrl = Arr::get($options, 'page_url');
        $pageData = Arr::get($options, 'page_data');

        $response = $this->goToPage($pageUrl, $pageData);
        $hiddenInputs = $this->parseHiddenInputInMainForm($response);
        if(empty($hiddenInputs)) return false;

        $requestFileName = Arr::get($options, 'request_file');
        $converter = Arr::get($options, 'converter');

        $defaultData = $this->getDefaultRequestFromFile($requestFileName);

        $this->uploadBukkenGazoIchiran($article, $hiddenInputs);
        $this->uploadBknShuhenKankyoIchiran($article, $hiddenInputs);

        $articleData = $converter::convert($article);
	logAtHome('ArticleData');
        logAtHome(print_r($articleData,true));
	$data = array_merge($defaultData, $hiddenInputs, $articleData);
        $submitUrl = Arr::get($options, 'submit_url');
        $submitData = Arr::get($options, 'submit_referer');


        if($article->athome_no != null) {
            $this->setDefaultValue($data, $article, $options);
            $this->getSetsubiTokkiKubunJikoCode($data, $article);
        }

        //DO NOT OVERWRITE ANY FIELDS HERE
        unset(
            $data['endmukeChukaitesuryoCode'],
            $data['riyoEki1EkiToho'],
            $data['busRiyo1BusJosha'],
	    $data['riyoEki1EkiCode'],
            $data['riyoEki1EnsenCode'],
            $data['riyoEki1EkiCode'],
            $data['endmukeChukaitesuryoRitsuDetail'],
            $data['endmukeChukaitesuryoGakuDetail'],
            $data['kojikanryoYoteiYyyy'],
            $data['kojikanryoYoteiMm'],
            $data['endmukeChukaitesuryoRitsu'],
            $data['endmukeChukaitesuryoGaku'],
            $data['sonotaShozaichi'],
            $data['nobeMenseki'],
            $data['staffId']
        );

        if(empty($data['setsubiTokkiKubunJikoCode'])){
            unset($data['setsubiTokkiKubunJikoCode']);
        }

        $response = $this->submit($submitUrl, $submitData, $data, false, true);

        if(strpos($response, '物件情報を登録してよろしいですか？') ||
            strpos($response, '物件情報を更新してよろしいですか？')) {
            $confirmUrl = Arr::get($options, 'confirm_url');
            $confirmReferer = Arr::get($options, 'confirm_referer');
            logAtHome("[updateOrCreate Function] Would you like to register the property information? ");
            $response = $this->submitConfirm($confirmUrl, $confirmReferer, $response);
        }
        $this->log($response);
        $atHomeNo = $this->getAtHomeNo($response);
        $this->info('Athome No: '.$atHomeNo);

        Storage::disk('public')->put('athome.html', $response);

        $formPattern = '/<a.*?class=\'error_link\'.*?>(.*?)<\/a>/';
        preg_match_all($formPattern, $response, $formMatches);
        if(count($formMatches) > 1 && !empty($formMatches[1])){
            if(empty($formMatches[1]) == true){
                $formPattern = '/<a.*?class=\'error_link\'.*?>(.*?)<\/a>/';
                preg_match_all($formPattern, $response, $formMatches);
            }

            $error = '';
            foreach ($formMatches[1] as $i => $er){
                $j = $i+1;
                $error .= '<br>'.$j.'. '.trim($er);
            }
            if($error != ''){
                session()->flash('message_modal', '<strong>入稿できませんでした。物件詳細ページを見直してください。</strong>'.$error);
            }
        }else{
            if(!empty($atHomeNo)) {
                if(!strpos($atHomeNo, 'input')) {
                    PortalStatusArticle::where('portal_id', $article->athome_no)->where('portal_type', 3)->delete();

                    $save_data = [
                        'article_id'    =>  $article->building_id,
                        'portal_id'     =>  $atHomeNo,
                        'portal_user'   =>  $shop->athome_id,
                        'portal_type'   =>  3
                    ];
                    PortalStatusArticle::insert($save_data);
                }
            }
            session()->flash('message_ok', 'at home に入稿されました。');
        }
        logAtHome("[updateOrCreate Function] End");
        return true;
    }


    private function parseHiddenInputInMainForm($response)
    {
        $formPattern = '/<form.*?id="bfbk103s".*?>(.*?)<\/form>/s';
        preg_match($formPattern, $response, $formMatches);

        if(count($formMatches) < 2) return [];

        $hiddenInputPattern = '/<input.*?type="hidden".*?name="(?<name>.*?)".*?value="(?<value>.*?)".*?>/';
        preg_match_all($hiddenInputPattern, $formMatches[0], $inputMatches, PREG_SET_ORDER);

        if(count($inputMatches) < 2) return [];

        return collect($inputMatches)
            ->pluck('value', 'name')
            ->toArray();
    }

    private function getAtHomeNo($response)
    {
        $noPattern = '/<input\stype="hidden"\sname="bukkenId"\sid="bukkenId" value="(.+?)"(?:.*?)>/s';
        preg_match($noPattern, $response, $noMatches);
        $noPattern1 = '/<input\stype="hidden"\sname="bukkenId"\svalue="(.+?)"(?:.*?)>/s';
        preg_match($noPattern1, $response, $noMatches1);


        $bukkenId = array_merge($noMatches, $noMatches1);
        return count($bukkenId) >= 2 ? $bukkenId[1] : null;
    }

    private function getDefaultRequestFromFile($filename)
    {
        $content = Storage::get(self::DIRECTORY.'/'.$filename);

        return json_decode(urldecode($content), true);
    }

    private function submit($url, $referer, array $data, $upload = false, $fromFn = null)
    {
        logAtHome("[submit Function] url: $url");
        $curl = $this->initDefaultCurl();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_POST, true);
        curl_setopt($curl, CURLOPT_POSTFIELDS, $upload ? $data : $this->httpBuildQuery($data));
        curl_setopt($curl, CURLOPT_REFERER, $referer);
        curl_setopt($curl, CURLOPT_MAXREDIRS, 10);
        curl_setopt($curl, CURLOPT_AUTOREFERER, true);
        if (curl_errno($curl)) {
            logAtHome("[submit Function] error: " .curl_error($curl));
        }
        logAtHome("[submit Function] result with status code: " . curl_getinfo($curl, CURLINFO_HTTP_CODE));

        if($fromFn) {
            logAtHome("[submit Function] result from api: " . curl_exec($curl));
        }
        return curl_exec($curl);
    }

    private function submitConfirm($url, $referer, $preSubmitResponse)
    {
        $formPattern = '/<form(?:.*?)name="bfbk104s"(?:.*?)>(.*?)<\/form>/s';
        preg_match($formPattern, $preSubmitResponse, $formMatches);

        if(empty($formMatches)) return $preSubmitResponse;

        $inputPattern = '/<input(?:.*?)type=(?:"|\')hidden(?:"|\')(?:.*?)name=(?:"|\')(?<name>.*?)(?:"|\')(?:.*?)value=(?:"|\')(?<value>.*?)(?:"|\')(?:.*?)>/s';
        preg_match_all($inputPattern, $formMatches[0], $inputMatches, PREG_SET_ORDER);

        $data = collect($inputMatches)
            ->pluck('value', 'name')
            ->toArray();

        return $this->submit($url, $referer, $data);
    }

    private function httpBuildQuery(array $queries)
    {
        $data = [];
        foreach($queries as $key => $value) {
            if(is_array($value)) {
                foreach($value as $subValue) {
                    $data[] = urlencode($key).'='.urlencode($subValue);
                }
            } else {
                if ($key == 'yotoChikiCode2') {
                    $key = 'yotoChikiCode';
                }
                $data[] = urlencode($key).'='.urlencode($value);
            }
        }
        return implode('&', $data);
    }

    private function getArticleAthome($options) {
        //dd($options);
        $data = $options['page_data'];
        $url = $options['submit_referer'];
        $curl = $this->initDefaultCurl();
        //dd(1);
        curl_setopt($curl, CURLOPT_URL, $url);

        if($data != null) {
            curl_setopt($curl, CURLOPT_POST, true);
            curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($data));
        }

        $response = curl_exec($curl) or die('error ' . curl_error($curl)); // cURLセッションの実行

        //$response = mb_convert_encoding($response, "UTF-8", "EUC-JP");

        $input = $this->parseDataInMainForm($response, 'input');
        //dd($input);
        $radio = $this->parseDataInMainForm($response, 'radio');

        $radio1 = $this->parseDataInMainForm($response, 'radio1');

        $textarea = $this->parseDataInMainForm($response, 'textarea');
        $new_area = [];
        foreach ($textarea as $key => $area){
            $new_area[$key] = trim($area);
        }
        $textarea = $new_area;
        $select = $this->parseDataInMainForm($response, 'select');

        return array_merge($input, $radio, $radio1, $textarea, $select);
    }

    private function parseDataInMainForm($response, $type)
    {
        $formPattern = '/<form.*?id="bfbk103s".*?>(.*?)<\/form>/s';
        preg_match($formPattern, $response, $formMatches);

        if(count($formMatches) < 2) return [];
        switch ($type) {
            case 'input':
                $pattern = '/<input type="text".*?name="(?<name>.*?)".*?value="(?<value>.*?)".*?>/s';
                preg_match_all($pattern, $formMatches[0], $matches, PREG_SET_ORDER);
                break;
            case 'radio':
                $formMatches1 = str_replace('.checked', '', $formMatches[0]);
                $pattern = '/<input\b(?=[^>]*name="(?<name>.*?)")[^>]*\bvalue="(?<value>.*?)"[^>]*\bchecked/i';
                preg_match_all($pattern, $formMatches1, $matches, PREG_SET_ORDER);
                break;
            case 'radio1':
                $pattern = '/<input\b(?=[^>]*name="(?<name>.*?)")[^>]*\bchecked[^>]*\bvalue="(?<value>.*?)"/i';
                preg_match_all($pattern, $formMatches[0], $matches, PREG_SET_ORDER);
                break;
            case 'textarea':
                $pattern = '/<textarea.*?name="(?<name>.*?)".*?>(?<value>.*?)<\/textarea>/s';
                preg_match_all($pattern, $formMatches[0], $matches, PREG_SET_ORDER);
                break;
            case 'select':
                $matches = $this->parseSelectInMainForm($formMatches);
                break;
        }

        if (!isset($matches)) return [];
        if($type == 'radio'){
            $data = [];

            foreach ($matches as $mt){
                $data = array_merge_recursive(array(
                    $mt['name'] => $mt['value']
                ), $data);
            }
            return $data;
        }

        return collect($matches)
            ->pluck('value', 'name')
            ->toArray();
    }
    private function parseSelectInMainForm($formMatches)
    {
        $patternSelecte = '/<select.*?name="(?<name>.*?)".*?>([\S\s]*?)<\/select>/';

        preg_match_all($patternSelecte, $formMatches[0], $selectMatches, PREG_SET_ORDER);
        $patternOption = '/<option.*?value="(?<value>.*?)".*?selected.*?>/';
        $patternOption_no = '/<option value="(?<value>[^>]*?)" selected="selected">/';

        foreach ($selectMatches as $key => $value) {

            preg_match_all($patternOption, $value[0], $optionMatches, PREG_SET_ORDER);

            if (isset($optionMatches[0])) {
                preg_match_all('/option/i', $optionMatches[0][0], $check_op);
            }
            if(isset($check_op) && count($check_op[0]) > 1){
                preg_match_all($patternOption_no, $value[0], $optionMatches, PREG_SET_ORDER);
            }

            if (isset($optionMatches[0])) {
                $selectMatches[$key]['value'] =  $optionMatches[0]['value'];
            } else {
                unset($selectMatches[$key]);
            }

        }
        return $selectMatches;
    }
    private function setDefaultValue(&$data, $article, $options) {
        // Remove default value 'tochiKenriCode', shakuchiryo, shakuchiryoNashiFlag, tochiKenriShakuchiKikanYyyy
        //tochiKenriShakuchiKikanMm, tochiKenriHoshokin, tochiKenriKenrikin, kokudohoCode
        if(in_array($article->property, [1,2,3])) {
            $fields = ['kaiinmukeKukakuHihyojiFlag', 'kukakuHihyojiFlag', 'chiban', 'chibanHihyojiFlag', 'chizuKensakuHikokaiFlag', 'ekiJidoshaFun', 'sonotaKotsuShudan', 'keiyakuKikanTeishakuYyyy',
                'keiyakuKikanTeishakuMm', 'keiyakuKikanTeishakuDd', 'onsenHikikomiJokyoCode', 'onsenHikikomiZumiCode', 'onsenRiyoKeitaiCode', 'onsenHiyoTo', 'saitekiYotoCode', 'kadochi', 'setsudoJokyoIchiranElement[3].setsudoJokyoHoi',
                'kokokuTensaiKubun', 'kokokuhiShuruiKubun', 'kokokuhiJogenKingaku', 'kokokuhiJogenRitsu', 'kaiinKanMsgFree', 'kyakuzukeHoshuNashiFlag', 'tesuryoCode', 'tesuryoRitsu', 'tesuryoGaku',
                'athomeBiko', 'label', 'bukkenMemo', 'infoCatchJodan', 'infoCatchGedan', 'sonotaIchijikinUmuFlag'];
            for ($i = 0; $i <= 4; $i++){
                $fields[] = 'sonotaIchijikinIchiranElement['.$i.'].ichijikinName';
                $fields[] = 'sonotaIchijikinIchiranElement['.$i.'].ichijikinKingaku';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningName';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningGetsugaku';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningShiharaiTani';
            }
            for ($i = 0; $i <= 7; $i++){
                $fields[] = 'madoriYoIchiranElement['.$i.'].madoriMadoriUchiwakeJo';
                $fields[] = 'madoriWaIchiranElement['.$i.'].madoriMadoriUchiwakeJo';
            }
            if($article->land_condition1 == 0){
                $fields[] = 'chiseiCode';
            }
            // $fields[] = 'kokudohoCode';
        } elseif(in_array($article->property, [4,5])) {
            // Remove default value 'tochiKenriCode', shakuchiryo, shakuchiryoNashiFlag, tochiKenriShakuchiKikanYyyy
            //tochiKenriShakuchiKikanMm, tochiKenriHoshokin, tochiKenriKenrikin, kokudohoCode, , 'endmukeChukaitesuryoCode', setsubiTokkiKubunJikoCode, endmukeChukaitesuryoRitsu, endmukeChukaitesuryoGaku
            $fields = ['kaiinmukeTatemonoHihyojiFlag', 'tatemonoHihyojiFlag', 'tatemonoNameFurigana', 'gotoNumber', 'kaiinmukeGotoHihyojiFlag', 'gotoHihyojiFlag', 'chiban', 'chibanHihyojiFlag', 'chizuKensakuHikokaiFlag',
                'ekiJidoshaFun', 'sonotaKotsuShudan', 'sekoGaisha', 'keiyakuKikanTeishakuYyyy', 'keiyakuKikanTeishakuMm', 'keiyakuKikanTeishakuDd', 'soteiYachinShunyu', 'soteiRimawari', 'kashihokenDokujiCode',
                'kashiHoshoKikanYyyy', 'kashiHoshoKikanMm', 'kashiHoshoHaniShosai', 'kashiHoshoKensaJissibiYyyy', 'kashiHoshoKensaJissibiMm', 'kashiHoshoKensaJissibiDd', 'kashiHoshoKainushiFutanNashiFlag', 'kashihokenKensakijyunTekigoFlag', 'kashihokenKokkoshoHoshoCode',
                'kashiHokenKikanYyyy', 'kashiHokenKikanMm', 'kashiHokenHaniShosai', 'kashiHokenKensaJissibiYyyy', 'kashiHokenKensaJissibiMm', 'kashiHokenKensaJissibiDd', 'kashiHokenKainushiFutanNashiFlag', 'kashiHoshoHani', 'kashiHokenHani',
                'inspectionCode', 'inspectionYyyy', 'inspectionMm', 'inspectionDd', 'inspectionHokokusho', 'inspectionKainushiFutanNashiFlag', 'sonotaIchijikinUmuFlag', 'chokiYuryoJutakuKubun',
                'chokiYuryoJutakuKensaJissibiYyyy', 'chokiYuryoJutakuKensaJissibiMm', 'chokiYuryoJutakuKensaJissibiDd', 'chokiYuryoJutakuZokaichikuFlag', 'chokiYuryoJutakuZokaichikuYyyy', 'chokiYuryoJutakuZokaichikuMm', 'chokiYuryoJutakuZokaichikuDd', 'chokiYuryoJutakuZokaichikuKashoto',
                'flat35TekigoKubun', 'flat35TekigoKensaJissibiYyyy', 'flat35TekigoKensaJissibiMm', 'flat35TekigoKensaJissibiDd', 'flat35STekigoKubun', 'flat35STekigoKensaJissibiYyyy', 'flat35STekigoKensaJissibiMm', 'flat35STekigoKensaJissibiDd',
                'taishinKijunTekigoKubun', 'taishinKijunTekigoKensaJissibiYyyy', 'taishinKijunTekigoKensaJissibiMm', 'taishinKijunTekigoKensaJissibiDd', 'hoTekigoJokyoChosaKubun', 'hoTekigoJokyoChosaKensaJissibiYyyy', 'hoTekigoJokyoChosaKensaJissibiMm', 'hoTekigoJokyoChosaKensaJissibiDd',
                'kenchikushiTatemonoKensaKubun', 'kenchikushiTatemonoKensaJissibiYyyy', 'kenchikushiTatemonoKensaJissibiMm', 'kenchikushiTatemonoKensaJissibiDd', 'onsenHikikomiJokyoCode', 'onsenHikikomiZumiCode', 'onsenRiyoKeitaiCode', 'onsenHiyoTo',
                'kadochi', 'setsudoJokyoIchiranElement[3].setsudoJokyoHoi', 'madoriMadoriUchiwakeJo', 'madoriServiceRoomIchiranElement[0].madoriMadoriUchiwakeJo', 'madoriServiceRoomIchiranElement[1].madoriMadoriUchiwakeJo',
                'kyakuzukeHoshuNashiFlag', 'tesuryoCode', 'kokokuTensaiKubun', 'kokokuhiShuruiKubun', 'kokokuhiJogenKingaku', 'kokokuhiJogenRitsu', 'kaiinKanMsgFree',
                'athomeBiko', 'label', 'bukkenMemo', 'infoCatchJodan', 'infoCatchGedan', 'bunjoJutakuUmu', 'setsubihoshoCode'];
            for ($i = 0; $i <= 4; $i++){
                $fields[] = 'sonotaIchijikinIchiranElement['.$i.'].ichijikinName';
                $fields[] = 'sonotaIchijikinIchiranElement['.$i.'].ichijikinKingaku';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningName';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningGetsugaku';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningShiharaiTani';
            }
            for ($i = 0; $i <= 7; $i++){
                $fields[] = 'madoriYoIchiranElement['.$i.'].madoriMadoriUchiwakeJo';
                $fields[] = 'madoriWaIchiranElement['.$i.'].madoriMadoriUchiwakeJo';
            }
            if($article->land_condition1 == 0){
                $fields[] = 'chiseiCode';
            }
            // $fields[] = 'kokudohoCode';
        } else {
            $fields = ['kaiinmukeTatemonoHihyojiFlag', 'tatemonoHihyojiFlag', 'tatemonoNameFurigana', 'chiban', 'chibanHihyojiFlag', 'chizuKensakuHikokaiFlag', 'ekiJidoshaFun', 'sonotaKotsuShudan',
                'nobeMenseki', 'keiyakuKikanTeishakuYyyy', 'keiyakuKikanTeishakuMm', 'keiyakuKikanTeishakuDd', 'soteiYachinShunyu', 'bikeCode', 'churinjoCode', 'sonotaIchijikinUmuFlag',
                'chokiYuryoJutakuKubun', 'chokiYuryoJutakuKensaJissibiYyyy', 'chokiYuryoJutakuKensaJissibiMm', 'chokiYuryoJutakuKensaJissibiDd', 'chokiYuryoJutakuZokaichikuFlag', 'chokiYuryoJutakuZokaichikuYyyy', 'chokiYuryoJutakuZokaichikuMm', 'chokiYuryoJutakuZokaichikuDd', 'chokiYuryoJutakuZokaichikuKashoto',
                'flat35TekigoKubun', 'flat35TekigoKensaJissibiYyyy', 'flat35TekigoKensaJissibiMm', 'flat35TekigoKensaJissibiDd', 'flat35STekigoKubun', 'flat35STekigoKensaJissibiYyyy', 'flat35STekigoKensaJissibiMm', 'flat35STekigoKensaJissibiDd',
                'taishinKijunTekigoKubun', 'taishinKijunTekigoKensaJissibiYyyy', 'taishinKijunTekigoKensaJissibiMm', 'taishinKijunTekigoKensaJissibiDd', 'hoTekigoJokyoChosaKubun', 'hoTekigoJokyoChosaKensaJissibiYyyy', 'hoTekigoJokyoChosaKensaJissibiMm', 'hoTekigoJokyoChosaKensaJissibiDd',
                'kenchikushiTatemonoKensaKubun', 'kenchikushiTatemonoKensaJissibiYyyy', 'kenchikushiTatemonoKensaJissibiMm', 'kenchikushiTatemonoKensaJissibiDd', 'onsenHikikomiJokyoCode', 'onsenHikikomiZumiCode' , 'onsenRiyoKeitaiCode', 'onsenHiyoTo',
                'soteiRimawari', 'kashihokenDokujiCode', 'kashiHoshoKikanYyyy', 'kashiHoshoKikanMm', 'kashiHoshoHani', 'kashiHoshoHaniShosai', 'kashiHoshoKensaJissibiYyyy', 'kashiHoshoKensaJissibiMm', 'kashiHoshoKensaJissibiDd', 'kashiHoshoKainushiFutanNashiFlag',
                'kashihokenKensakijyunTekigoFlag', 'kashihokenKokkoshoHoshoCode', 'kashiHokenKikanYyyy', 'kashiHokenKikanMm', 'kashiHokenHani', 'kashiHokenHaniShosai', 'kashiHokenKensaJissibiYyyy', 'kashiHokenKensaJissibiMm', 'kashiHokenKensaJissibiDd', 'kashiHokenKainushiFutanNashiFlag',
                'inspectionCode', 'inspectionYyyy', 'inspectionMm', 'inspectionDd', 'inspectionHokokusho', 'inspectionKainushiFutanNashiFlag', 'setsubihoshoCode', 'petKogatakenKaFlag', 'petOhgatakenKaFlag', 'petNekoKaFlag', 'petSodanNaiyo', 'madoriMadoriUchiwakeJo', 'madoriServiceRoomIchiranElement[0].madoriMadoriUchiwakeJo', 'madoriServiceRoomIchiranElement[1].madoriMadoriUchiwakeJo', 'kokokuTensaiKubun', 'kokokuhiShuruiKubun', 'kokokuhiJogenKingaku', 'kokokuhiJogenRitsu', 'kaiinKanMsgFree',
                'kyakuzukeHoshuNashiFlag', 'tesuryoCode', 'tesuryoRitsu', 'tesuryoGaku', 'athomeBiko', 'label', 'bukkenMemo', 'infoCatchJodan', 'infoCatchGedan', 'bunjoKyodoJutakuUmu',
                'bunjoKyodoJutakuHanbaiKosu', 'bunjoKyodoJutakuHanbaiKakakutaiFrom', 'bunjoKyodoJutakuHanbaiKakakutaiTo', 'bunjoKyodoJutakuHanbaiKakakutaiKosuFrom', 'bunjoKyodoJutakuHanbaiKakakutaiKosuTo', 'bunjoKyodoJutakuSaitaKakakutai', 'bunjoKyodoJutakuSaitaKakakutaiKosu',
                'bunjoKyodoJutakuHanbaiSenyuMensekitaiFrom', 'bunjoKyodoJutakuHanbaiSenyuMensekitaiTo', 'bunjoKyodoJutakuKanrihiGetsugakuFrom', 'bunjoKyodoJutakuKanrihiGetsugakuTo', 'tsumitatekinRunningFrom', 'tsumitatekinRunningTo'];
            for ($i = 0; $i <= 4; $i++){
                $fields[] = 'sonotaIchijikinIchiranElement['.$i.'].ichijikinName';
                $fields[] = 'sonotaIchijikinIchiranElement['.$i.'].ichijikinKingaku';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningName';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningGetsugaku';
                $fields[] = 'sonotaRunningIchiranElement['.$i.'].sonotaRunningShiharaiTani';
            }
            for ($i = 0; $i <= 7; $i++){
                $fields[] = 'madoriYoIchiranElement['.$i.'].madoriMadoriUchiwakeJo';
                $fields[] = 'madoriWaIchiranElement['.$i.'].madoriMadoriUchiwakeJo';
            }
            $mansion = Article::getParentMansion($article->mansion_id);
        }
        $data_post = $this->getArticleAthome($options);

        foreach ($fields as $field) {
            /*if($field == 'kanriJohoKanriKeitaiKubun'){
                $data['kanriJohoKanriKeitaiKubun'] = '';
                if($data_post[$field] == 2 || $data_post[$field] == 3){
                    $data['kanriJohoKanriKeitaiKubun'] = $data_post[$field] ?? '';
                }
            }else{
                $data[$field] = $data_post[$field] ?? '';
            }*/
            $data[$field] = $data_post[$field] ?? '';
        }

        if(isset($mansion)){
            foreach ($mansion->shareds as $shared) {
                $shared_id = $shared->item_id;
                switch ($shared_id) {
                    case 1:
                        $data['setsubiTokkiKubunJikoCode'][] = "0139";
                        break;
                    case 2:
                        $data['setsubiTokkiKubunJikoCode'][] = "1102";
                        break;
                    case 4:
                        $data['setsubiTokkiKubunJikoCode'][] = "0015";
                        break;
                    case 5:
                        $data['setsubiTokkiKubunJikoCode'][] = "0061";
                        break;
                    case 6:
                        $data['setsubiTokkiKubunJikoCode'][] = "0116";
                        break;
                    case 8:
                        $data['setsubiTokkiKubunJikoCode'][] = "0018";
                        break;

                }
            }
            if($article->loof_balcony_area == 1){
                $data['setsubiTokkiKubunJikoCode'][] = "0097";
            }
            if($article->terrace_area == 1){
                $data['setsubiTokkiKubunJikoCode'][] = "0050";
            }
            if($article->garden_area == 1){
                $data['setsubiTokkiKubunJikoCode'][] = "0098";
            }
            switch ($mansion->gas) {
                case 1:
                    $data['setsubiTokkiKubunJikoCode'][] = "0016";
                    break;
                case 2:
                    $data['setsubiTokkiKubunJikoCode'][] = "0017";
                    break;
                case 3:
                    $data['setsubiTokkiKubunJikoCode'][] = "0017";
                    break;
                case 4:
                    $data['setsubiTokkiKubunJikoCode'][] = "1066";
                    break;
            }
        }else{
            switch ($article->gas) {
                case 1:
                    $data['setsubiTokkiKubunJikoCode'][] = "0016";
                    break;
                case 2:
                    $data['setsubiTokkiKubunJikoCode'][] = "0017";
                    break;
                case 3:
                    $data['setsubiTokkiKubunJikoCode'][] = "0017";
                    break;
            }
            switch ($article->water_supply) {
                case 1:
                    $data['setsubiTokkiKubunJikoCode'][] = "0002";
                    break;
                case 2:
                    $data['setsubiTokkiKubunJikoCode'][] = "0002";
                    break;
            }
            if($article->sewerage == 1){
                $data['setsubiTokkiKubunJikoCode'][] = "0003";
            }
            if($article->sewerage == 2 || $article->sewerage == 3){
                $data['setsubiTokkiKubunJikoCode'][] = "0004";
            }
        }
        if(in_array($article->leasehold_kind, [1,2,5,6])){
            $data['keiyakuKikanTeishakuYyyy'] = '';
            $data['keiyakuKikanTeishakuMm'] = '';
            $data['keiyakuKikanTeishakuDd'] = '';
        }
        if(in_array($article->leasehold_kind, [3,4])){
            $data['tochiKenriCode'] = '07';
        }
        if(in_array($article->leasehold_kind, [7,8])){
            $data['tochiKenriCode'] = '05';
        }
    }

    private function uploadBukkenGazoIchiran($article, &$hiddenInputs) {
        logAtHome("[uploadBukkenGazoIchiran Function] Start");
        $url = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk086s005?operation=SINGLE_BUTTON';
        $referer = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';
        $countBukkenGazoIchiran= 0;
        $countTsuikaGazoIchiran= 0;
        $listImages = $article->relationPortalPhotos()->type(config('const.ATHOME'))->del(0)->limit(40)->get();
        $forListSerialNo = 1;
        $setForListSerialNo = true;
        $subCategory = ['topographic_map', 'appearance', 'interior', 'living', 'kitchen', 'bath', 'toilet', 'lavatory', 'storage', 'facilities', 'entrance_hall', 'balcony', 'garden', 'view', 'surrounding_env', 'entrance', 'map', 'parking', 'common_areas', 'etc'];
        foreach ($listImages as $key => $image) {
            $imagePath = storage_path() . "/app/" . $image->file_path;
            // $data['filePath'] = new \CURLFile($imagePath, "image/jpeg");
            $data['filePath'] = curl_file_create($imagePath, "image/jpeg", $imagePath);
            $data['serialNo'] = $key < 16 ? $countBukkenGazoIchiran+1 : $countTsuikaGazoIchiran+101;
            $data['sansyoUrl'] = 'undefined';
            $data['predictionBukkenShumokuCode'] = '0201';
            $response = $this->submit($url, $referer, $data, true);
            preg_match("/\{viewModel:(.*)\}/", $response, $matches);
            $viewModel = (array)json_decode($matches[1]);
            if ($key < 6 && $setForListSerialNo && $image->status == 1) {
                $forListSerialNo = $key + 1;
                $setForListSerialNo = false;
            }
            if ($key < 16) {
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].serialNo'] = $viewModel['serialNo'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].gazoSyurui'] = $viewModel['gazoSyurui'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].gazoCaption'] = $image->memo;
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].status'] = $viewModel['status'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].gazoId'] = $viewModel['gazoId'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].sansyoUrl'] = $viewModel['torokuGazoIcon'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].gazoJohoHenkoFlg'] = 'true';
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].subCategory'] = $subCategory[selectedPhotoPropertyAthome($image->facility, $image->property_sub, $article->property, $image->type_upload, $image->mansion) - 1] ?? '';
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].rotate'] = '0';
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].gazoSatsueibiYyyy'] = date('Y', strtotime($image->created_at));
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].gazoSatsueibiMm'] = date('m', strtotime($image->created_at));
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].gazoSatsueibiDd'] = date('d', strtotime($image->created_at));
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].copysakiSerialNo'] = $viewModel['serialNo'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].createAt'] = $viewModel['createAt'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].updateAt'] = $viewModel['updateAt'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].imageFormat'] = $viewModel['imageFormat'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].dataOrigin'] = $viewModel['dataOrigin'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].height'] = $viewModel['height'];
                $hiddenInputs['bukkenGazoIchiran['.$countBukkenGazoIchiran.'].width'] = $viewModel['width'];
                $countBukkenGazoIchiran ++;
            } else {
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].serialNo'] = $viewModel['serialNo'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].gazoSyurui'] = $viewModel['gazoSyurui'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].gazoCaption'] = !empty($image->memo) ? $image->memo : '';
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].status'] = $viewModel['status'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].gazoId'] = $viewModel['gazoId'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].sansyoUrl'] = $viewModel['torokuGazoIcon'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].gazoJohoHenkoFlg'] = 'false';
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].subCategory'] = $subCategory[selectedPhotoPropertyAthome($image->facility, $image->property_sub, $article->property, $image->type_upload, $image->mansion) - 1] ?? '';
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].rotate'] = '0';
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].gazoSatsueibiYyyy'] = date('Y', strtotime($image->created_at));
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].gazoSatsueibiMm'] = date('m', strtotime($image->created_at));
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].gazoSatsueibiDd'] = date('d', strtotime($image->created_at));
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].copysakiSerialNo'] = $viewModel['serialNo'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].createAt'] = $viewModel['createAt'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].updateAt'] = $viewModel['updateAt'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].imageFormat'] = $viewModel['imageFormat'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].dataOrigin'] = $viewModel['dataOrigin'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].height'] = $viewModel['height'];
                $hiddenInputs['tsuikaGazoIchiran['.$countTsuikaGazoIchiran.'].width'] = $viewModel['width'];
                $countTsuikaGazoIchiran++;
            }
        }
        $hiddenInputs['forListSerialNo'] = $forListSerialNo;
        logAtHome("[uploadBukkenGazoIchiran Function] END");
    }

    private function uploadBknShuhenKankyoIchiran($article, &$hiddenInputs) {
        logAtHome("[uploadBknShuhenKankyoIchiran Function] Start");
        $url = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk086s005?operation=SINGLE_BUTTON';
        $referer = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk104s003';
        $countImage= 0;
        $listImages = $article->relationPortalFacility()->type(config('const.ATHOME'))->del(0)->limit(8)->get();
        $shuhenShubetsuCode = ['001', '002', '003', '004', '005', '006', '007', '008', '009', '010', '011', '012', '013', '014', '015', '016', '017', '018', '999'];
        foreach ($listImages as $key => $image) {
            $imagePath = storage_path() . "/app/" . $image->file_path;
            $data['filePath'] = new \CURLFile($imagePath, "image/jpeg");
            $data['serialNo'] = $countImage+17;
            $data['sansyoUrl'] = 'undefined';
            $response = $this->submit($url, $referer, $data, true);
            preg_match("/\{viewModel:(.*)\}/", $response, $matches);
            $viewModel = (array)json_decode($matches[1]);
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].edaban'] = $countImage+1;
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].shuhenShubetsuCode'] = $shuhenShubetsuCode[selectedFacilityAthome($image->type_upload, $image->facility_property) - 1] ?? '';
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].shuhenKankyoName'] = $image->facility_name;
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].shuhenKankyoKyori'] = $image->distance;
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].ido'] = '';
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].keido'] = '';
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].serialNo'] = $viewModel['serialNo'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].gazoSyurui'] = $viewModel['gazoSyurui'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].gazoCaption'] = '';
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].status'] = $viewModel['status'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].gazoId'] = $viewModel['gazoId'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].sansyoUrl'] = $viewModel['torokuGazoIcon'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].gazoJohoHenkoFlg'] = 'false';
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].subCategory'] = $viewModel['predictedSubCategory'] ?? '';
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].rotate'] = '0';
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].gazoSatsueibiYyyy'] = date('Y', strtotime($image->created_at));
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].gazoSatsueibiMm'] = date('m', strtotime($image->created_at));
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].gazoSatsueibiDd'] = date('d', strtotime($image->created_at));
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].copysakiSerialNo'] = $viewModel['serialNo'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].createAt'] = $viewModel['createAt'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].updateAt'] = $viewModel['updateAt'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].imageFormat'] = $viewModel['imageFormat'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].dataOrigin'] = $viewModel['dataOrigin'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].height'] = $viewModel['height'];
            $hiddenInputs['bknShuhenKankyoIchiran['.$countImage.'].width'] = $viewModel['width'];
            $countImage ++;
        }
        logAtHome("[uploadBknShuhenKankyoIchiran Function] End");
    }
    private function hankyoOpen() {
        $url = 'https://members.athome.jp/hankyoPlus?from=global_menu_accesslogHankyo';
        $response = $this->submit($url, 'https://members.athome.jp/portal', [], false, true );
        preg_match('/token=(.*)/', $response, $matches);
        $token = $matches[1];
        $this->hankyoLogin(trim($token));
        $this->hankyoSearch();
    }

    private function hankyoLogin($token) {
        $url = 'https://hankyo-plus.athome.jp/backend/auth/login';
        $referer = "https://hankyo-plus.athome.jp/login?token=$token";
        $data['sso_token'] = $token;
        $this->submit($url, $referer, $data, false, true);
    }

    private function hankyoSearch() {
        $url2 = 'https://hankyo-plus.athome.jp/backend/useract/inquiries/search';
        $referer = "https://hankyo-plus.athome.jp/list";
        $data['from'] = '20211001';
        $data['to'] = '20211109';
        $response = $this->submit($url2, $referer, $data, false, true );
        dd($response);
    }

    private function statusCheck($article) {
        /*$url = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s031';
        $response = $this->submit($url, 'https://atbb.athome.co.jp/front-web/mainservlet/bfcm004s001?hsid=b0b2d886bca918220945d544e84c03d8', ['bukkenId' => $article->athome_no, 'bukkenVersionNumber' => 2], false, true );
        //preg_match('/token=(.*)/', $response, $matches);*/
        $data = [
            'bukkenId' => $article->athome_no,
            'bukkenVersionNumber' => 4,
            'chofukuKakuninzumiFlag'    =>  false,
            'openDialogFlag'    =>  '',
            'kokaiSeigyoMode'   =>  1,
            'kokaisakiHenkou'   =>  '',
            'quick2jiKokokuFlag'    =>  '',
            'anchorBukkenId'    =>  '',
            'quick2jiKokokuErFlag'  =>  '',
            'takkenKyokaiSystemKokaiBToBKokaiDisabledFlag'  =>  '',
            'globalKokai'   =>  1
        ];
        $url = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk059s003';
        $response = $this->submit($url, 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s031', $data, false, true);
        Storage::disk('public')->put('athome.html', $response);die;
    }
    function getSetsubiTokkiKubunJikoCode(&$data, $article){
        $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';

        $options['page_data'] = [
            'bukkenId' => $article->athome_no,
            'bukkenVersionNumber' => 1,
            'jishaTashaKubun' => 1,
            'sousaBunrui' => 5
        ];

        $pageUrl = Arr::get($options, 'page_url');
        $pageData = Arr::get($options, 'page_data');

        $internalErrors = libxml_use_internal_errors(true);
        $dom = new DOMDocument();
        $response = $this->goToPage($pageUrl, $pageData);
        $this->log($response);
        $dom->loadHTML((string)$response);
        $xpath = new DOMXPath($dom);
        $nodes = $xpath->query("//input[@type='checkbox'][@name='setsubiTokkiKubunJikoCode'][@checked]");

        $arr = [];
        foreach($nodes as $node){
            foreach($node->attributes as $attributes){
                if($attributes->name == 'value'){
                    array_push($arr, $attributes->value);
                }
            }
        }
        libxml_use_internal_errors($internalErrors);
        if(isset($data['setsubiTokkiKubunJikoCode'])){
            $un_ar = ['0016', '0017', '0002', '0003', '0004', '1066', '0139', '1102', '0015', '0061', '0116', '0018', '0097', '0050', '0098'];
            $new_ar = [];
            foreach ($data['setsubiTokkiKubunJikoCode'] as $k){
                if(!in_array($k, $un_ar)){
                    $new_ar[] = $k;
                }
            }
            $arr = array_merge($new_ar, $arr);
        }

        $data['setsubiTokkiKubunJikoCode'] = $arr;
    }
    private function checkStatusId($article) {
        $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';
        $options['page_data'] = [
            'bukkenId' => $article->athome_no,
            'bukkenVersionNumber' => 1,
            'jishaTashaKubun' => 1,
            'sousaBunrui' => 5
        ];

        $pageUrl = Arr::get($options, 'page_url');
        $pageData = Arr::get($options, 'page_data');

        $response = $this->goToPage($pageUrl, $pageData);

        $hiddenInputs = $this->parseHiddenInputInMainForm($response);

        if(empty($hiddenInputs)) {
            return false;
        }
        return true;
    }
    private function checkId($article) {
        $options['page_url'] = 'https://atbb.athome.co.jp/front-web/mainservlet/bfbk030s010';

        $options['page_data'] = [
            'bukkenId' => $article->athome_no,
            'bukkenVersionNumber' => 1,
            'jishaTashaKubun' => 1,
            'sousaBunrui' => 5
        ];

        $pageUrl = Arr::get($options, 'page_url');
        $pageData = Arr::get($options, 'page_data');

        $response = $this->goToPage($pageUrl, $pageData);

        $hiddenInputs = $this->parseHiddenInputInMainForm($response);

        if(empty($hiddenInputs)) {
            if ($article->athome_no != null) {
                PortalStatusArticle::where('portal_id', $article->athome_no)->where('portal_type', 3)->delete();
            }
        }
    }
    function log($res)
    {
        $res = str_replace('../', 'https://atbb.athome.co.jp/front-web/', $res);
        Storage::disk('public')->put('athome_response.html', $res);
    }
}
