<?php

namespace LoftyIDX\includes\common;

use DateTime;
use DateTimeZone;
use Exception;
use LoftyIDX\includes\LoftyIDX;
use LoftyIDX\includes\common\LoftyIDXHouseHelper;
use LoftyIDX\includes\LoftyIDXHelpers;
use LoftyIDX\includes\LoftyIDXFacades;

defined('ABSPATH') || exit;

class LoftyIDXListingHelper
{

    public static function mergeSearchOptions($options, $params)
    {
        $options = array_merge($options, $params);
        if (isset($params["condition"])) {
            $options["condition"] = urlencode(stripslashes($params["condition"]));
        }
        if (isset($params["timeline"]) && $params["timeline"] === true) {
            $options["timeline"] = true;
        }

        if (isset($params["uiConfig"])) {
            $options["uiConfig"] =  urlencode(stripslashes($params["uiConfig"]));
        }

        if (isset($params['mlsOrgId']) && $params['complianceCheck'] === true) {
            $options['mlsOrgId'] = $params['mlsOrgId'];
            $options['complianceCheck'] = $params['complianceCheck'];
        }

        return $options;
    }

    public static function getActiveListing($params = null, $extra_params=null)
    {
        $forwarder = LoftyIDX::get_instance()->services['proxy'];
        $options = [];
        if (empty($params)) {
            $params = LoftyIDXHelpers::get_request_param();
        }
        // append extra params, e.g shortcodes params
        if(!empty($extra_params)){
            $options = array_merge($options, $extra_params);
        }
        $options = self::mergeSearchOptions($options, $params);
        return $forwarder->get_data(
            'search/realTimeListings',
            $options
        );
    }

    public static function getSoldListing($params = null, $extra_params=null)
    {
        $forwarder = LoftyIDX::get_instance()->services['proxy'];

        if (empty($params)) {
            $params = LoftyIDXHelpers::get_request_param();
        }
        $options = [
            'listingType' => 'sold-listing',
        ];
        if(!empty($extra_params)){
            $options=array_merge($options, $extra_params);
        }
        $options = self::mergeSearchOptions($options, $params);
        return $forwarder->get_data(
            'search/realTimeListings',
            $options
        );
    }

    public static function getSaveSearchTags($params = null, $extra_params=null)
    {
        $forwarder = LoftyIDX::get_instance()->services['proxy'];

        if (empty($params)) {
            $params = LoftyIDXHelpers::get_request_param();
        }
        $options = [];
        if(!empty($extra_params)){
            $options=array_merge($options, $extra_params);
        }
        $options = self::mergeSearchOptions($options, $params);
        return $forwarder->get_data(
            'save-search/tags',
            $options
        );
    }

    public static function render_listing_empty()
    {
        return LoftyIDXFacades::view('module/empty-listing', [], true);
    }

    public static function render_listing_list($listing, $mls_list, $sold_listing = false)
    {
        $html  = '';
        if (isset($listing['listings']) && count($listing['listings']) > 0) {
            foreach ($listing["listings"] as $item) {
                LoftyIDXHouseHelper::format_house_card($item, $mls_list);
                $html .= LoftyIDXFacades::view('module/md_house_card/index.html', ['house'=> $item], true);
            }
            return $html;
        }
        return self::render_listing_empty();
    }

    public static function getFeaturedListingName($info)
    {
        $forwarder = LoftyIDX::get_instance()->services['proxy'];
        $params = [];
        $conditions = $info['condition'] ?? [];
        $timezone = $info['timezone'] ?? null;
        $sort = $info['sort'] ?? null;
        foreach ($conditions as $item) {  // 遍历数组
            $data = [];
            if (!is_array($item) && !is_object($item)) {
                continue; // Skip if $item is not iterable
            }
            foreach ($item as $key => $value) { // 遍历对象
                $key = $key ?? '';
                if(strpos($key, "date_") === 0) {
                    $value = $value ?? '';
                    $date_array = explode(",", $value);
                    $timestamp_array = array_map(function($date) use ($timezone) {
                        $date = trim($date ?? '');
                        if (empty($date)) {
                            return '';
                        }
                        // Use default timezone if $timezone is null or empty
                        try {
                            $tz = $timezone ? new DateTimeZone($timezone) : new DateTimeZone('UTC');
                        } catch (Exception $e) {
                            // If timezone is invalid, fall back to UTC
                            $tz = new DateTimeZone('UTC');
                        }
                        $datetime = DateTime::createFromFormat("Y/m/d", $date, $tz);
                        if ($datetime) {
                            $datetime->setTime(0, 0, 0);  // 设置时间为 00:00:00
                            return $datetime->getTimestamp() * 1000; // 转换为毫秒
                        }
                        return '';
                    }, $date_array);
                    $data[str_replace('date_', '', $key)] = implode(",", $timestamp_array);
                } else {
                    $data[$key] = $value;
                }
            }
            $params[] = ['data' => (object)$data];
        }
        $resp = $forwarder->post_data(
            'admin/listing-search/short-code/saveOrUpdate',
            [
                'values' => $params,
                'sort' => $sort
            ]
        );
        return $resp['data'] ?? null;
    }
    public static function get_mls_info()
    {
        $forwarder = LoftyIDX::get_instance()->services['proxy'];
        $mls = $forwarder->get_data(
            'listing/mls-info',
            []
        );
        return empty($mls['data']) ? [] : $mls['data'];
    }

    public static function getUserVowStatus()
    {
        $proxy = LoftyIDX::get_instance()->services['proxy'];
        $data = $proxy->get_data('/wp-plugin/save-data/common-info');
        if(isset($data['data']['leadUser'])) {
            return $data['data']['leadUser']['vowListingStatus'];
        } else {
            return false;
        }
    }
    public static function filterMetaTags($tags = '')
    {
        $strippedTags = strip_tags($tags, '<title><meta><link>');
        $pattern = '/<(title)>([^<]*)<\/title>|<(meta)\s+([^>]+)(\s*\/)?>|<(link)\s+([^>]+)(\s*\/)?>/is';
        preg_match_all($pattern, $strippedTags, $matches, PREG_SET_ORDER);
        $finalTags = [];
        foreach ($matches as $match) {
            $finalTags[] = $match[0];
        }
        foreach ($finalTags as $n => $tag) {
            $finalTags[$n] = html_entity_decode(do_shortcode(htmlentities($tag)));
        }
        return $finalTags;
    }
    public static function filterTitle($tags = '')
    {
        $strippedTags = strip_tags($tags, '<title>');
        $pattern = '/<(title)>([^<]*)<\/title>/i';
        preg_match_all($pattern, $strippedTags, $matches, PREG_SET_ORDER);
        foreach ($matches as &$match) {
            if(is_array($match)) {
                foreach ($match as $i => $m) {
                    $match[$i] = html_entity_decode(do_shortcode(htmlentities($m)));
                }
            }
        }
        unset($match);
        if(isset($matches[0])) {
            return $matches[0][2];
        }
        return null;
    }

}
