<?php

namespace App\Console\Commands;

use App\Models\Article;
use App\Models\MstStore;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class UpdatePortalId extends Command
{
    private $option;
    private $countError;
    private $canRecursive;
    private $type;
    private $textNumber;

    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'update:portal_id {company} {id} {pass}';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'Update Portal public id';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $this->loginHome();
        $company = $this->argument('company');
        $articleList = DB::connection('mysql_cp' . $company)->table('articles')->where('homes_no', '!=', null)
            ->where('status', '!=', 4)
            ->where('status', '!=', 5)
            ->where('del', '=', null)
            ->orderBy('homes_no', 'asc')
            ->get();

        foreach ($articleList as $article) {
            $buildingId = $article->building_id;
            $idMainHome = $this->updateIdMainHome($buildingId);
            $this->info('homes Id:'.$buildingId);
            if ($idMainHome !== 0) {
                if($article->homes_no !== $idMainHome){
                    DB::connection('mysql_cp' . $company)->table('articles')->where('building_id', $buildingId)->update([
                        'homes_no' => $idMainHome
                    ]);
                }
            }
        }
    }
    function loginHome()
    {
        if ($this->countError >= 5) {
            $this->canRecursive = false;
            return;
        }
        // Homesにアクセス
        $this->info("Start login Home");

        $cookie_path = './homes_cookie.txt';
        touch($cookie_path);
//        $id = "takara@wills.co.jp";
//        $pass = "OaOJ0FGg4E";
        $id = $this->argument('id');
        $pass = $this->argument('pass');
//        $shop = MstStore::getDataByCode($user->company_id, $user->store_id);
//        $id = $shop->homes_id;
//        $pass = $shop->homes_pw;

        // cURLセッションの共通オプション
        $option = [
            // CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0',
            CURLOPT_SSL_VERIFYPEER => FALSE,
            CURLOPT_SSL_VERIFYHOST => FALSE,
            CURLOPT_COOKIEJAR => $cookie_path,
            CURLOPT_COOKIEFILE => $cookie_path,
            // CURLOPT_FOLLOWLOCATION => TRUE,
            CURLOPT_HEADER => TRUE,
        ];

        // ログイン画面へアクセス
        $url = "https://homes.force.com/pro/UserLogin";
        $curl = curl_init(); // cURLセッションの初期化
        curl_setopt($curl, CURLOPT_URL, $url); // 取得するURLを指定
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 実行結果を文字列で返す。
        $res = curl_exec($curl) or die('error ' . curl_error($curl)); // cURLセッションの実行

        curl_close($curl);

        // cURLセッション実行結果の解析
        $pattern = '/<form id="(.*?)" name="(.*?)" method="post" action="(.*?)" enctype="application\/x-www-form-urlencoded">/';
        preg_match($pattern, $res, $match1);

        $pattern = '/<input type="hidden"  id="com.salesforce.visualforce.ViewState" name="com.salesforce.visualforce.ViewState" value="(.*?)" \/>/';
        preg_match($pattern, $res, $match2);

        $pattern = '/<input type="hidden"  id="com.salesforce.visualforce.ViewStateVersion" name="com.salesforce.visualforce.ViewStateVersion" value="(.*?)" \/>/';
        preg_match($pattern, $res, $match3);

        $pattern = '/<input type="hidden"  id="com.salesforce.visualforce.ViewStateMAC" name="com.salesforce.visualforce.ViewStateMAC" value="(.*?)" \/>/';
        preg_match($pattern, $res, $match4);


        // ログイン処理
        $url = $match1[3];
        $POST_DATA = [
            $match1[1] => $match1[1],
            'j_id0:j_id13:j_id23' => $id,
            'j_id0:j_id13:j_id25' => $pass,
            'j_id0:j_id13:j_id32' => 'ログイン',
            'com.salesforce.visualforce.ViewState' => $match2[1],
            'com.salesforce.visualforce.ViewStateVersion' => $match3[1],
            'com.salesforce.visualforce.ViewStateMAC' => $match4[1],
        ];

        $curl = curl_init(); // cURLセッションの初期化
        curl_setopt($curl, CURLOPT_URL, $url); // 取得するURLを指定
        curl_setopt($curl, CURLOPT_POST, TRUE);
        curl_setopt($curl, CURLOPT_POSTFIELDS, http_build_query($POST_DATA)); // POST変数をセット
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 実行結果を文字列で返す。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
        $res = curl_exec($curl) or die('error ' . curl_error($curl)); // cURLセッションの実行
        // https://homes.force.com/pro/secur/frontdoor.jspのパラメータ付きURLを取得したいが、Cookieに応じて実行結果が変わる
        // Cookieが無い状態からバッチを起動すると正常処理になるので、Cookieの削除処理を最後に加える？

        // cURLセッション実行結果の解析
        $pattern = '/window\.location\.href =\'(.*?)\';/';
        preg_match($pattern, $res, $match5);

        if ($match5) {
            $url = $match5[1];
        }
        $curl = curl_init(); // cURLセッションの初期化
        curl_setopt($curl, CURLOPT_URL, $url); // 取得するURLを指定
        curl_setopt($curl, CURLOPT_POST, TRUE);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 実行結果を文字列で返す。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
        curl_setopt_array($curl, $option); // 共通オプションの設定
        $res = curl_exec($curl) or die('error ' . curl_error($curl)); // cURLセッションの実行

        curl_close($curl);

        // Homesトップ画面にアクセス
        $url = 'https://homes.force.com/pro/top';
        $curl = curl_init(); // cURLセッションの初期化
        curl_setopt($curl, CURLOPT_URL, $url); // 取得するURLを指定
        curl_setopt($curl, CURLOPT_POST, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 実行結果を文字列で返す。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
        curl_setopt_array($curl, $option); // 共通オプションの設定
        $res = curl_exec($curl) or die('error ' . curl_error($curl)); // cURLセッションの実行
        curl_close($curl);

        // cURLセッション実行結果の解析
        $pattern = '/<p class="thumbnail"><a href="(.*?)" target="_blank"><img src="\/pro\/resource\/(.*?)\/homes_manager_/';
        preg_match($pattern, $res, $match6);

        // LIFULL HOME'S Managerにログイン情報を連携
        if (count($match6) < 2) {
            $res = mb_convert_encoding($res, "UTF-8", "EUC-JP");
            $this->log($res);
            Log::error("Error insert article into Home match6");
            $this->countError++;
            return $this->loginHome();
        }
        $url = $match6[1];
        $curl = curl_init(); // cURLセッションの初期化
        curl_setopt($curl, CURLOPT_URL, $url); // 取得するURLを指定
        curl_setopt($curl, CURLOPT_POST, false);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 実行結果を文字列で返す。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
        curl_setopt_array($curl, $option); // 共通オプションの設定
        $res = curl_exec($curl) or die('error ' . curl_error($curl)); // cURLセッションの実行
        curl_close($curl);

        // cURLセッション実行結果の解析
        $pattern = '/SfdcApp\.projectOneNavigator\.handleRedirect\(\'(.*?)\'\)\; \}  else/';
        preg_match($pattern, $res, $match7);

        if (count($match7) < 2) {
            $res = mb_convert_encoding($res, "UTF-8", "EUC-JP");
            $this->log($res);
            Log::error("Error insert article into Home match7");
            $this->countError++;
            return $this->loginHome();
        }
        $url = $match7[1];
        $curl = curl_init(); // cURLセッションの初期化
        curl_setopt($curl, CURLOPT_URL, $url); // 取得するURLを指定
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); // 実行結果を文字列で返す。
        curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE); // Locationヘッダを追跡
        curl_setopt_array($curl, $option); // 共通オプションの設定
        $res = curl_exec($curl) or die('error ' . curl_error($curl)); // cURLセッションの実行
        curl_close($curl);
    }

    function updateIdMainHome($id)
    {
        $url = 'https://manager.homes.co.jp/index.php';
        $data = [
            'action' => 'sale_list_view',
            'action_type' => '',
            'csv_output_header' => '',
            'tk' => 1,
            'view' => 1,
            'sort_key' => '',
            'sort_order' => '',
            'list_rows' => '',
            'rows_offset' => '',
            'src_pano' => '',
            'src_insp' => '',
            'src_rl' => '',
            'src_staff_comment' => '',
            'src_addr1' => '',
            'src_addr2' => '',
            'src_rosen_addr1' => '',
            'src_rosen' => '',
            'src_eki' => '',
            'src_tiku_from' => '',
            'src_tiku_to' => '',
            'src_walk_from' => '',
            'src_walk_to' => '',
            'src_money_from' => '',
            'src_money_to' => '',
            'src_madori' => '',
            'src_house_area_from' => '',
            'src_house_area_to' => '',
            'src_land_area_from' => '',
            'src_land_area_to' => '',
            'src_gr' => '',
            'src_moto' => '',
            'src_owner' => '',
            'src_b_from' => '',
            'src_b_to' => '',
            'src_l' => $id,
            'src_kyaku' => '',
            'src_advertise' => '',
            'src_saki' => '',
            'src_tt' => '',
            'src_view' => '',
            'src_b_num' => '',
            'src_realtor_info_ex' => '',
            'src_rimawari_from' => '',
            'src_rimawari_to' => '',
            'src_timelimit_end' => '',
            'src_open' => '',
            'src_own' => '',
            'src_toushi_ready' => '',
            'src_toushi_on' => '',
            'src_rakuzuke_bukken' => '',
            'src_own' => '',
            'src_bname' => '',
            'src_tl_date' => '',
            'src_tl_date_type' => 1,
            'src_status' => '',
            'src_keisai' => '',
            'src_photo' => '',
            'up_timelimit_date' => '',
            'up_status' => '',
            'up_keisai' => '',
            'up_recommend_level' => 0,
        ];

        $response = $this->requestWithData($url, http_build_query($data), true, array('Accept: application/form-data'));

        $response = mb_convert_encoding($response, "UTF-8", "EUC-JP");
        $patten = '/<input.*?id="chk_bukken_0".*?value="(?<name>.*?)".*?>/';
        preg_match($patten, $response, $match);

        $idMainHome = (isset($match[1])) ? $match[1] : 0;
        return $idMainHome;
    }
    function requestWithData($url, $data, $isPost = false, $headers = [], $followLocation = false)
    {
        $cookie_path = './homes_cookie.txt';
        touch($cookie_path);
        $option = [
            // CURLOPT_CUSTOMREQUEST => 'POST',
            CURLOPT_USERAGENT => 'Mozilla/5.0 (Windows NT 6.2; WOW64; rv:24.0) Gecko/20100101 Firefox/24.0',
            CURLOPT_SSL_VERIFYPEER => FALSE,
            CURLOPT_SSL_VERIFYHOST => FALSE,
            CURLOPT_COOKIEJAR => $cookie_path,
            CURLOPT_COOKIEFILE => $cookie_path,
            // CURLOPT_FOLLOWLOCATION => TRUE,
            CURLOPT_HEADER => TRUE,
        ];
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE);
        if ($isPost) {
            curl_setopt($curl, CURLOPT_POST, $isPost);
            curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
            curl_setopt($curl, CURLINFO_HEADER_OUT, TRUE);
            curl_setopt($curl, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows; U; Windows NT 5.1; en-GB; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6');
        }

        curl_setopt_array($curl, $option);
        curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

        if ($followLocation) {
            curl_setopt($curl, CURLOPT_FOLLOWLOCATION, TRUE);
        }
        //        $curl_log = fopen(base_path("curl.txt"), 'w');
        //        curl_setopt($curl, CURLOPT_VERBOSE, TRUE);
        //        curl_setopt($curl, CURLOPT_STDERR, $curl_log);

        $response = curl_exec($curl) or die('error ' . curl_error($curl));
        $this->log($response);
        return $response;
    }
    function log($res)
    {
        $res = str_replace("物件メンテ - 入力｜売買｜LIFULL HOME'S Manager", "HOME's LOCAL", $res);
        $res = mb_convert_encoding($res, 'EUC-JP', 'UTF-8');
        $res = str_replace('src="/', 'src="https://manager.homes.co.jp/', $res);
        $res = str_replace('href="/', 'href="https://manager.homes.co.jp/', $res);
        file_put_contents("./home_response.html", $res);
    }
}
