<?php
require '../vendor/autoload.php';

use Bramus\Router\Router;
use Symfony\Component\Dotenv\Dotenv;

$validLocales = [
    'en',
    'de',
    'fr',
    'fi',
    'pl',
    'it',
    'pt',
    'es',
];

$routePath = implode('|', $validLocales);

$router = new Router();

$router->get('/', function() {
    // add query string to keep utm passing through
    if (empty($_SERVER['QUERY_STRING'])) {
        header('Location: /en');
    } else {
        header('Location: /en?' . $_SERVER['QUERY_STRING']);
    }
    exit;
});

$router->get('/(' . $routePath . ')', function ($locale) {
    $language = json_decode(file_get_contents(__DIR__ . '/../src/locales/' . $locale . '.json'));

    echo replace_meta([
        '<title>' . addslashes($language->pages->home->meta_title) . '</title>',
        '<meta name="description" content="' . addslashes($language->pages->home->description) . '" data-vue-controlled>',
        '<meta property="og:url" content="' . get_page_url() . '" data-vue-controlled>',
        '<meta property="og:title" content="' . addslashes($language->pages->home->meta_title) . '" data-vue-controlled>',
        '<meta property="og:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta property="og:type" content="website" data-vue-controlled>',
        '<meta property="og:description" content="' . addslashes($language->pages->home->description) . '" data-vue-controlled>',
        '<meta name="twitter:title" content="' . addslashes($language->pages->home->meta_title) . '" data-vue-controlled>',
        '<meta name="twitter:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta name="twitter:description" content="' . addslashes($language->pages->home->description) . '" data-vue-controlled>',
        '<meta name="twitter:card" content="summary_large_image" data-vue-controlled>',
        '<link rel="prefetch" href="/' . $locale . '/map">',
    ], $locale);
    exit;
});

$router->get('/(' . $routePath . ')/map', function ($locale) {
    $language = json_decode(file_get_contents(__DIR__ . '/../src/locales/' . $locale . '.json'));

    echo replace_meta([
        '<title>' . addslashes($language->pages->map->meta_title) . '</title>',
        '<meta name="description" content="' . addslashes($language->pages->map->description) . '" data-vue-controlled>',
        '<meta property="og:url" content="' . get_page_url() . '" data-vue-controlled>',
        '<meta property="og:title" content="' . addslashes($language->pages->map->meta_title) . '" data-vue-controlled>',
        '<meta property="og:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta property="og:type" content="website" data-vue-controlled>',
        '<meta property="og:description" content="' . addslashes($language->pages->map->description) . '" data-vue-controlled>',
        '<meta name="twitter:title" content="' . addslashes($language->pages->map->meta_title) . '" data-vue-controlled>',
        '<meta name="twitter:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta name="twitter:description" content="' . addslashes($language->pages->map->description) . '" data-vue-controlled>',
        '<meta name="twitter:card" content="summary_large_image" data-vue-controlled>'
    ], $locale);
    exit;
});

$router->get('/(' . $routePath . ')/case-study/{caseStudySlug}/{id}', function ($locale, $caseStudySlug, $id) {
    load_env();

    $data = fetch_case_studies($locale);

    $metaTags = [];
    if (isset($data['data']['getCaseStudyListing']['edges'])) {
        foreach ($data['data']['getCaseStudyListing']['edges'] as $edge) {
            if ($edge['node']['id'] == $id && ($locale !== 'en' && in_array($locale, $edge['node']['translated_to'], true))) {
                $image = $_ENV['VUE_APP_PIMCORE_URL'];

                if (!empty($edge['node']['meta_image'])) {
                    $image .= $edge['node']['meta_image']['fullpath'];
                }

                $metaTags = [
                    '<title>' . addslashes($edge['node']['meta_title']) . '</title>',
                    '<meta name="description" content="' . addslashes($edge['node']['meta_title']) . '" data-vue-controlled>',
                    '<meta property="og:url" content="' . get_page_url() . '" data-vue-controlled>',
                    '<meta property="og:title" content="' . addslashes($edge['node']['meta_title']) . '" data-vue-controlled>',
                    '<meta property="og:image" content="' . $image . '" data-vue-controlled>',
                    '<meta property="og:type" content="website" data-vue-controlled>',
                    '<meta property="og:description" content="' . addslashes($edge['node']['meta_description']) . '" data-vue-controlled>',
                    '<meta name="twitter:title" content="' . addslashes($edge['node']['meta_title']) . '" data-vue-controlled>',
                    '<meta name="twitter:image" content="' . $image . '" data-vue-controlled>',
                    '<meta name="twitter:description" content="' . addslashes($edge['node']['meta_description']) . '" data-vue-controlled>',
                    '<meta name="twitter:card" content="summary_large_image" data-vue-controlled>'
                ];

                break;
            }
        }
    }

    // if no match found
    if (count($metaTags) === 0) {
        header('HTTP/1.0 404 Not Found', true, 404);
        echo file_get_contents('index.html');
        exit;
    }

    echo replace_meta($metaTags, $locale);
    exit;
});


$router->get('/(' . $routePath . ')/stay-updated', function ($locale) {
    $language = json_decode(file_get_contents(__DIR__ . '/../src/locales/' . $locale . '.json'));

    echo replace_meta([
        '<title>' . addslashes($language->pages->stay_updated->meta_title) . '</title>',
        '<meta name="description" content="' . addslashes($language->pages->stay_updated->description) . '" data-vue-controlled>',
        '<meta property="og:url" content="' . get_page_url() . '" data-vue-controlled>',
        '<meta property="og:title" content="' . addslashes($language->pages->stay_updated->meta_title) . '" data-vue-controlled>',
        '<meta property="og:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta property="og:type" content="website" data-vue-controlled>',
        '<meta property="og:description" content="' . addslashes($language->pages->stay_updated->description) . '" data-vue-controlled>',
        '<meta name="twitter:title" content="' . addslashes($language->pages->stay_updated->meta_title) . '" data-vue-controlled>',
        '<meta name="twitter:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta name="twitter:description" content="' . addslashes($language->pages->stay_updated->description) . '" data-vue-controlled>',
        '<meta name="twitter:card" content="summary_large_image" data-vue-controlled>'
    ], $locale);
    exit;
});

$router->get('/(' . $routePath . ')/stay-updated/success', function ($locale) {
    $language = json_decode(file_get_contents(__DIR__ . '/../src/locales/' . $locale . '.json'));

    echo replace_meta([
        '<title>' . addslashes($language->pages->stay_updated->meta_title) . ' Success</title>',
        '<meta name="description" content="' . addslashes($language->pages->stay_updated->description) . ' Success" data-vue-controlled>',
        '<meta property="og:url" content="' . get_page_url() . '" data-vue-controlled>',
        '<meta property="og:title" content="' . addslashes($language->pages->stay_updated->meta_title) . ' Success" data-vue-controlled>',
        '<meta property="og:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta property="og:type" content="website" data-vue-controlled>',
        '<meta property="og:description" content="' . addslashes($language->pages->stay_updated->description) . ' Success" data-vue-controlled>',
        '<meta name="twitter:title" content="' . addslashes($language->pages->stay_updated->meta_title) . ' Success" data-vue-controlled>',
        '<meta name="twitter:image" content="/img/hero.665c8751.jpg" data-vue-controlled>',
        '<meta name="twitter:description" content="' . addslashes($language->pages->stay_updated->description) . ' Success" data-vue-controlled>',
        '<meta name="twitter:card" content="summary_large_image" data-vue-controlled>'
    ], $locale);
    exit;
});

$router->run();

function get_page_url()
{
    return (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ?
            "https" : "http") . "://" . $_SERVER['HTTP_HOST'] .
        $_SERVER['REQUEST_URI'];
}

function replace_meta($metaTags, $locale)
{
    $contents = file_get_contents('index.html');
    $contents = str_replace('<html lang="">', '<html lang="' . $locale . '">', $contents);
    return str_replace('<title>cepheid</title>', implode("\n", $metaTags), $contents);
}

function load_env()
{
    $dotenv = new Dotenv();
    $dotenv->load(__DIR__ . '/../.env', __DIR__ . '/../.env.local');
}

function fetch_case_studies($locale = 'en')
{
    $url = $_ENV['VUE_APP_PIMCORE_ENDPOINT'] . '?apikey=' . $_ENV['VUE_APP_PIMCORE_API_KEY'] . '&lang=' .$locale;

    $curl = curl_init();
    curl_setopt($curl, CURLOPT_URL, $url);
    curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode(['query' => get_query()]));
    curl_setopt($curl, CURLOPT_POST, 1);
    curl_setopt($curl, CURLOPT_HTTPHEADER, ['Content-Type: application/json']);

    $response = curl_exec($curl);

    return json_decode($response, true);
}

function get_query()
{
    return <<<'EOFQUERY'
query getCaseStudyListing {
    getCaseStudyListing(defaultLanguage: "en_US") {
          edges {
                node {
                id
                slug
                translate_to
                meta_title
                meta_description
                meta_image {
                    fullpath
                }
              }
          }
    }
}
EOFQUERY;
}
