<?php
// GET URL
    $id = $_GET['id'];
    $parts = explode( '/' , $id );
    $locale = 'en-US';
    $path = "";
    if ( sizeof($parts) > 1 ) {
        $path = $parts[sizeof($parts) - 1]; // page
    } else {
        // home page
    }
    if ( $parts[0] === "fr" ) {
        $locale = "fr";
    }

    $aggTags = [
        'stories & interviews' => [
            'title' => 'Stories & Interviews - Air Canada enRoute',
            'metaDescription' => 'Stories that travel. Made by Air Canada.'
        ],
        'airplane mode' => [
            'title' => 'Airplane Mode - Air Canada enRoute',
            'metaDescription' => 'Our answers to questions on aeronautics for the most curious of you.'
        ],
        'worth flying for' => [
            'title' => 'Worth Flying For - Air Canada enRoute',
            'metaDescription' => 'Stories in motion.'
        ],
        'histoires et entretiens' => [
            'title' => 'Histoires et entretiens - Air Canada enRoute',
            'metaDescription' => 'Des récits en mouvement. Signés Air Canada.'
        ],
        'mode avion' => [
            'title' => 'Mode avion - Air Canada enRoute',
            'metaDescription' => 'Nos réponses aux questions sur l\'aéronautique pour les plus curieux d\'entre-vous.'
        ],
        'ca vaut le deplacement' => [
            'title' => 'Ça vaut le déplacement - Air Canada enRoute',
            'metaDescription' => 'Des récits en mouvement.'
        ]
        ];


// API CALL
    $contentfulURL = "https://cdn.contentful.com/spaces/itrs3p223g0s/%s?access_token=xdcWdfdY78Vj0VyYCloBGqsTlE6q7Cuwe4f8edIl9T8&content_type=page&locale=$locale&".($path === '' ? 'fields.template=Homepage' : "fields.path=$path")."&include=4";
    
    function getContentfulEntry( $url ) {
        return getContentfulAPIData( sprintf( $url , "entries" ) );
    }

    function getContentfulAsset( $url ) {
        return getContentfulAPIData( sprintf( $url , "assets"  ) );
    }

    function findEntryById($entries, $id) {
        if (!isset($entries) || !is_array($entries)) {
            return null;
        }
        foreach($entries as $e) {
            if (isset($e, $e->sys, $e->sys->id) && $e->sys->id == $id) {
                return $e;
            }
        }
        return null;
    }

    function getContentfulAPIData( $url ) {
        $file = '.cache/'.md5($url);
        $delay = 60 * 60 * 24; // 24h
        if (!file_exists($file) || (filemtime($file) + $delay) > time() || true) {
            @mkdir('.cache');
            touch($file);
            // create curl resource 
            $ch = curl_init(); 
            // set url 
            curl_setopt($ch, CURLOPT_URL, $url); 

            //return the transfer as a string 
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
            
            //curl_setopt($ch, CURLOPT_HEADER, true);

            // $output contains the output string 
            $output = curl_exec($ch); 

            if(curl_errno($ch)){
                echo 'Curl error: ' . curl_error($ch);
            }

            // close curl resource to free up system resources 
            curl_close($ch);     
            file_put_contents($file, $output);
            $output_json = json_decode( $output );
        } else {
            $output_json = json_decode(file_get_contents($file), true);
        }
        return( $output_json );
    }
    if (isset($_GET['aggTag'], $aggTags[strtolower($_GET['aggTag'])])) {
        $data = $aggTags[strtolower($_GET['aggTag'])];
        $data['pageUrl'] = "https://{$_SERVER['HTTP_HOST']}/" . $id;
        $data['metaKeywords'] = [];
    } else {
        $result = getContentfulEntry( $contentfulURL );
        $data = [];
        $data['pageUrl'] = "https://{$_SERVER['HTTP_HOST']}/" . $id;
        $data['socialImage_Url'] = '';
        $data['metaDescription'] = '';
        $data['socialDescription'] = '';
        $data['metaKeywords'] = [];

        if ( $result->total > 0 ) {
            $data['title'] = $result->items[0]->fields->title;
            $data['socialDescription'] = empty($result->items[0]->fields->socialDescription) ? '' : $result->items[0]->fields->socialDescription;
            $data['metaDescription'] = empty($result->items[0]->fields->metaDescription) ? '' : $result->items[0]->fields->metaDescription;
            $data['socialDescription'] = empty($data['socialDescription']) ? $data['metaDescription'] : $data['socialDescription'];
            if ( array_key_exists( "socialImage" , $result->items[0]->fields ) ) {
                $socialImage = $result->items[0]->fields->socialImage->sys->id;
                if ( array_key_exists( "Asset" , $result->includes ) ) {
                    foreach( $result->includes->Asset  as $asset ) {
                        if ( $asset->sys->id === $socialImage ) {
                            $data['socialImage_Url'] = $asset->fields->file->url;
                        }
                    }
                }
            }
            if (isset($result->includes, $result->includes->Entry, $result->items, $result->items[0], $result->items[0]->fields, $result->items[0]->fields->sections[0], $result->items[0]->fields->sections[0]->sys, $result->items[0]->fields->sections[0]->sys->id)) {
                $entry = findEntryById($result->includes->Entry, $result->items[0]->fields->sections[0]->sys->id);
                if (isset($entry, $entry->fields, $entry->fields->type, $entry->fields->subSections, $entry->fields->subSections[0], $entry->fields->subSections[0]->sys, $entry->fields->subSections[0]->sys->id) && $entry->fields->type == 'homepage-feature-single-story') {
                    $page = findEntryById($result->includes->Entry, $entry->fields->subSections[0]->sys->id);
                    if (isset($page, $page->fields, $page->fields->content, $page->fields->content, $page->fields->content->content, $page->fields->content->content[0], $page->fields->content->content[0]->data, $page->fields->content->content[0]->data->target, $page->fields->content->content[0]->data->target->sys, $page->fields->content->content[0]->data->target->sys->id)) {
                        $articleTop = findEntryById($result->includes->Entry, $page->fields->content->content[0]->data->target->sys->id);
                        if (isset($articleTop, $articleTop->fields, $articleTop->fields->image, $articleTop->fields->image->sys, $articleTop->fields->image->sys->id)) {
                            $asset = findEntryById($result->includes->Asset, $articleTop->fields->image->sys->id);
                            if (isset($asset, $asset->fields, $asset->fields->file, $asset->fields->file->url)) {
                                $data['socialImage_Url'] = $asset->fields->file->url;
                            }
                        }
                    }
                }
            }
            /* Try to find matching article */
            if ( $data['socialImage_Url'] === '' && isset($result->includes, $result->includes->Entry, $result->includes->Asset) ) {
                foreach($result->includes->Entry as $entry) {
                    if (
                        (isset($entry, $entry->fields, $entry->fields->path, $entry->fields->banner, $entry->fields->banner->sys, $entry->fields->banner->sys->id) && $entry->fields->path === $path) || 
                        (isset($result->items, $result->items[0], $result->items[0]->fields, $result->items[0]->fields->sections, $result->items[0]->fields->sections[0], $result->items[0]->fields->sections[0]->sys, $result->items[0]->fields->sections[0]->sys->id, $entry, $entry->sys, $entry->sys->id) && $result->items[0]->fields->sections[0]->sys->id == $entry->sys->id) ||
                        (isset($result->items, $result->items[0], $result->items[0]->fields, $result->items[0]->fields->content, $result->items[0]->fields->content->content, $result->items[0]->fields->content->content[0], $result->items[0]->fields->content->content[0]->data, $result->items[0]->fields->content->content[0]->data->target, $result->items[0]->fields->content->content[0]->data->target->sys,$result->items[0]->fields->content->content[0]->data->target->sys->id, $entry, $entry->sys, $entry->sys->id) && $result->items[0]->fields->content->content[0]->data->target->sys->id == $entry->sys->id)
                        ) {
                        foreach($result->includes->Asset as $asset) {
                            if (@isset($asset, $asset->sys, $asset->sys->id, $asset->fields, $asset->fields->file, $asset->fields->file->url) && $asset->sys->id === $entry->fields->banner->sys->id) {
                                $data['socialImage_Url'] = $asset->fields->file->url;
                                break;
                            }
                            if (@isset($asset, $asset->sys, $asset->sys->id, $asset->fields, $asset->fields->file, $asset->fields->file->url, $entry->fields, $entry->fields->image, $entry->fields->image->sys, $entry->fields->image->sys->id) && $asset->sys->id === $entry->fields->image->sys->id) {
                                $data['socialImage_Url'] = $asset->fields->file->url;
                                break;
                            }
                        }
                        break;
                    }
                }
            }

            if ( $data['socialImage_Url'] === '' ) {
                $autoimage = [];
                $autoimage["Entry"] = $result->includes->Entry;
                $autoimage["Asset"] = $result->includes->Asset;
                $imageID = "";
                $imageURL = "";
                foreach ($autoimage["Entry"] as $entry) {
                    if($entry->sys->contentType->sys->id === "article"){
                        if(property_exists($entry->fields, 'banner')){
                            $imageID = $entry->fields->banner->sys->id;
                        }
                    }
                }
                if($imageID == ""){
                    $imageURL = $autoimage["Asset"][0]->fields->file->url;
                }else{
                    foreach ($autoimage["Asset"] as $asset) {
                        if($asset->sys->id === $imageID){
                            $imageURL = $asset->fields->file->url;
                        }
                    }
                }
                if($imageURL == ""){
                    $imageURL = "//{$_SERVER['HTTP_HOST']}/files/images/default-social.png";
                }
                $data['socialImage_Url'] = $imageURL;
            }
            if (isset($result, $result->includes, $result->includes->Entry)) {
                foreach($result->includes->Entry as $entry) {
                    if (isset($entry, $entry->fields, $entry->fields->tags) && is_array($entry->fields->tags)) {
                        $data['metaKeywords'] = $entry->fields->tags;
                        break;
                    }
                }
            }
        }
    }


// FORMAT OUTPUT
    return makePage($data); 

    function makePage($data) {
        // 1. get the page
        $pageUrl = $data['pageUrl'];
        // 2. generate the HTML with open graph tags
        $html = '';
        $html .= '<meta property="og:title" content="'.(empty($data['title']) ? '' : $data['title']).'"/>'.PHP_EOL;
        $html .= '<meta property="og:description" content="'.preg_replace('#\_{2}(.*?)\_{2}#', '*$1*', preg_replace('#\*{1}(.*?)\*{1}#', '_$1_', htmlspecialchars(empty($data['socialDescription']) ? '' : $data['socialDescription']))).'"/>'.PHP_EOL;
        $html .= '<meta property="og:image" content="https:'.(empty($data['socialImage_Url']) ? '' : $data['socialImage_Url']).'"/>'.PHP_EOL;
        $html .= '<meta property="og:url" content="'.$pageUrl.'"/>'.PHP_EOL;
        $html .= '<meta property="og:type" content="website"/>'.PHP_EOL;
        $html .= '<meta name="description" content="'.$data['metaDescription'].'">'.PHP_EOL;
        $html .= '<meta name="keywords" content="'.implode(', ', empty($data['metaKeywords']) ? [] : $data['metaKeywords']).'">'.PHP_EOL;
        $html .= '<script>window.digitalDataAC=window.digitalDataAC||{};
        digitalDataAC.pageInfo={
        keywords: '.json_encode(implode(',', empty($data['metaKeywords']) ? [] : $data['metaKeywords'])).'
        }</script>';
        // $html .= '<body>'.$data['title'].'<p><a href="test.php">Test Link</a></p><p><a href="'.$pageUrl.'">Actual URL - '.$pageUrl.'</a></p></body>'.PHP_EOL;
        // 3. return the page
        if (empty($data['socialDescription']) && empty($data['socialDescription'])) {
            header('HTTP/1.1 404 Not Found');
        }
        $page = file_get_contents('index.html');
        if (strpos($_SERVER['REQUEST_URI'], '/fr') === 0) {
            $page = str_replace('<html lang="en">', '<html lang="fr">', $page);
        }
        echo str_replace('<head>', '<head>'.$html, $page);
    }