AlkantarClanX12

Your IP : 216.73.217.24


Current Path : /www/capitalgmcbuickregina_830/public/wp-content/plugins/leadbox/lib/
Upload File :
Current File : /www/capitalgmcbuickregina_830/public/wp-content/plugins/leadbox/lib/functions.php

<?php

function paginate($data, $page, $ipp)
{
    $since = $ipp * ($page - 1);
    return array_slice($data, $since, $ipp);
}
function getFilterParamsFromString($string)
{
    // Request-level cache to avoid re-parsing the same URL multiple times
    static $cache = array();

    $cache_key = md5($string);
    if (isset($cache[$cache_key])) {
        return $cache[$cache_key];
    }

    $params = [];

    $types;
    preg_match("/\btype\/[a-zA-ZÀ-ÿ,-]+/", $string, $types);
    if (sizeof($types) > 0) {
        $types = $types[0];
        $types = explode(',', explode('/', $types)[1]);
        $params['types'] = array_map(function ($types) {
            return str_replace(' ', '-', $types);
        }, $types);
    }

    $salependings;
    preg_match("/salepending\/[0-9]+/", $string, $salependings);
    if (sizeof($salependings) > 0) {
        $salependings = $salependings[0];
        $salependings = explode(',', explode('/', $salependings)[1]);
        $params['salependings'] = $salependings;
    }

    $demos;
    preg_match("/demo\/[0-9]+/", $string, $demos);
    if (sizeof($demos) > 0) {
        $demos = $demos[0];
        $demos = explode(',', explode('/', $demos)[1]);
        $params['demos'] = $demos;
    }

    $asiss;
    preg_match("/asis\/[0-9]+/", $string, $asiss);
    if (sizeof($asiss) > 0) {
        $asiss = $asiss[0];
        $asiss = explode(',', explode('/', $asiss)[1]);
        $params['asiss'] = $asiss;
    }

    $certifieds;
    preg_match("/certified\/[0-9]+/", $string, $certifieds);
    if (sizeof($certifieds) > 0) {
        $certifieds = $certifieds[0];
        $certifieds = explode(',', explode('/', $certifieds)[1]);
        $params['certifieds'] = $certifieds;
    }

    $specials;
    preg_match("/special\/[0-9]+/", $string, $specials);
    if (sizeof($specials) > 0) {
        $specials = $specials[0];
        $specials = explode(',', explode('/', $specials)[1]);
        $params['specials'] = $specials;
    }

    $productlines;
    preg_match("/productline\/[a-zA-ZÀ-ÿ,-]+/", $string, $productlines);
    if (sizeof($productlines) > 0) {
        $productlines = $productlines[0];
        $productlines = explode(',', explode('/', $productlines)[1]);
        $params['productlines'] = array_map(function ($productlines) {
            return str_replace(' ', '-', $productlines);
        }, $productlines);
    }

    $bodystyles;
    preg_match("/bodystyle\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $bodystyles);
    if (sizeof($bodystyles) > 0) {
        $bodystyles = $bodystyles[0];
        $bodystyles = explode(',', explode('/', $bodystyles)[1]);
        $params['bodystyles'] = array_map(function ($bodystyles) {
            return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $bodystyles);
        }, $bodystyles);
    }

    $outsidelengths;
    preg_match("/outsidelength\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $outsidelengths);
    if (sizeof($outsidelengths) > 0) {
        $outsidelengths = $outsidelengths[0];
        $outsidelengths = explode(',', explode('/', $outsidelengths)[1]);
        $params['outsidelengths'] = array_map(function ($outsidelengths) {
            return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $outsidelengths);
        }, $outsidelengths);
    }

    $floorplans;
    preg_match("/floorplan\/[a-zA-ZÀ-ÿ,-]+/", $string, $floorplans);
    if (sizeof($floorplans) > 0) {
        $floorplans = $floorplans[0];
        $floorplans = explode(',', explode('/', $floorplans)[1]);
        $params['floorplans'] = array_map(function ($floorplans) {
            return str_replace(' ', '-', $floorplans);
        }, $floorplans);
    }

    $color;
    preg_match("/exteriorcolor\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $color);
    if (sizeof($color) > 0) {
        $color = $color[0];
        $color = explode(',', explode('/', $color)[1]);
        $params['color'] = array_map(function ($color) {
            return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $color);
        }, $color);
    }

    $conditions;
    preg_match("/condition\/[a-zA-ZÀ-ÿ,]+/", $string, $conditions);
    if (sizeof($conditions) > 0) {
        $conditions = $conditions[0];
        $conditions = explode(',', explode('/', $conditions)[1]);
        $params['conditions'] = $conditions;
    }

    $transmissions;
    preg_match("/transmission\/[a-zA-ZÀ-ÿ,]+/", $string, $transmissions);
    if (sizeof($transmissions) > 0) {
        $transmissions = $transmissions[0];
        $transmissions = explode(',', explode('/', $transmissions)[1]);
        $params['transmissions'] = $transmissions;
    }

    $enginedisplacements;
    preg_match("/enginedisplacement\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $enginedisplacements);
    if (sizeof($enginedisplacements) > 0) {
        $enginedisplacements = $enginedisplacements[0];
        $enginedisplacements = explode(',', explode('/', $enginedisplacements)[1]);
        $params['enginedisplacements'] = $enginedisplacements;
    }

    $searchables;
    preg_match("/option\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $searchables);
    if (sizeof($searchables) > 0) {
        $searchables = $searchables[0];
        $searchables = explode(',', explode('/', $searchables)[1]);
        $params['searchables'] = $searchables;
    }

    $packages;
    preg_match("/package\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $packages);
    if (sizeof($packages) > 0) {
        $packages = $packages[0];
        $packages = explode(',', explode('/', $packages)[1]);
        $params['package'] = $packages;
    }

    $stocknumber;
    preg_match("/stocknumber\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $stocknumber);
    if (sizeof($stocknumber) > 0) {
        $stocknumber = $stocknumber[0];
        $stocknumber = explode(',', explode('/', $stocknumber)[1]);
        $params['stocknumber'] = $stocknumber[0];
    }

    $vin;
    preg_match("/vin\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $vin);
    if (sizeof($vin) > 0) {
        $vin = $vin[0];
        $vin = explode(',', explode('/', $vin)[1]);
        $params['vin'] = $vin[0];
    }

    if (preg_match("/year\/[0-9]{4}-[0-9]{4}/", $string)) {
        $years;
        preg_match("/year\/[0-9]{4}-[0-9]{4}/", $string, $years);
        if (sizeof($years) > 0) {
            $years = $years[0];
            $years = explode('-', explode('/', $years)[1]);
            $params['year']['since'] = $years[0];
            $params['year']['to'] = $years[1];
            for ($y = $years[0]; $y <= $years[1]; $y++)
                $params['years'][] = $y;
        }
    } else if (preg_match("/year\/([0-9]{4},)*([0-9]{4}){1}/", $string)) {
        $years;
        preg_match("/year\/([0-9]{4},)*([0-9]{4}){1}/", $string, $years);
        if (sizeof($years) > 0) {
            $years = $years[0];
            $years = explode(',', explode('/', $years)[1]);
            sort($years);
            $params['year']['since'] = $years[0];
            $params['year']['to'] = $years[sizeof($years) - 1];
            $params['years'] = $years;
        }
    }

    $makes;
    preg_match("/make\/[a-zA-ZÀ-ÿ,-]+/", $string, $makes);
    if (sizeof($makes) > 0) {
        $makes = $makes[0];
        $makes = explode(',', explode('/', $makes)[1]);
        $params['makes'] = array_map(function ($make) {
            return str_replace('', '', $make);
        }, $makes);
    }

    $lots;
    preg_match("/lot\/[a-zA-ZÀ-ÿ,-]+/", $string, $lots);
    if (sizeof($lots) > 0) {
        $lots = $lots[0];
        $lots = explode(',', explode('/', $lots)[1]);
        $params['lots'] = array_map(function ($lot) {
            return str_replace('', '', $lot);
        }, $lots);
    }

    $locations;
    preg_match("/location\/[0-9a-zA-ZÀ-ÿ,_\[\]-]+/", $string, $locations);
    if (sizeof($locations) > 0) {
        $locations = $locations[0];
        $locations = explode(',', explode('/', $locations)[1]);
        $params['locations'] = array_map(function ($location) {
            return str_replace([' ', '_', '[', ']'], ['-', '/', '(', ')'], $location);
        }, $locations);
    }

    $stocks;
    preg_match("/stock\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $stocks);
    if (sizeof($stocks) > 0) {
        $stocks = $stocks[0];
        $stocks = explode(',', explode('/', $stocks)[1]);
        $params['stocks'] = array_map(function ($stock) {
            return str_replace('', '', $stock);
        }, $stocks);
    }

    $models;
    preg_match("/model\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $models);
    if (sizeof($models) > 0) {
        $models = $models[0];
        $models = explode(',', explode('/', $models)[1]);
        $params['models'] = $models;
    }

    $trims;
    preg_match("/trim\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $trims);
    if (sizeof($trims) > 0) {
        $trims = $trims[0];
        $trims = explode(',', explode('/', $trims)[1]);
        $params['trims'] = $trims;
    }

    $engines;
    preg_match("/\bengine\/[0-9a-zA-ZÀ-ÿ.:,_\[\]-]+/", $string, $engines);
    if (sizeof($engines) > 0) {
        $engines = $engines[0];
        $engines = explode(',', explode('/', $engines)[1]);
        $params['engines'] = array_map(function ($engines) {
            return str_replace(['[reg]', '[and]', '[-]', '[x]', '_', '[', ']', 'plus'], ['®', '&', '–',' ', '/', '(', ')', '+'], $engines);
        }, $engines);
    }

    $drivetrains;
    preg_match("/drivetrain\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $drivetrains);
    if (sizeof($drivetrains) > 0 ) {
        $drivetrains = $drivetrains[0];
        $drivetrains = explode(',', explode('/', $drivetrains)[1]);
        $params['drivetrains'] = $drivetrains;
    }

    $bodystyles;
    preg_match("/bodystyle\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $bodystyles);
    if (sizeof($bodystyles) > 0) {
        $bodystyles = $bodystyles[0];
        $bodystyles = explode(',', explode('/', $bodystyles)[1]);
        $params['bodystyles'] = $bodystyles;
    }

    $fueltypes;
    preg_match("/fueltype\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $fueltypes);
    if (sizeof($fueltypes) > 0) {
        $fueltypes = $fueltypes[0];
        $fueltypes = explode(',', explode('/', $fueltypes)[1]);
        $params['fueltypes'] = $fueltypes;
    }

    $status;
    preg_match("/status\/[0-9a-zA-ZÀ-ÿ.,-]+/", $string, $status);
    if (sizeof($status) > 0) {
        $status = $status[0];
        $status = explode(',', explode('/', $status)[1]);
        $params['status'] = $status;
    }

    $prices;
    preg_match("/price\/[0-9.,]+-[0-9.,]+/", $string, $prices);
    if (sizeof($prices) > 0) {
        $prices = $prices[0];
        $prices = explode('-', explode('/', $prices)[1]);
        $params['price']['since'] = $prices[0];
        $params['price']['to'] = $prices[1];
    }

    $dryweight;
    preg_match("/dryweight\/[0-9.,]+-[0-9.,]+/", $string, $dryweight);
    if (sizeof($dryweight) > 0) {
        $dryweight = $dryweight[0];
        $dryweight = explode('-', explode('/', $dryweight)[1]);
        $params['dryweight']['since'] = $dryweight[0];
        $params['dryweight']['to'] = $dryweight[1];
    }

    $grossweight;
    preg_match("/grossweight\/[0-9.,]+-[0-9.,]+/", $string, $grossweight);
    if (sizeof($grossweight) > 0) {
        $grossweight = $grossweight[0];
        $grossweight = explode('-', explode('/', $grossweight)[1]);
        $params['grossweight']['since'] = $grossweight[0];
        $params['grossweight']['to'] = $grossweight[1];
    }

    $sleepcapacity;
    preg_match("/sleepcapacity\/[0-9.,]+-[0-9.,]+/", $string, $sleepcapacity);
    if (sizeof($sleepcapacity) > 0) {
        $sleepcapacity = $sleepcapacity[0];
        $sleepcapacity = explode('-', explode('/', $sleepcapacity)[1]);
        $params['sleepcapacity']['since'] = $sleepcapacity[0];
        $params['sleepcapacity']['to'] = $sleepcapacity[1];
    }

    $mileages;
    preg_match("/mileage\/[0-9.,]+-[0-9.,]+/", $string, $mileages);
    if (sizeof($mileages) > 0) {
        $mileages = $mileages[0];
        $mileages = explode('-', explode('/', $mileages)[1]);
        $params['mileage']['since'] = $mileages[0];
        $params['mileage']['to'] = $mileages[1];
    }

    $carprooflinks;
    preg_match("/towing\/[0-9.,]+-[0-9.,]+/", $string, $carprooflinks);
    if (sizeof($carprooflinks) > 0) {
        $carprooflinks = $carprooflinks[0];
        $carprooflinks = explode('-', explode('/', $carprooflinks)[1]);
        $params['carprooflink']['since'] = $carprooflinks[0];
        $params['carprooflink']['to'] = $carprooflinks[1];
    }

    $payments;
    preg_match("/payment\/[0-9.,]+-[0-9.,]+/", $string, $payments);
    if (sizeof($payments) > 0) {
        $payments = $payments[0];
        $payments = explode('-', explode('/', $payments)[1]);
        $params['payment']['since'] = $payments[0];
        $params['payment']['to'] = $payments[1];
    }

    $sort_by;
    preg_match("/sort_by\/[a-zA-Z_À-ÿ]+/", $string, $sort_by);
    if (sizeof($sort_by) > 0) {
        $sort_by = $sort_by[0];
        $sort_by = explode(',', explode('/', $sort_by)[1]);
        $params['sort_by'] = $sort_by[0];
    }

    $sort_by_model;
    preg_match("/sort_order\/[a-zA-Z_À-ÿ]+/", $string, $sort_by_model);
    if (sizeof($sort_by) > 0) {
        $sort_by_model = $sort_by_model[0];
        $sort_by_model = explode(',', explode('/', $sort_by_model)[1]);
        $params['sort_by_model'] = $sort_by_model[0];
    }

    $sort_by_condition;
    preg_match("/sort_order\/[a-zA-Z_À-ÿ]+/", $string, $sort_by_condition);
    if (sizeof($sort_by_condition) > 0) {
        $sort_by_condition = $sort_by_condition[0];
        $sort_by_condition = explode(',', explode('/', $sort_by_condition)[1]);
        $params['sort_by_condition'] = $sort_by_condition[0];
    }

    $filter;
    preg_match("/filter\/[a-zA-ZÀ-ÿ0-9-_]+/", $string, $filter);
    if (sizeof($filter) > 0) {
        $filter = $filter[0];
        $filter = explode('/', $filter);
        $params['filter'] = $filter[1];
    }

    $boxsizes;
    preg_match("/boxsize\/[0-9a-zA-ZÀ-ÿ.,_\[\]-]+/", $string, $boxsizes);
    if (sizeof($boxsizes) > 0) {
        $boxsizes = $boxsizes[0];
        $boxsizes = explode(',', explode('/', $boxsizes)[1]);
        $params['boxsizes'] = array_map(function ($boxsizes) {
            return str_replace(['[inch]', '_'], ["'", '/'], $boxsizes);
        }, $boxsizes);
    }

    $seats;
    preg_match("/seat\/[0-9a-zA-ZÀ-ÿ,-]+/", $string, $seats);
    if (sizeof($seats) > 0) {
        $seats = $seats[0];
        $seats = explode(',', explode('/', $seats)[1]);
        $params['seats'] = array_map(function ($seat) {
            return str_replace('', '', $seat);
        }, $seats);
    }

    $tags;
    preg_match("/\btags\/[0-9a-zA-ZÀ-ÿ.,_-]+/", $string, $tags);
    if (sizeof($tags) > 0) {
        $tags = $tags[0];
        $tags = explode(',', explode('/', $tags)[1]);
        $params['tags'] = array_map(function ($tag) {
            return str_replace('_', ' ', $tag);
        }, $tags);
    }

    preg_match("/\bsubtype\/([0-9a-zA-ZÀ-ÿ.,-]+)/", $string, $subtypeMatch);
    if (sizeof($subtypeMatch) > 1) {
        $params['subtypes'] = [str_replace('-', ' ', $subtypeMatch[1])];
    }

    // SRP-only VIN filter via query string. Uses a separate key (filter_vin)
    // to avoid colliding with ?VIN= which triggers the VDP redirect.
    if (!empty($_GET['filter_vin']) && empty($params['vin'])) {
        $params['vin'] = sanitize_text_field(wp_unslash($_GET['filter_vin']));
    }

    // Store in cache before returning
    $cache[$cache_key] = $params;
    return $params;
}
function post_filter($data, $params)
{
    $conditions = array_map(function ($i) {
        return strtolower($i);
    }, $params['conditions']  ?? ['all']);
    $transmissions = array_map(function ($i) {
        return strtolower($i);
    }, $params['transmissions']  ?? ['all']);
    $enginedisplacements = array_map(function ($i) {
        return strtolower($i);
    }, $params['enginedisplacements']  ?? ['all']);
    $searchables = array_map(function ($i) {
        return strtolower($i);
    }, $params['searchables']  ?? ['all']);
    $packages = array_map(function ($i) {
        return strtolower($i);
    }, $params['package']  ?? ['all']);
    $stocknumber = strtolower($params['stocknumber'] ?? 'all');
    $vin = strtolower($params['vin'] ?? 'all');
    // Pre-normalize VIN list (supports comma-separated values: ?filter_vin=VIN1,VIN2)
    $vinList = ($vin === 'all' || $vin === '')
        ? []
        : array_filter(array_map(
            function ($v) { return str_replace(['-', ' '], '', trim($v)); },
            explode(',', $vin)
          ));
    $yearSince = intval($params['year']['since'] ?? 0);
    $yearTo = intval($params['year']['to'] ?? 9999);
    $years = array_map(function ($i) {
        return strtolower($i);
    }, $params['years']  ?? ['all']);
    $makes = array_map(function ($i) {
        return strtolower($i);
    }, $params['makes']  ?? ['all']);

    $lots = array_map(function ($i) {
        return strtolower($i);
    }, $params['lots']  ?? ['all']);

    $stocks = array_map(function ($i) {
        return strtolower($i);
    }, $params['stocks']  ?? ['all']);

    $models = array_map(function ($i) {
        return strtolower($i);
    }, $params['models']  ?? ['all']);
    $trims = array_map(function ($i) {
        return strtolower($i);
    }, $params['trims']  ?? ['all']);
    $bodystyles = array_map(function ($i) {
        return strtolower($i);
    }, $params['bodystyles']  ?? ['all']);
    $salependings = array_map(function ($i) {
        return strtolower($i);
    }, $params['salependings']  ?? ['all']);
    $demos = array_map(function ($i) {
        return strtolower($i);
    }, $params['demos']  ?? ['all']);
    $asiss = array_map(function ($i) {
      return strtolower($i);
  }, $params['asiss']  ?? ['all']);
    $certifieds = array_map(function ($i) {
        return strtolower($i);
    }, $params['certifieds']  ?? ['all']);
    $specials = array_map(function ($i) {
        return strtolower($i);
    }, $params['specials']  ?? ['all']);
    $priceSince = floatval($params['price']['since'] ?? 0);
    $priceTo = floatval($params['price']['to'] ?? 999999999999);
    $mileageSince = intval($params['mileage']['since'] ?? 0);
    $mileageTo = intval($params['mileage']['to'] ?? 999999999999);
    $sort_by = $params['sort_by']  ?? 'price';
    $sort_by_condition = $params['sort_by_condition'] ?? $params['sort_order'] ?? 'asc';
    $color = array_map(function ($i) {
        return strtolower($i);
    }, $params['color']  ?? ['all']);
    $filter = $params['filter'] ?? false;
    $locations = array_map(function ($i) {
        return strtolower($i);
    }, $params['locations']  ?? ['all']);

    $seats = array_map(function ($i) {
      return strtolower($i);
    }, $params['seats']  ?? ['all']);

    $unwanted_array = array(
        'Š' => 'S', 'š' => 's', 'Ž' => 'Z', 'ž' => 'z', 'À' => 'A', 'Á' => 'A', 'Â' => 'A', 'Ã' => 'A', 'Ä' => 'A', 'Å' => 'A', 'Æ' => 'A', 'Ç' => 'C', 'È' => 'E', 'É' => 'E',
        'Ê' => 'E', 'Ë' => 'E', 'Ì' => 'I', 'Í' => 'I', 'Î' => 'I', 'Ï' => 'I', 'Ñ' => 'N', 'Ò' => 'O', 'Ó' => 'O', 'Ô' => 'O', 'Õ' => 'O', 'Ö' => 'O', 'Ø' => 'O', 'Ù' => 'U',
        'Ú' => 'U', 'Û' => 'U', 'Ü' => 'U', 'Ý' => 'Y', 'Þ' => 'B', 'ß' => 'Ss', 'à' => 'a', 'á' => 'a', 'â' => 'a', 'ã' => 'a', 'ä' => 'a', 'å' => 'a', 'æ' => 'a', 'ç' => 'c',
        'è' => 'e', 'é' => 'e', 'ê' => 'e', 'ë' => 'e', 'ì' => 'i', 'í' => 'i', 'î' => 'i', 'ï' => 'i', 'ð' => 'o', 'ñ' => 'n', 'ò' => 'o', 'ó' => 'o', 'ô' => 'o', 'õ' => 'o',
        'ö' => 'o', 'ø' => 'o', 'ù' => 'u', 'ú' => 'u', 'û' => 'u', 'ý' => 'y', 'þ' => 'b', 'ÿ' => 'y'
    );
    $filtered = [];
    foreach ($data as $item) {
        $super_string = ((!isset($item['condition'])) ? ' ' : $item['condition'] . ' ')
            . ((!isset($item['stocknumber'])) ? ' ' : $item['stocknumber'] . ' ')
            . ((!isset($item['vin'])) ? ' ' : $item['vin'] . ' ')
            . ((!isset($item['year'])) ? ' ' : $item['year'] . ' ')
            . ((!isset($item['make'])) ? ' ' : $item['make'] . ' ')
            . ((!isset($item['lot'])) ? ' ' : $item['lot'] . ' ')
            . ((!isset($item['model'])) ? ' ' : $item['model'] . ' ')
            . ((!isset($item['trim'])) ? ' ' : $item['trim'] . ' ')
            . ((!isset($item['bodystyle'])) ? ' ' : $item['bodystyle'] . ' ')
            . ((!isset($item['price'])) ? ' ' : $item['price'] . ' ')
            . ((!isset($item['mileage'])) ? ' ' : $item['mileage'] . ' ')
            . ((!isset($item['exteriorcolor'])) ? ' ' : $item['exteriorcolor'] . ' ')
            . ((!isset($item['location'])) ? ' ' : $item['location'] . ' ')
            . ((!isset($item['enginedisplacement'])) ? ' ' : $item['enginedisplacement'] . ' ');

        $flag = true;
        if (sizeof($transmissions) > 0 && $transmissions[0] != 'all')
            if ($flag && sizeof($transmissions) > 0 && !in_array(strtolower($item['transmission']), $transmissions))
                $flag = false;

        if (sizeof($salependings) > 0 && $salependings[0] != 'all')
            if ($flag && sizeof($salependings) > 0 && !in_array(strtolower($item['salepending']), $salependings))
                $flag = false;

        if (sizeof($demos) > 0 && $demos[0] != 'all')
            if ($flag && sizeof($demos) > 0 && !in_array(strtolower($item['demo']), $demos))
                $flag = false;

        if (sizeof($asiss) > 0 && $asiss[0] != 'all')
            if ($flag && sizeof($asiss) > 0 && !in_array(strtolower($item['asis']), $asiss))
                $flag = false;

        if (sizeof($certifieds) > 0 && $certifieds[0] != 'all')
            if ($flag && sizeof($certifieds) > 0 && !in_array(strtolower($item['certified']), $certifieds))
                $flag = false;

        if (sizeof($specials) > 0 && $specials[0] != 'all')
            if ($flag && sizeof($specials) > 0 && !in_array(strtolower($item['special']), $specials))
                $flag = false;

        if (sizeof($enginedisplacements) > 0 && $enginedisplacements[0] != 'all')
            if ($flag && sizeof($enginedisplacements) > 0 && !in_array(strtolower($item['enginedisplacement']), $enginedisplacements))
                $flag = false;

        if (sizeof($searchables) > 0 && $searchables[0] != 'all')
            if ($flag && sizeof($searchables) > 0) {
                $_item = array_map(
                    function ($row) {
                        return strtolower(str_replace(' ', '-', $row));
                    },
                    $item['searchablesarray']
                );
                $arrayIntersect = array_intersect($searchables, $_item);

                if (sizeof($arrayIntersect) < sizeof($searchables))
                    $flag = false;
            }

        if (sizeof($packages) > 0 && $packages[0] != 'all') {
            $packagesArray = $packages;
            $total_i = 0;
            foreach ($packagesArray as $package) {
                $total_i += count(array_filter(explode(',', $item['searchables']), function ($var) use ($package) {
                    return strpos(strtolower($var), strtolower($package)) !== false;
                }));
            }
            if ($flag && $packages && $total_i == 0)
                $flag = false;
        }

        if (sizeof($conditions) > 0 && $conditions[0] != 'all')
            if ($flag && sizeof($conditions) > 0 && !in_array(strtolower($item['condition']), $conditions))
                $flag = false;

        if ($stocknumber != 'all') {
            if ($flag && strpos(strtolower(str_replace(' ', '', str_replace('-', '', $item['stocknumber']))), strtolower(str_replace(' ', '', str_replace('-', '', $stocknumber)))) === false)
                $flag = false;
        }

        if ($flag && !empty($vinList)) {
            $itemVinNorm = strtolower(str_replace(['-', ' '], '', $item['vin'] ?? ''));
            $matched = false;
            foreach ($vinList as $needle) {
                if ($needle !== '' && strpos($itemVinNorm, $needle) !== false) {
                    $matched = true;
                    break;
                }
            }
            if (!$matched) $flag = false;
        }

        // if($flag && !($item['year'] >= $yearSince && $item['year'] <= $yearTo))
        //     $flag = false;

        if (sizeof($years) > 0 && $years[0] != 'all')
            if ($flag && sizeof($years) > 0 && !in_array($item['year'], $years))
                $flag = false;

        if (sizeof($makes) > 0 && $makes[0] != 'all')
            if ($flag && sizeof($makes) > 0 && !in_array(strtolower($item['make']), $makes))
                $flag = false;

        if (sizeof($lots) > 0 && $lots[0] != 'all')
            if ($flag && sizeof($lots) > 0 && !in_array(strtolower($item['lot']), $lots))
                $flag = false;

        if (sizeof($stocks) > 0 && $stocks[0] != 'all')
            if ($flag && sizeof($stocks) > 0 && !in_array(strtolower($item['stocknumber']), $stocks))
                $flag = false;

        if (sizeof($models) > 0 && $models[0] != 'all')
            if ($flag && sizeof($models) > 0 && !in_array(strtolower(str_replace(' ', '-', $item['model'])), $models))
                $flag = false;

        if (sizeof($trims) > 0 && $trims[0] != 'all')
            if ($flag && sizeof($trims) > 0 && !in_array(strtolower(str_replace(' ', '-', $item['trim'])), $trims))
                $flag = false;

        if (sizeof($bodystyles) > 0 && $bodystyles[0] != 'all')
            if ($flag && sizeof($bodystyles) > 0 && !in_array(str_replace('---', '-', str_replace(' ', '-', strtolower($item['bodystyle']))), $bodystyles))
                $flag = false;

        if ($flag && !($item['price'] >= $priceSince && $item['price'] <= $priceTo))
            $flag = false;

        if ($flag && isset($item['mileage']) && !($item['mileage'] >= $mileageSince && $item['mileage'] <= $mileageTo))
            $flag = false;

        if (sizeof($color) > 0 && $color[0] != 'all')
            if ($flag && sizeof($color) > 0 && !in_array(strtolower(strtr($item['exteriorcolor'], $unwanted_array)), str_replace('-', ' ', $color) ))
                $flag = false;

        // if($flag && $filter && !strpos(strtolower($super_string), strtolower($filter)))
        //     $flag = false;

        if ($flag && $filter && !string_contains_value($super_string, $filter))
            $flag = false;

        if (sizeof($locations) > 0 && $locations[0] != 'all')
            if ($flag && sizeof($locations) > 0 && !in_array(strtolower($item['location']), str_replace('-', ' ', $locations) ))
                $flag = false;

        if (sizeof($seats) > 0 && $seats[0] != 'all')
          if ($flag && sizeof($seats) > 0 && !in_array(strtolower($item['seats']), $seats))
              $flag = false;

        if ($flag)
            $filtered[] = $item;
    }

    // LBT-1453: normalize the sort key (e.g. 'Stocknumber (Custom)' → 'stocknumber_custom')
    // and forward the stock list so sort_vehicles can apply the custom order.
    $sort_by_normalized = function_exists('normalize_sort_by_key') ? normalize_sort_by_key($sort_by) : $sort_by;
    $stock_list_for_sort = 'all';
    if ($sort_by_normalized === 'stocknumber_custom') {
        if (function_exists('sort_stocks_to_csv') && !empty($params['sort_stocks'])) {
            $stock_list_for_sort = sort_stocks_to_csv($params['sort_stocks']);
        }
        if (($stock_list_for_sort === '' || $stock_list_for_sort === 'all')
            && !empty($params['stock']) && is_string($params['stock']) && $params['stock'] !== 'all') {
            $stock_list_for_sort = $params['stock'];
        }
        if ($stock_list_for_sort === '') {
            $stock_list_for_sort = 'all';
        }
    }

    // LBT-1453: forward the dealer-configured secondary sort so the "rest" of the
    // inventory (vehicles not in sort_stocks) is ordered consistently with the
    // dealer's intent. SRP layouts already populate these in $params from the
    // block options. Accept the two naming conventions in use (sort_order_secondary
    // from blade layouts, sort_by_condition_secondary from the inventory shortcode).
    $sort_by_secondary = function_exists('normalize_sort_by_key')
        ? normalize_sort_by_key($params['sort_by_secondary'] ?? 'none')
        : ($params['sort_by_secondary'] ?? 'none');
    $sort_by_condition_secondary = $params['sort_order_secondary']
        ?? $params['sort_by_condition_secondary']
        ?? 'desc';

    $filtered = sort_vehicles($filtered, $sort_by_normalized, $sort_by_condition, $sort_by_secondary, $sort_by_condition_secondary, $stock_list_for_sort);

    return $filtered;
}


function string_contains_value($text, $filter)
{
    $array = explode("_", strtolower($filter));
    $total_words = count($array);
    $vehicle = array_map('strtolower', explode(' ', $text));
    $total_coincidences = 0;
    //$total_coincidences = count(array_intersect(array_map('strtolower', explode(' ', $text)), $array));
    foreach ($array as $item) {
        //var_dump($item);
        $total_i = count(array_filter($vehicle, function ($var) use ($item) {
            return strpos($var, $item) !== false;
        }));
        $total_p = count(array_filter($vehicle, function ($var) use ($item) {
            return strpos(str_replace("-", "", $var), str_replace("-", " ", $item)) !== false;
        }));
        //var_dump($total_p);
        if ($total_i > 0 || $total_p)
            $total_coincidences++;
    }

    if ($total_words == $total_coincidences) {
        return true;
    } else {
        return false;
    }
}

function get_search_inventory()
{
    $idiom = '';
    if (isFrench() == true) {
        $idiom = '_fr';
    }

    $inventory = json_decode(file_get_contents(wp_get_upload_dir()['basedir'] . '/data/inventory' . $idiom . '.json'), true);
    return $inventory['vehicles'];
}

function get_vehicle_by_id($id)
{
    $lbsettings = get_option('leadbox-settings');
    $type = $lbsettings["dealer_information"];
    if(strtolower($type) == "mixed"){
        $vehicle_json_path_car = wp_get_upload_dir()['basedir'] . '/data/car_' . $id;
        $idiom_path_car = makeUrl($vehicle_json_path_car);
        $vehicle_json_path_rv = wp_get_upload_dir()['basedir'] . '/data/rv_' . $id;
        $idiom_path_rv = makeUrl($vehicle_json_path_rv);
        if (file_exists($idiom_path_rv)) {
            return json_decode(file_get_contents($idiom_path_rv), true);
        }
        else if (file_exists($idiom_path_car)) {
            return json_decode(file_get_contents($idiom_path_car), true);
        }
        else{
            $vehicle_json_path = wp_get_upload_dir()['basedir'] . '/data/' . $id;
            $idiom_path = makeUrl($vehicle_json_path);
            if (file_exists($idiom_path)) {
                return json_decode(file_get_contents($idiom_path), true);
            }
        }
    }
    else{
        $vehicle_json_path = wp_get_upload_dir()['basedir'] . '/data/' . $id;
        $idiom_path = makeUrl($vehicle_json_path);
        if (file_exists($idiom_path)) {
            return json_decode(file_get_contents($idiom_path), true);
        }
    }


    return array();
}

function makeUrl($url)
{

    $idiom = '';
    $vehicle_json_path = $url . $idiom . '.json';

    if (isFrench() == true) {
        $idiom = '_fr';
        $path_french = $url . $idiom . '.json';
        if (file_exists($path_french)) {
            $vehicle_json_path = $path_french;
        }
    }
    return $vehicle_json_path;
}

function get_conditions_years_makes_models_count($inventory)
{
    $result = [
        'conditions' => [],
        'years' => [],
        'makes' => [],
        'models' => []
    ];
    $counter = 0;
    foreach ($inventory as $element) {
        // if(!in_array($element['condition'], $result['conditions']))
        //     $result['conditions'][] = $element['condition'];
        // if(!in_array($element['year'], $result['years']))
        //     $result['years'] = $element['year'];
        // if(!in_array($element['make'], $result['makes']))
        //     $result['makes'] = $element['make'];
        // if(!in_array($element['model'], $result['models']))
        //     $result['models'] = $element['model'];
        $counter++;
    }
    $result['count'] = $counter;
    return $result;
}

function get_vehicles_by_id($array)
{
    $vehicles = [];
    for ($i = 0; $i < sizeof($array); $i++)
        $vehicles[] = get_vehicle_by_id($array[$i]);

    return $vehicles;
}

function set_previously_cookie_id($id)
{
    $val = false;
    if (isset($_COOKIE['previously-viewed'])) {
        $data = json_decode($_COOKIE['previously-viewed'], true);
        if (isset($data)) {
            $exist = in_array($id, $data);
            if (sizeof($data) >= 10 && !$exist) {
                $reverse = array_reverse($data);
                array_pop($reverse);
                $data = array_reverse($reverse);
            }
            if ($exist) {
                $data = array_diff($data, array($id));
            }
            if (isset($data)) {
                array_push($data, $id);
                $val = true;
            }
        }
    }

    if (!$val) {
        $data = array();
        array_push($data, $id);
    }
    setcookie("previously-viewed", json_encode(array_values($data)), time() + 3600, "/", $_SERVER['SERVER_NAME']);
}

function get_previously_viewed_vehicles()
{
    if (isset($_COOKIE['previously-viewed'])) {
        $data_ids = json_decode($_COOKIE['previously-viewed'], true);
        $data = get_inventory();
        $dataArray = $data;
        $dataVehicles = $dataArray['vehicles'];
        $previously = [];
        if (isset($data_ids)) {
            for ($a = 0; $a < sizeof($data_ids); $a++) {
                for ($i = 0; $i < sizeof($dataVehicles); $i++) {
                    if ($data_ids[$a] == $dataVehicles[$i]['id']) {
                        $previously[] = $dataVehicles[$i];
                    }
                }
                if (sizeof($previously) >= 10)
                    break;
            }
        }
        return array_reverse($previously);
    }
}


function get_similar_vehicle($year, $make, $model, $condition = null, $locations = null, $type = null, $vin = null)
{
  $data = get_inventory();
  //$dataArray = json_decode($data, true);

  $dataArray = $data;
  $dataVehicles = $dataArray['vehicles'];
  $similar = [];
  for ($i = 0; $i < sizeof($dataVehicles); $i++) {
      $flag = true;

      $conditions = [
        'year' => $year == $dataVehicles[$i]['year'],
        'make' => $make == $dataVehicles[$i]['make'],
    ];

    if ($type) {
        $conditions['type'] = $type == $dataVehicles[$i]['type'];
        unset($conditions['make']);
        unset($conditions['year']);
    } else {
        $conditions['model'] = $model == $dataVehicles[$i]['model'];
    }

    // Si 'similar_type' es "type", no necesitamos verificar 'make' cuando $type es true
//   if (($GENIUS['vdp-similars']['data']['similar_type'] ?? null) === 'type' && !empty($type)) {
//     unset($conditions['make']);
//   }

    $flag = !in_array(false, $conditions, true);

      if ($condition && $condition != $dataVehicles[$i]['condition'])
          $flag = false;

      if ($locations && !in_array($dataVehicles[$i]['location'], $locations))
          $flag = false;

      if ($vin === $dataVehicles[$i]['vin'])
          $flag = false;

      if ($flag)
          $similar[] = $dataVehicles[$i];

      if (sizeof($similar) >= 6)
          break;
  }
  return $similar;
}

function get_vdp_slug($vehicle, $lang = 'en')
{
    $view = 'vue';
    if (strpos($lang, 'en') !== false) {
        $view = 'view';
    }
    //$vehicle = get_vehicle_by_id($id);
    if (isset($vehicle) && array_key_exists("id", $vehicle) && $vehicle["id"] > 0) {
        return "/" . $view . "/" . strtolower($vehicle['condition']) . "-" . strtolower($vehicle['year']) . "-" . strtolower(str_replace(' ', '-', $vehicle['make'])) . "-" . strtolower(str_replace(' ', '-', $vehicle['model'])) . "-" . $vehicle['id']."/";
    } else
        return null;
}

function currency_format($n)
{
    $lang = get_locale();
    $value = floor(floatval($n)); // Truncate decimals, don't round
    if ($lang == 'fr_CA')
        return (number_format($value, 0, ',', ' ')) . ' $';
    else
        return "$" . (number_format($value, 0));
}

function get_image_path()
{
    $lang = get_locale();
    $img_slug = ($lang == 'fr_CA') ? '/assets/images/fr/' : '/assets/images/';
    return get_fileIn('/assets/images/') . $img_slug;
}

function get_model_trims($model)
{
    $arrContextOptions = array(
        "ssl" => array(
            "verify_peer" => false,
            "verify_peer_name" => false,
        ),
    );

    $lbsettings = get_option('leadbox-settings');

    $url = "https://v5websitescdn.blob.core.windows.net/v5cdn/components/model-trim/".strtolower($lbsettings["manufacturer"])."/";
    $imgUrl = "https://v5websitescdn.blob.core.windows.net/v5cdn/components/model-trim/".strtolower($lbsettings["manufacturer"])."/";
    $filename = "model-trims.json";

    $dealer = get_option('dealer-settings-contact-options');

    // Custom Trimselector json
    if(isset($lbsettings) && isset($lbsettings["trimselector"])  && !empty($lbsettings["trimselector"]) && strtolower($lbsettings["trimselector"]) == 'custom')
    {
        if(isset($dealer) && !empty($dealer) && isset($dealer["dealer_name"]) && !empty($dealer["dealer_name"])){
            $dealername = preg_replace('/[^A-Za-z0-9\-]/', '', $dealer["dealer_name"]);
            if(_isFrench()) {
                $filename = "model-trims-".strtolower(str_replace(" ","",$dealername))."-fr.json";
            }
            else {
                $filename = "model-trims-".strtolower(str_replace(" ","",$dealername)).".json";
            }
        }
    }
    else{
        if(_isFrench()) {
            $filename = "model-trims-fr.json";
        }
    }

    $modelTrims = json_decode(file_get_contents($url.$filename, false, stream_context_create($arrContextOptions)), true);
    $modifiedModelTrims = [];
    foreach ($modelTrims as $key => $value) {
        $modifiedModelTrims[str_replace(' ', '-', strtolower($key))] = $value;
    }
    // dd('more?', $modifiedModelTrims, $model);
    return ['imgUrl' => $imgUrl, 'trims' => $modifiedModelTrims[$model] ?? []];
}

function hasChild()
{
    $padre = get_template_directory();
    $hijo = get_stylesheet_directory();

    if ($padre == $hijo) {
        return false;
    } else {
        return true;
    }
}

function get_genius_include_path($component_name, $incoming_version = null, $kind = null)
{
    $kind_str = '';
    if(!is_null($kind) && strtolower($kind) != 'car')
    $kind_str = $kind . '-';

    $version = $incoming_version ?? GENIUS[$component_name][$kind_str . 'version'] ?? GENIUS[$component_name]['version'] ?? 1;
    if (file_exists(get_template_directory() . '/resources/views/cl/' . $component_name . '/' . $version . '.blade.php'))
        return 'cl.' . $component_name . '.' . $version;
    else
        return 'cl.' . $component_name . '.1';
}

function get_genius_include_layout_path($layout_name, $incoming_version = null, $kind = null)
{
    $kind_str = '';
    if(!is_null($kind) && strtolower($kind) != 'car')
      $kind_str = $kind . '-';

    $version = $incoming_version ?? GENIUS[$layout_name][$kind_str . 'version'] ?? GENIUS[$component_name]['version'] ?? 1;
    if (file_exists(get_template_directory() . '/resources/views/layouts/' . $layout_name . '/' . $version . '.blade.php'))
        return 'layouts.' . $layout_name . '.' . $version;
    else
        return 'layouts.' . $layout_name . '.1';
}

function enqueue_wp_util()
{
    // Option 1: Manually enqueue the wp-util library.
    wp_enqueue_script('wp-util');
}

add_action('wp_ajax_nopriv_get_leadbox_inventory_from_plugin', 'get_leadbox_inventory_from_plugin');
add_action('wp_ajax_get_leadbox_inventory_from_plugin', 'get_leadbox_inventory_from_plugin');

function get_leadbox_inventory_from_plugin()
{
    $inventory = get_inventory();

    // filtering middleware
    // $filtered = post_filter($inventory['vehicles'], []);
    $filtered = $inventory['vehicles'];

    wp_send_json_success(json_encode($filtered));
}

add_action('wp_enqueue_scripts',  'enqueue_wp_util');

function write_log_leadbox($log_msg)
{
    $log_filename = "logs";
    if (!file_exists($log_filename)) {
        mkdir($log_filename, 0777, true);
    }
    $log_file_data = $log_filename . '/debuger.log';

    file_put_contents($log_file_data, $log_msg . "\n", FILE_APPEND);
}


add_action("admin_head", function () {
    echo "<style>#screen-options-link-wrap {display:none}</style>";
});

function getCurrentUrlLBX(){
    return $_SERVER['HTTP_REFERER'];
}

function getLBXUrlQuerys()
{

    $val = 0;
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }
    $actual_link = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? "https" : "http") . "://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
    $parts = parse_url($actual_link);
    if (isset($parts['query'])) {
        parse_str($parts['query'], $query);
        if(isset($query['gclid'])){
            $_SESSION["gclid"] = $query['gclid'];
        }
        if(isset($query['utm_campaign'])){
            $_SESSION["utm_campaign"] = $query['utm_campaign'];
        }
        if(isset($query['utm_medium'])){
            $_SESSION["utm_medium"] = $query['utm_medium'];
        }
        if(isset($query['utm_source'])){
            $_SESSION["utm_source"] = $query['utm_source'];
        }
    }
}

function setDataGoogleSheet(){

	leadbox_logger()->info('Google Sheets sync started', array(
		'site' => $_SERVER['SERVER_NAME'] ?? 'unknown',
	));

	try {
		require_once __DIR__ . '/../vendor/autoload.php';
		$client = new Google_Client();
		$client->setApplicationName('Google Sheets API PHP Quickstart');
		$client->setScopes(Google_Service_Sheets::SPREADSHEETS);
		$client->setAuthConfig(__DIR__ .'/creds.json');
		$client->setAccessType('offline');

		$sheets = new Google_Service_Sheets($client);
		$spreadsheetId = '1fDrm3XQeh21MESuW-_YrSixa-u0Jj3nh3Qclj5xAswc';
		// The first row contains the column titles, so lets start pulling data from row 2
		$currentRow = 2;// Inicia desde la fila 2
		$updated = false;
		$range = 'A2:BK';
		$rows = $sheets->spreadsheets_values->get($spreadsheetId, $range, ['majorDimension' => 'ROWS']);

		$classRow = prepareData();
		$addRows = [$classRow]; // you can append several rows at once

		if (isset($rows['values'])) {

			foreach ($rows['values'] as $row) {

				if($_SERVER['SERVER_NAME'] == $row[0]){
					//* Si el ID coincide, actualiza la fila

					$updateRange = 'Sheet1!A'.$currentRow.'';
					$updateBody = new Google_Service_Sheets_ValueRange();
					$updateBody->setValues($addRows);
					$sheets->spreadsheets_values->update(
						$spreadsheetId,
						$updateRange,
						$updateBody,
						['valueInputOption' => 'USER_ENTERED']
					);
					$updated = true;
				 break; // Sale del bucle ya que encontró y actualizó la fila
				}
				$currentRow++;
			}
		}

		if(!$updated){
			// Si no se encontró ninguna fila con el ID, agrega una nueva fila
				$updateRange = 'Sheet1';
				$updateBody = new Google_Service_Sheets_ValueRange();
				$updateBody->setValues($addRows);
				$sheets->spreadsheets_values->append(
				$spreadsheetId,
				$updateRange,
				$updateBody,
				['valueInputOption' => 'USER_ENTERED']);
			}


		leadbox_logger()->info('Google Sheets sync completed successfully', array(
			'site' => $_SERVER['SERVER_NAME'] ?? 'unknown',
			'updated' => $updated ? 'existing row' : 'new row',
		));

		wp_send_json_success(array(
			'message' => 'Updated successfully.',
			'reload' => false
		));
	} catch (Exception $e){
		leadbox_logger()->error('Google Sheets sync failed', array(
			'site' => $_SERVER['SERVER_NAME'] ?? 'unknown',
			'error' => $e->getMessage(),
			'trace' => $e->getTraceAsString(),
		));

		wp_send_json_error(array('message' => 'Error: ' . $e->getMessage()));
	}
}

function prepareData(){

    $value = [];
    $lbsettings = get_option('leadbox-settings');
    $contact = get_option('dealer-settings-contact-options');
    $domain = $_SERVER['SERVER_NAME'];
    $dealer_name = $contact['dealer_name'];
    $group_name =  $lbsettings['additional_info_group_name'];
    $primary_make = $lbsettings['manufacturer'];
    $oem_program = $lbsettings['oem_program'];
    $city = $contact['address_city'];
    $state = $contact['address_province'];
    $country = "Canada";
    $live_date = $lbsettings['additional_info_live_data'];
    $purpose = $lbsettings['additional_info_purpose'];
    $leadbox_billing = $lbsettings['additional_info_billing'];

    if(isKinstaUrl()){
        $status = "on develpment";
    }else{
    	$status = "Live";
    }

    $main_languague = get_locale();
    $header = component_version_info('header');
    $navigation = component_version_info('navigation');
    $omnisearch = component_version_info('omnisearch');
    $socialBar = component_version_info('social-bar');
    $footer = component_version_info('footer');
    $hoursFooter = component_version_info('hours-footer');
    $lineup = component_version_info('lineup');
    $srpLayout = component_version_info('srp-layout');
    $srpTitle = component_version_info('srp-title');
    $srpColorizer = component_version_info('srp-colorizer');
    $srpSearchables = component_version_info('srp-searchables');
    $srp_filter = component_version_info('filter');
    $srp_finance = component_version_info('srp-finance');
    $srp_lease = component_version_info('srp-lease');
    $vehicle_card = component_version_info('vehicle-card');
    $vdp_layout = component_version_info('vdp-layout');
    $print_vdp_layout = component_version_info('print-vdp-layout');
    $vdp_title = component_version_info('vdp-title');
    $vdp_gallery =component_version_info('vdp-gallery');
    $vdp_pricing =component_version_info('vdp-pricing');
    $vdp_financing = component_version_info('vdp-finance');
    $vdp_similars = component_version_info('vdp-similars');
    $vdp_cta = component_version_info('vdp-cta');
    $vdp_disclaimer = component_version_info('vdp-disclaimer');
    $vdp_vehicle_features = component_version_info('vdp-vehicle-features');
    $vdp_model_banner = component_version_info('vdp-model-banner');
    $vdp_key_features = component_version_info('vdp-key-features');
    $vdp_installed_options = component_version_info('vdp-installed-options');
    $vdp_sticky_header = component_version_info('vdp-sticky-header');
    $vdp_vehicle_description = component_version_info('vdp-vehicle-description');
    $vdp_fuel_economy = component_version_info('vdp-fuel-economy');
    $srp_payment_calculator = component_version_info('srp-payment-calculator');
    $vdp_payment_calculator = component_version_info('vdp-payment-calculator');
    $vdp_upgrades = component_version_info('vdp-upgrades');
    $blog_list = component_version_info('blog-list');
    $blog_entry_meta = component_version_info('blog-entry-meta');
    $comparison = component_version_info('comparison');
    $comparison_card = component_version_info('comparison-card');
    $comparison_card_thumb = component_version_info('comparison-card-thumb');
    $comparison_card_phantom = component_version_info('comparison-card-phantom');
    $comparison_key_features = component_version_info('comparison-key-features');
    $comparison_key_features_title = component_version_info('comparison-key-features-title');
    $model_trims = component_version_info('model-trims');

	// Verificar existencia de claves antes de acceder a ellas
    $live_agent = validateServices(isset($lbsettings['live_agent']) ? $lbsettings['live_agent'] : '');
    $carfax = validateServices(isset($lbsettings['carfax']) ? $lbsettings['carfax'] : '');
    $iboost = validateServices(isset($lbsettings['iboost']) ? $lbsettings['iboost'] : '');
    $moto_insights = validateServices(isset($lbsettings['moto_insight']) ? $lbsettings['moto_insight'] : '');
    $vinn = validateServices(isset($lbsettings['vinn']) ? $lbsettings['vinn'] : '');
    $cartender = validateServices(isset($lbsettings['cartender']) ? $lbsettings['cartender'] : '');
    $ga_token = isset($lbsettings['google_analytics_id']) ? $lbsettings['google_analytics_id'] : '';
    $gtm_token = isset($lbsettings['google_tag_manager_token']) ? $lbsettings['google_tag_manager_token'] : '';

	array_push($value, $domain, $dealer_name, $group_name, $primary_make, $oem_program, $city, $state, $country, $live_date, $purpose, $status, $leadbox_billing, $main_languague, $header, $navigation, $omnisearch, $socialBar, $footer, $hoursFooter, $lineup, $srpLayout, $srpTitle, $srpColorizer, $srpSearchables, $srp_filter, $srp_finance, $srp_lease, $vehicle_card, $vdp_layout, $print_vdp_layout, $vdp_title, $vdp_gallery, $vdp_pricing, $vdp_financing, $vdp_similars, $vdp_cta, $vdp_disclaimer, $vdp_vehicle_features, $vdp_model_banner, $vdp_key_features, $vdp_installed_options, $vdp_sticky_header, $vdp_vehicle_description, $vdp_fuel_economy, $srp_payment_calculator, $vdp_payment_calculator, $vdp_upgrades, $blog_list, $blog_entry_meta, $comparison, $comparison_card, $comparison_card_thumb, $comparison_card_phantom, $comparison_key_features, $comparison_key_features_title, $model_trims, $live_agent, $carfax, $iboost, $moto_insights, $vinn, $cartender, $ga_token, $gtm_token);

	return $value;
}

function validateServices($lbsettings){
	if($lbsettings == "Enabled")
    return 'yes';
    else
    return 'no';
}


function component_version_info($component)
{
	$childPartial = get_stylesheet_directory() . '/views/partials/' . $component . '.blade.php';
	$childCl = get_stylesheet_directory() . '/views/cl/' . $component;
	$default = 1;

	// Verificar si GENIUS[$component] existe y tiene version
	$genius_version = null;
	if (isset(GENIUS[$component]) && is_array(GENIUS[$component]) && isset(GENIUS[$component]['version'])) {
		$genius_version = GENIUS[$component]['version'];
	}

	if (hasChild()) {
		if (file_exists($childPartial)) {
			$default = $genius_version ? $genius_version . ' (Custom)' : 'N/A (Custom)';
		} else if (file_exists($childCl)) {
			$default = $genius_version ? $genius_version . ' (Custom)' : 'N/A (Custom)';
		} else {
			$default = $genius_version ? $genius_version : 'N/A';
		}
	} else {
		if (file_exists($childPartial)) {
			$default = $genius_version ? $genius_version : 'N/A';
		} else if (file_exists($childCl)) {
			$default = $genius_version ? $genius_version : 'N/A';
		} else {
			$default = $genius_version ? $genius_version : 'N/A';
		}
	}

	if (is_null($default) || $default === 0)
		return 'N/A ' . $component;

	return $default;
}

add_action('send_data_to_sheed_event', 'setDataGoogleSheet');

/**
 * Register weekly cron to send data to Google Sheets
 *
 * Executes once per week to sync site data with Google Sheets
 */
function register_google_sheets_sync_cron() {
  $event = wp_get_scheduled_event('send_data_to_sheed_event');

  // If no event exists, schedule it
  if (!$event) {
    wp_schedule_event(time() + 3600, 'weekly', 'send_data_to_sheed_event');
    leadbox_logger()->info('Google Sheets sync cron scheduled', array(
      'next_run' => date('Y-m-d H:i:s', time() + 3600),
      'recurrence' => 'weekly',
    ));
  }
  // If event exists but has wrong schedule, reschedule it
  elseif (($event->schedule ?? '') !== 'weekly') {
    wp_unschedule_event($event->timestamp, 'send_data_to_sheed_event', $event->args ?? []);
    wp_schedule_event(time() + 3600, 'weekly', 'send_data_to_sheed_event');
    leadbox_logger()->info('Google Sheets sync cron rescheduled', array(
      'old_schedule' => $event->schedule ?? 'unknown',
      'new_schedule' => 'weekly',
      'next_run' => date('Y-m-d H:i:s', time() + 3600),
    ));
  }
}
add_action('admin_init', 'register_google_sheets_sync_cron');

add_filter('cron_schedules', function($s){
  $s['every_2_hours'] = ['interval'=>2*HOUR_IN_SECONDS,'display'=>'Every 2 Hours'];
  return $s;
});

function register_retry_failed_leads_cron() {
  $event = wp_get_scheduled_event('retry_failed_leads_cron');
  if (!$event) {
    wp_schedule_event(time() + 300, 'every_2_hours', 'retry_failed_leads_cron');
  } elseif (($event->schedule ?? '') !== 'every_2_hours') {
    wp_unschedule_event($event->timestamp, 'retry_failed_leads_cron', $event->args ?? []);
    wp_schedule_event(time() + 300, 'every_2_hours', 'retry_failed_leads_cron');
  }
}
add_action('admin_init', 'register_retry_failed_leads_cron');

function retry_failed_leads_cron_callback() {
  $leadbox = new NF_Actions_PushLead();
  $leadbox->retryFailedLeads();
}
add_action('retry_failed_leads_cron', 'retry_failed_leads_cron_callback');

//* Register Custom Post Type Offer
function offer_post_type() {

	$labels = array(
		'name'                  => _x( 'Offers', 'Post Type General Name', 'text_domain' ),
		'singular_name'         => _x( 'Offer', 'Post Type Singular Name', 'text_domain' ),
		'menu_name'             => __( 'Offers', 'text_domain' ),
		'name_admin_bar'        => __( 'Offers', 'text_domain' ),
		'archives'              => __( 'Offer Archives', 'text_domain' ),
		'attributes'            => __( 'Offer Attributes', 'text_domain' ),
		'parent_item_colon'     => __( 'Parent Offer:', 'text_domain' ),
		'all_items'             => __( 'All Offers', 'text_domain' ),
		'add_new_item'          => __( 'Add New Offer', 'text_domain' ),
		'add_new'               => __( 'Add New Offer', 'text_domain' ),
		'new_item'              => __( 'New Offer', 'text_domain' ),
		'edit_item'             => __( 'Edit Offer', 'text_domain' ),
		'update_item'           => __( 'Update Offer', 'text_domain' ),
		'view_item'             => __( 'View Offer', 'text_domain' ),
		'view_items'            => __( 'View Offers', 'text_domain' ),
		'search_items'          => __( 'Search Offer', 'text_domain' ),
		'not_found'             => __( 'Offer Not found', 'text_domain' ),
		'not_found_in_trash'    => __( 'Offer Not found in Trash', 'text_domain' ),
		'featured_image'        => __( 'Featured Image', 'text_domain' ),
		'set_featured_image'    => __( 'Set featured image', 'text_domain' ),
		'remove_featured_image' => __( 'Remove featured image', 'text_domain' ),
		'use_featured_image'    => __( 'Use as featured image', 'text_domain' ),
		'insert_into_item'      => __( 'Insert into Offer', 'text_domain' ),
		'uploaded_to_this_item' => __( 'Uploaded to this Offer', 'text_domain' ),
		'items_list'            => __( 'Offer list', 'text_domain' ),
		'items_list_navigation' => __( 'Offer list navigation', 'text_domain' ),
		'filter_items_list'     => __( 'Filter Offers list', 'text_domain' ),
	);
	$args = array(
        'label'               => __( 'Offer', 'text_domain' ),
        'description'         => __( 'Promotional offers management', 'text_domain' ),
        'labels'              => $labels,
        'supports'            => array(
            'title',
            'editor',
            'thumbnail',
            'revisions',
            'custom-fields',
            'page-attributes'
        ),
        'taxonomies'          => array(), // Eliminar category y post_tag a menos que realmente los necesites
        'hierarchical'        => false,
        'public'              => true,
        'show_ui'             => true,
        'show_in_menu'       => true,
        'menu_position'       => 27,
        'menu_icon'           => 'dashicons-analytics', // Icono más adecuado para ofertas
        'show_in_admin_bar'   => true,
        'show_in_nav_menus'   => false,
        'can_export'          => true,
        'has_archive'        => false, // O 'offers' para slug personalizado
        'rewrite'            => false/* array(
            'slug' => 'offers', // Slug amigable para URLs
            'with_front' => false
        ) */,
        'exclude_from_search' => false,
        'publicly_queryable' => false,
        'capability_type'     => 'post',
        'show_in_rest'       => true, // Habilitar para Gutenberg
    );

    register_post_type( 'offer', $args ); // ¡Corregir el nombre aquí!

    register_taxonomy('offer_category', 'offer', [
        'label' => 'Offer Categories',
        'hierarchical' => true,
        'show_ui' => true,
        'show_admin_column' => true,
        'rewrite' => false,
        'show_in_rest' => true,
    ]);
}
add_action( 'init', 'offer_post_type', 0 );

function register_offer_taxonomy() {
    $labels = array(
        'name'              => __( 'Categories', 'text_domain' ),
        'singular_name'     => __( 'Category', 'text_domain' ),
        'all_items'         => __( 'All Categories', 'text_domain' ),
        'edit_item'         => __( 'Edit Category', 'text_domain' ),
        'view_item'         => __( 'View Category', 'text_domain' ),
        'update_item'       => __( 'Update Category', 'text_domain' ),
        'add_new_item'      => __( 'Add New Category', 'text_domain' ),
        'new_item_name'     => __( 'New Category Name', 'text_domain' ),
        'menu_name'         => __( 'Categories', 'text_domain' ),
    );

    $args = array(
        'hierarchical'      => true, // Como categorías (no tags)
        'labels'            => $labels,
        'show_ui'           => true,
        'show_admin_column' => false,
        'show_in_rest'      => true,
        'rewrite'           => false, // Desactiva uso del slug en URLs
        'public'            => false, // No accesible en el front
    );

    register_taxonomy( 'offer_category', array( 'offer' ), $args );
}
add_action( 'init', 'register_offer_taxonomy', 0 );

function hide_unwanted_category_fields() {
    $screen = get_current_screen();

    // Aplica solo a la taxonomía personalizada 'offer_category'
    if ( $screen->taxonomy === 'offer_category' ) {
        echo '
        <style>
            .term-slug-wrap,
            .term-parent-wrap,
            .term-description-wrap,
            th.column-slug,
            td.slug.column-slug,
            th.column-description,
            td.description.column-description {
                display: none !important;
            }
        </style>';
    }
}
add_action( 'admin_head', 'hide_unwanted_category_fields' );


//* Añadir columnas personalizadas al listado de offers
function add_offer_date_columns($columns) {
    $new_columns = array(
        'start_date' => __('Start Date', 'text_domain'),
        'end_date' => __('End Date', 'text_domain'),
    );

    // Insertar después de la columna de título
    return array_slice($columns, 0, 2, true) + $new_columns + array_slice($columns, 2, null, true);
}
add_filter('manage_offer_posts_columns', 'add_offer_date_columns');

//* Mostrar los valores en las nuevas columnas
function show_offer_date_columns($column, $post_id) {
    switch ($column) {
        case 'start_date':
            $start_date = get_post_meta($post_id, '_offer_start_date', true);
            echo $start_date ? date('Y/m/d', strtotime($start_date)) : '—';
            break;

        case 'end_date':
            $end_date = get_post_meta($post_id, '_offer_end_date', true);
            echo $end_date ? date('Y/m/d', strtotime($end_date)) : '—';
            break;
    }
}
add_action('manage_offer_posts_custom_column', 'show_offer_date_columns', 10, 2);

//* Hacer que las columnas sean ordenables
function make_offer_date_columns_sortable($columns) {
    $columns['start_date'] = 'start_date';
    $columns['end_date'] = 'end_date';
    return $columns;
}
add_filter('manage_edit-offer_sortable_columns', 'make_offer_date_columns_sortable');

//* Modificar la consulta para ordenar por las fechas
function sort_offers_by_date($query) {
    if (!is_admin() || !$query->is_main_query() || $query->get('post_type') !== 'offer') {
        return;
    }

    $orderby = $query->get('orderby');

    if ($orderby === 'start_date') {
        $query->set('meta_key', '_offer_start_timestamp');
        $query->set('orderby', 'meta_value_num');
    } elseif ($orderby === 'end_date') {
        $query->set('meta_key', '_offer_end_timestamp');
        $query->set('orderby', 'meta_value_num');
    }
}
add_action('pre_get_posts', 'sort_offers_by_date');

// Agregar columna de categoría en la lista de ofertas
function add_offer_category_column($columns) {
    $columns['offer_category'] = __('Category', 'text_domain');
    return $columns;
}
add_filter('manage_offer_posts_columns', 'add_offer_category_column');

// Mostrar el valor de la categoría
function show_offer_category_column($column, $post_id) {
    if ($column === 'offer_category') {
        $terms = get_the_terms($post_id, 'offer_category');
        if (!empty($terms) && !is_wp_error($terms)) {
            $term_names = wp_list_pluck($terms, 'name');
            echo implode(', ', $term_names);
        } else {
            echo __('No Category', 'text_domain');
        }
    }
}
add_action('manage_offer_posts_custom_column', 'show_offer_category_column', 10, 2);

function offer_sortable_columns($columns) {
    $columns['offer_category'] = 'offer_category';
    return $columns;
}
add_filter('manage_edit-offer_sortable_columns', 'offer_sortable_columns');

//* Añadir metaboxes a la pantalla de edición de ofertas
function add_offer_metaboxes() {
    add_meta_box(
        'offer_details_meta',
        __('Offer Details', 'text_domain'),
        'render_offer_details_meta',
        'offer',
        'normal',
        'high'
    );

    add_meta_box(
        'offer_cta_meta',
        __('Call to Action', 'text_domain'),
        'render_offer_cta_meta',
        'offer',
        'normal',
        'high'
    );

    add_meta_box(
        'offer_dates_meta',
        __('Offer Dates', 'text_domain'),
        'render_offer_dates_meta',
        'offer',
        'side',
        'default'
    );
}
add_action('add_meta_boxes', 'add_offer_metaboxes');

//* Renderizar el metabox del disclaimer
function render_offer_details_meta($post) {
    wp_nonce_field('save_offer_meta', 'offer_meta_nonce');

    $disclaimer = get_post_meta($post->ID, '_offer_disclaimer', true);

    echo '<div style="margin-bottom: 20px;">';
    echo '<label for="offer_disclaimer" style="display: block; margin-bottom: 5px; font-weight: bold;">';
    echo __('Disclaimer', 'text_domain');
    echo '</label>';
    echo '<textarea id="offer_disclaimer" name="offer_disclaimer" style="width: 100%; min-height: 80px;">';
    echo esc_textarea($disclaimer);
    echo '</textarea>';
    echo '</div>';
}
//* Renderizar el metabox de los CTA
function render_offer_cta_meta($post) {
    // Main CTA
    $main_cta_label = get_post_meta($post->ID, '_offer_main_cta_label', true);
    $main_cta_value = get_post_meta($post->ID, '_offer_main_cta_value', true);
    $main_cta_target = get_post_meta($post->ID, '_offer_main_cta_target', true);
    $main_cta_color = get_post_meta($post->ID, '_offer_main_cta_color', true);

    // Secondary CTA
    $secondary_cta_label = get_post_meta($post->ID, '_offer_secondary_cta_label', true);
    $secondary_cta_value = get_post_meta($post->ID, '_offer_secondary_cta_value', true);
    $secondary_cta_target = get_post_meta($post->ID, '_offer_secondary_cta_target', true);
    $secondary_cta_color = get_post_meta($post->ID, '_offer_secondary_cta_color', true);

    // Check if colors should use default (null/empty)
    $main_cta_use_default = empty($main_cta_color);
    $secondary_cta_use_default = empty($secondary_cta_color);

    echo '<div style="display: grid; grid-template-columns: 1fr 1fr; gap: 20px;">';

    // Main CTA
    echo '<div>';
    echo '<h3 style="margin-top: 0;">' . __('Main CTA', 'text_domain') . '</h3>';

    echo '<div style="margin-bottom: 15px;">';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('Label', 'text_domain') . '</label>';
    echo '<input maxlength="24" type="text" name="offer_main_cta_label" value="' . esc_attr($main_cta_label) . '" style="width: 100%;">';
    echo '</div>';

    echo '<div style="margin-bottom: 15px;">';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('URL', 'text_domain') . '</label>';
    echo '<input type="url" name="offer_main_cta_value" value="' . esc_url($main_cta_value) . '" style="width: 100%;">';
    echo '</div>';

    echo '<div style="margin-bottom: 15px;">';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('Target', 'text_domain') . '</label>';
    echo '<select name="offer_main_cta_target" style="width: 100%;">';
    echo '<option value="_self" ' . selected($main_cta_target, '_self', false) . '>' . __('Same Page', 'text_domain') . '</option>';
    echo '<option value="_blank" ' . selected($main_cta_target, '_blank', false) . '>' . __('New Page', 'text_domain') . '</option>';
    echo '</select>';
    echo '</div>';

    echo '<div>';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('Button Color', 'text_domain') . '</label>';
    echo '<div style="display: flex; align-items: center; gap: 10px;">';
    echo '<input type="color" id="offer_main_cta_color" name="offer_main_cta_color" value="' . esc_attr($main_cta_color ?: '#000000') . '" style="width: 100px; height: 40px; cursor: pointer; border: 1px solid #ddd; border-radius: 4px;' . ($main_cta_use_default ? ' opacity: 0.5;' : '') . '"' . ($main_cta_use_default ? ' disabled' : '') . '>';
    echo '<label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">';
    echo '<input type="checkbox" name="offer_main_cta_use_default" value="1"' . checked($main_cta_use_default, true, false) . ' onchange="document.getElementById(\'offer_main_cta_color\').disabled = this.checked; document.getElementById(\'offer_main_cta_color\').style.opacity = this.checked ? \'0.5\' : \'1\';">';
    echo '<span>' . __('Use default', 'text_domain') . '</span>';
    echo '</label>';
    echo '</div>';
    echo '</div>';
    echo '</div>';

    // Secondary CTA
    echo '<div>';
    echo '<h3 style="margin-top: 0;">' . __('Secondary CTA', 'text_domain') . '</h3>';

    echo '<div style="margin-bottom: 15px;">';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('Label', 'text_domain') . '</label>';
    echo '<input maxlength="24" type="text" name="offer_secondary_cta_label" value="' . esc_attr($secondary_cta_label) . '" style="width: 100%;">';
    echo '</div>';

    echo '<div style="margin-bottom: 15px;">';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('URL', 'text_domain') . '</label>';
    echo '<input type="url" name="offer_secondary_cta_value" value="' . esc_url($secondary_cta_value) . '" style="width: 100%;">';
    echo '</div>';

    echo '<div style="margin-bottom: 15px;">';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('Target', 'text_domain') . '</label>';
    echo '<select name="offer_secondary_cta_target" style="width: 100%;">';
    echo '<option value="_self" ' . selected($secondary_cta_target, '_self', false) . '>' . __('Same page', 'text_domain') . '</option>';
    echo '<option value="_blank" ' . selected($secondary_cta_target, '_blank', false) . '>' . __('New page', 'text_domain') . '</option>';
    echo '</select>';
    echo '</div>';

    echo '<div>';
    echo '<label style="display: block; margin-bottom: 5px;">' . __('Button Color', 'text_domain') . '</label>';
    echo '<div style="display: flex; align-items: center; gap: 10px;">';
    echo '<input type="color" id="offer_secondary_cta_color" name="offer_secondary_cta_color" value="' . esc_attr($secondary_cta_color ?: '#000000') . '" style="width: 100px; height: 40px; cursor: pointer; border: 1px solid #ddd; border-radius: 4px;' . ($secondary_cta_use_default ? ' opacity: 0.5;' : '') . '"' . ($secondary_cta_use_default ? ' disabled' : '') . '>';
    echo '<label style="display: flex; align-items: center; gap: 5px; cursor: pointer;">';
    echo '<input type="checkbox" name="offer_secondary_cta_use_default" value="1"' . checked($secondary_cta_use_default, true, false) . ' onchange="document.getElementById(\'offer_secondary_cta_color\').disabled = this.checked; document.getElementById(\'offer_secondary_cta_color\').style.opacity = this.checked ? \'0.5\' : \'1\';">';
    echo '<span>' . __('Use default', 'text_domain') . '</span>';
    echo '</label>';
    echo '</div>';
    echo '</div>';
    echo '</div>';

    echo '</div>'; // Cierre del grid
}
//* Renderizar el metabox de las fechas de la oferta
function render_offer_dates_meta($post) {
    $start_date = get_post_meta($post->ID, '_offer_start_date', true);
    $end_date = get_post_meta($post->ID, '_offer_end_date', true);

    echo '<div style="margin-bottom: 15px;">';
    echo '<label style="display: block; margin-bottom: 5px; font-weight: bold;">' . __('Start Date', 'text_domain') . '</label>';
    echo '<input type="date" name="offer_start_date" value="' . esc_attr($start_date) . '" style="width: 100%;">';
    echo '</div>';

    echo '<div>';
    echo '<label style="display: block; margin-bottom: 5px; font-weight: bold;">' . __('End Date', 'text_domain') . '</label>';
    echo '<input type="date" name="offer_end_date" value="' . esc_attr($end_date) . '" style="width: 100%;">';
    echo '</div>';
}

//* Guardar los campos personalizados de las ofertas
function save_offer_meta($post_id) {
    // Verificar nonce
    if (!isset($_POST['offer_meta_nonce']) || !wp_verify_nonce($_POST['offer_meta_nonce'], 'save_offer_meta')) {
        return;
    }

    // Verificar permisos
    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    // Bandera para mensajes
    $message_code = false;
    $dates_swapped = false;
    $has_invalid_html = false;

    // Campos a guardar con sus respectivos sanitizadores
    $fields = array(
        'offer_disclaimer' => 'sanitize_textarea_field',
        'offer_main_cta_value' => 'esc_url_raw',
        'offer_secondary_cta_value' => 'esc_url_raw',
        'offer_main_cta_label' => 'sanitize_text_field',
        'offer_main_cta_target' => 'sanitize_text_field',
        'offer_main_cta_color' => 'sanitize_hex_color',
        'offer_secondary_cta_label' => 'sanitize_text_field',
        'offer_secondary_cta_target' => 'sanitize_text_field',
        'offer_secondary_cta_color' => 'sanitize_hex_color',
        'offer_start_date' => 'sanitize_text_field',
        'offer_end_date' => 'sanitize_text_field'
    );

    // Handle "Use default" checkboxes for CTA colors - set to empty string if checked
    if (isset($_POST['offer_main_cta_use_default'])) {
        update_post_meta($post_id, '_offer_main_cta_color', '');
        unset($fields['offer_main_cta_color']); // Don't process this field in the loop
    }
    if (isset($_POST['offer_secondary_cta_use_default'])) {
        update_post_meta($post_id, '_offer_secondary_cta_color', '');
        unset($fields['offer_secondary_cta_color']); // Don't process this field in the loop
    }

    // Procesar campos estándar
    foreach ($fields as $field => $sanitizer) {
        if (isset($_POST[$field])) {
            $value = call_user_func($sanitizer, $_POST[$field]);
            update_post_meta($post_id, '_' . $field, $value);
        }
    }

    // Manejo especial para la descripción (verificación de HTML)
    if (isset($_POST['offer_description'])) {
        $allowed_html = array(
            'a' => array('href' => array(), 'title' => array(), 'target' => array(), 'style' => array(), 'class' => array()),
            'br' => array(),
            'em' => array('style' => array(), 'class' => array()),
            'strong' => array('style' => array(), 'class' => array()),
            'p' => array('style' => array(), 'class' => array()),
            'span' => array('style' => array(), 'class' => array()),
            'div' => array('style' => array(), 'class' => array()),
            'ul' => array('style' => array(), 'class' => array()),
            'ol' => array('style' => array(), 'class' => array()),
            'li' => array('style' => array(), 'class' => array()),
            'h1' => array('style' => array(), 'class' => array()),
            'h2' => array('style' => array(), 'class' => array()),
            'h3' => array('style' => array(), 'class' => array()),
            'h4' => array('style' => array(), 'class' => array()),
            'h5' => array('style' => array(), 'class' => array()),
            'h6' => array('style' => array(), 'class' => array()),
            'img' => array('src' => array(), 'alt' => array(), 'title' => array(), 'width' => array(), 'height' => array(), 'srcset' => array(), 'sizes' => array(), 'loading' => array(), 'style' => array(), 'class' => array()),
            'blockquote' => array('cite' => array(), 'style' => array(), 'class' => array()),
            'del' => array('datetime' => array(), 'style' => array(), 'class' => array()),
            'ins' => array('datetime' => array(), 'style' => array(), 'class' => array()),
            'code' => array('style' => array(), 'class' => array()),
        );

        $original_description = $_POST['offer_description'];
        $sanitized_description = wp_kses($original_description, $allowed_html);

        // Verificar si se eliminó algún HTML no permitido
        if ($original_description !== $sanitized_description) {
            $has_invalid_html = true;
        }

        update_post_meta($post_id, '_offer_description', $sanitized_description);
    }

    // Manejo especial para fechas
    $start_date = isset($_POST['offer_start_date']) ? $_POST['offer_start_date'] : '';
    $end_date = isset($_POST['offer_end_date']) ? $_POST['offer_end_date'] : '';

    if (!empty($start_date) && !empty($end_date)) {
        if (strtotime($end_date) < strtotime($start_date)) {
            // Intercambiar fechas si están invertidas
            $temp = $start_date;
            $start_date = $end_date;
            $end_date = $temp;
            $dates_swapped = true;

            update_post_meta($post_id, '_offer_start_date', sanitize_text_field($start_date));
            update_post_meta($post_id, '_offer_end_date', sanitize_text_field($end_date));
        }
    }

    // Guardar timestamps para ordenamiento
    $start_timestamp = !empty($start_date) ? strtotime($start_date . ' 00:00:00') : 0;
	$end_timestamp = !empty($end_date) ? strtotime($end_date . ' 23:59:59') : PHP_INT_MAX;

    update_post_meta($post_id, '_offer_start_timestamp', $start_timestamp);
    update_post_meta($post_id, '_offer_end_timestamp', $end_timestamp);

    // Crear meta clave especial para ordenamiento
    $sorting_key = $end_timestamp;
    update_post_meta($post_id, '_offer_sorting_key', $sorting_key);

    // Determinar qué mensaje mostrar
    if ($dates_swapped && $has_invalid_html) {
        $message_code = 13; // Ambos casos
    } elseif ($dates_swapped) {
        $message_code = 11; // Solo fechas intercambiadas
    } elseif ($has_invalid_html) {
        $message_code = 12; // Solo HTML no permitido
    } else {
        $message_code = 10; // Actualización exitosa
    }

    // Agregar mensaje a la redirección
    add_filter('redirect_post_location', function($location) use ($message_code) {
        return add_query_arg('message', $message_code, $location);
    });
}
add_action('save_post_offer', 'save_offer_meta');

//* Estilos CSS personalizados para la pantalla de edición de ofertas
function offer_admin_styles() {
    global $post_type;

    if ($post_type == 'offer') {
        echo '<style>
            .post-type-offer #postdivrich {
                margin-top: 20px;
            }
            .cmb2-metabox {
                display: grid;
                gap: 20px;
            }
            .cmb-row {
                background: #fff;
                padding: 15px;
                border: 1px solid #ccd0d4;
                box-shadow: 0 1px 1px rgba(0,0,0,0.04);
            }
        </style>';
    }
}
add_action('admin_head', 'offer_admin_styles');

//* Añadir mensajes personalizados para el tipo de post offer
function offer_admin_messages($messages) {
    $messages['offer'][10] = __('Offer updated successfully.', 'text_domain');
    $messages['offer'][11] = __('Notice: The end date was before the start date, so the dates were swapped automatically.', 'text_domain');
    $messages['offer'][12] = __('Notice: Some HTML tags in the description were removed as they are not allowed.', 'text_domain');
    $messages['offer'][13] = __('Notice: Dates were swapped automatically and some HTML tags were removed from the description.', 'text_domain');

    return $messages;
}
add_filter('post_updated_messages', 'offer_admin_messages');

//* Ocultar el editor por defecto en la pantalla de edición de ofertas
function hide_default_editor_for_offer() {
    remove_post_type_support('offer', 'editor');
}
add_action('admin_init', 'hide_default_editor_for_offer');

//* Añadir un metabox para la descripción de la oferta
function add_offer_description_metabox() {
    add_meta_box(
        'offer_description_meta',
        __('Offer Description', 'text_domain'),
        'render_offer_description_metabox',
        'offer',
        'normal',
        'high'
    );
}
add_action('add_meta_boxes', 'add_offer_description_metabox');

//* Renderizar el metabox de la descripción de la oferta
function render_offer_description_metabox($post) {
    wp_nonce_field('save_offer_description', 'offer_description_nonce');

    $description = get_post_meta($post->ID, '_offer_description', true);

    echo '<div style="margin-bottom: 15px;">';
    echo '<label for="offer_description" style="display: block; margin-bottom: 5px; font-weight: bold;">';
    echo __('Description', 'text_domain');
    echo '</label>';
    wp_editor($description, 'offer_description', array(
        'textarea_name' => 'offer_description',
        'textarea_rows' => 8,
        'media_buttons' => true,
    ));
    echo '<p class="description">';
    echo __('Enter the offer description (basic HTML allowed)', 'leadbox-plugin');
    echo '</p>';
    echo '</div>';
}

//* Registrar el metabox para el selector de idioma
function add_language_metabox() {
	if (function_exists('pll_languages_list')) {
		add_meta_box(
			'offer_language_meta',
			__('Offer Language', 'text_domain'),
			'render_language_metabox',
			'offer',
			'side',
			'default'
		);
	}
}
add_action('add_meta_boxes', 'add_language_metabox');

//* Renderizar el contenido del metabox
function render_language_metabox($post) {
	if (!function_exists('pll_languages_list')) {
        return;
    }
    $current_language = get_post_meta($post->ID, '_offer_language', true);

    wp_nonce_field('save_offer_language', 'offer_language_nonce');

    echo '<div style="margin-bottom: 10px;">';
    echo '<label for="offer_language" style="display: block; margin-bottom: 5px; font-weight: bold;">';
    echo __('Select Language', 'text_domain');
    echo '</label>';

    echo '<select id="offer_language" name="offer_language" style="width: 100%;">';
    echo '<option value="eng" ' . selected($current_language, 'eng', false) . '>' . __('English', 'text_domain') . '</option>';
    echo '<option value="fr" ' . selected($current_language, 'fr', false) . '>' . __('French', 'text_domain') . '</option>';
    echo '</select>';
    echo '</div>';

    echo '<p class="description">' . __('Select the language for this offer', 'text_domain') . '</p>';
}

//* Guardar el valor del lenguaje
function save_offer_language($post_id) {
    if (function_exists('pll_languages_list')) {
        if (!isset($_POST['offer_language_nonce']) || !wp_verify_nonce($_POST['offer_language_nonce'], 'save_offer_language')) {
            return;
        }
    }

    if (!current_user_can('edit_post', $post_id)) {
        return;
    }

    $language = 'eng'; // Valor por defecto

    if (function_exists('pll_languages_list') && isset($_POST['offer_language'])) {
        $allowed_values = array('eng', 'fr');
        $language = in_array($_POST['offer_language'], $allowed_values) ? $_POST['offer_language'] : 'eng';
    }

    update_post_meta($post_id, '_offer_language', sanitize_text_field($language));
}
add_action('save_post_offer', 'save_offer_language');

function add_language_column($columns) {
    $new_columns = array(
        'language' => __('Language', 'text_domain'),
    );

    return array_slice($columns, 0, 2, true) + $new_columns + array_slice($columns, 2, null, true);
}
add_filter('manage_offer_posts_columns', 'add_language_column');

//* Mostrar el valor del idioma en la columna
function show_language_column($column, $post_id) {
    if ($column === 'language') {
        $language = get_post_meta($post_id, '_offer_language', true);

        switch ($language) {
            case 'fr':
				echo '<span title="French" style="display: inline-block; width: 20px; height: 20px; color: #012169; text-align: center; line-height: 20px; border-radius: 3px;">FR</span>';
				echo '<img src="https://upload.wikimedia.org/wikipedia/commons/thumb/5/5f/Flag_of_Quebec.svg/1200px-Flag_of_Quebec.svg.png" alt="Quebec flag" style=" width: 15px; height: 10px; margin-left: 5px; vertical-align: middle;">';
                break;
            case 'eng':
            default:
                echo '<span title="English" style="display: inline-block; width: 20px; height: 20px; color: #ED2939; text-align: center; line-height: 20px; border-radius: 3px;">EN</span>';
                echo '<span title="English" style="display: inline-block; width: 20px; height: 20px; text-align: center; line-height: 20px; border-radius: 3px;">🇨🇦</span>';
				break;
        }
    }
}
add_action('manage_offer_posts_custom_column', 'show_language_column', 10, 2);

//* Hacer que la columna de idioma sea ordenable
function make_language_column_sortable($columns) {
    $columns['language'] = 'language';
    return $columns;
}
add_filter('manage_edit-offer_sortable_columns', 'make_language_column_sortable');

//* Modificar la consulta para ordenar por idioma
function sort_offers_by_language($query) {
    if (!is_admin() || !$query->is_main_query() || $query->get('post_type') !== 'offer') {
        return;
    }

    if ($query->get('orderby') === 'language') {
        $query->set('meta_key', '_offer_language');
        $query->set('orderby', 'meta_value');
    }
}
add_action('pre_get_posts', 'sort_offers_by_language');

//* Add Sort Column to Offer List
function add_offer_sort_column($columns) {
    $columns['offer_sort'] = '<span class="dashicons dashicons-menu" title="' . __('Drag to reorder', 'text_domain') . '"></span>';
    return $columns;
}
add_filter('manage_offer_posts_columns', 'add_offer_sort_column');

//* Render Sort Column Content
function show_offer_sort_column($column, $post_id) {
    if ($column === 'offer_sort') {
        echo '<span class="dashicons dashicons-menu move-offer" style="cursor: move; color: #999;"></span>';
    }
}
add_action('manage_offer_posts_custom_column', 'show_offer_sort_column', 10, 2);

//* Enqueue Admin Scripts for Offer Sorting
function enqueue_offer_admin_scripts($hook) {
    global $post_type;
    if ($hook == 'edit.php' && $post_type == 'offer') {
        wp_enqueue_script('jquery-ui-sortable');
        wp_enqueue_script('offer-admin-sort', plugin_dir_url(__FILE__) . '../assets/js/admin-offer-sort.js', array('jquery', 'jquery-ui-sortable'), '1.0', true);
        wp_localize_script('offer-admin-sort', 'leadbox_offer_sort', array(
            'security' => wp_create_nonce('offer_sort_nonce')
        ));
    }
}
add_action('admin_enqueue_scripts', 'enqueue_offer_admin_scripts');

//* Handle AJAX Offer Sorting
function save_offer_order() {
    check_ajax_referer('offer_sort_nonce', 'security');

    if (!current_user_can('edit_posts')) {
        wp_send_json_error('Insufficient permissions');
    }

    if (!isset($_POST['order']) || !is_array($_POST['order'])) {
        wp_send_json_error('Invalid data');
    }

    $order = $_POST['order'];
    foreach ($order as $index => $post_id) {
        wp_update_post(array(
            'ID' => intval($post_id),
            'menu_order' => $index
        ));
    }

    wp_send_json_success('Order saved');
}
add_action('wp_ajax_save_offer_order', 'save_offer_order');

//* Update Default Query to Sort by Menu Order
function sort_offers_by_menu_order($query) {
    // Frontend: Main query for offers
    if (!is_admin() && $query->is_main_query() && $query->get('post_type') === 'offer') {
        $query->set('orderby', 'menu_order');
        $query->set('order', 'ASC');
        return;
    }

    // Admin: Offer list
    if (is_admin() && $query->is_main_query() && $query->get('post_type') === 'offer') {
        if (!isset($_GET['orderby'])) {
            $query->set('orderby', 'menu_order');
            $query->set('order', 'ASC');
        }
    }
}
add_action('pre_get_posts', 'sort_offers_by_menu_order');

Home - Capital GMC Buick Regina

No data

Welcome to Capital GMC BUICK – REGINA

Thank you for choosing Capital GMC Buick | Regina, your premier certified Buick and GMC dealership proudly serving drivers in Regina and the surrounding communities. Whether you’re searching for a brand-new Buick or GMC vehicle or a meticulously inspected pre-owned model, we have a diverse selection to match your needs and lifestyle.

Beyond our impressive inventory, we offer a seamless and stress-free financing experience through our well-connected finance centre, where our team of experts is dedicated to securing the best loan or lease options for you, quickly, transparently, and hassle-free.

But our commitment to you doesn’t stop at the sale. Our state-of-the-art service centre is staffed with skilled Buick and GMC technicians who use the latest equipment and genuine OEM parts to keep your vehicle running at its best. From routine maintenance to complex repairs, we’ve got you covered.

Experience top-tier customer service, quality vehicles, and expert care, all in one place. Visit Capital GMC Buick | Regina today or call us at 306-205-8072 with any questions. We’re here to help!

Ask a Question