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');