<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Cache;
use App\Seo;
use App\Article;
use Illuminate\Http\Request;
use Illuminate\Support\Arr;

class SeoController extends Controller
{
    public function index(Request $request)
    {
        $params = $request->all();
        $uri = Arr::get($params, 'uri', '/');
        $uri = urldecode($uri);
        $uri = $uri . "||";
        $uri = str_replace("//", "/", "/" . $uri);
        $uri = str_replace("/?", "?", $uri);
        $uri = str_replace("?&", "?", $uri);
        $uri = str_replace("&&", "&", $uri);
        $uri = str_replace("/||", "", $uri);
        $uri = str_replace("||", "", $uri);
        $uri = preg_replace('/(?:&|(\?))page=[^&]*(?(1)&|)?/i', "$1", $uri);
        if ($uri == null || $uri == "") $uri = "/";

        $cacheName = 'seo_index_' . str_replace("/", "_", $uri);
        $cacheName = str_replace("__", "_", trim($cacheName));
        $cacheName = strip_tags($cacheName);

        $result = Cache::remember($cacheName, (7*24*60*60), function () use ($uri) {
            $seoMeta = Seo::select('title', 'keywords', 'description', 'image')->where('uri', $uri)->first();
            if (!$seoMeta && strpos($uri, "/column/detail/") !== false) {
                $idPostArr = str_replace("/column/detail/", "", $uri);
                $idPostArr = explode("/", $idPostArr);
                $idPost = $idPostArr[0];
                $seoMeta = Seo::select('title', 'keywords', 'description', 'image')
                    ->where('uri', 'like', "/column/detail/" . $idPost . "/%")
                    ->first();
            } else if (!$seoMeta && strpos($uri, "/bbs/detail/") !== false) {
                $idPostArr = str_replace("/bbs/detail/", "", $uri);
                $idPostArr = explode("/", $idPostArr);
                $idPost = $idPostArr[0];
                $seoMeta = Seo::select('title', 'keywords', 'description', 'image')
                    ->where('uri', 'like', "/bbs/detail/" . $idPost . "/%")
                    ->first();
            } else if (!$seoMeta && preg_match('#^/news/(\d+)$#', $uri, $matches)) {
                $idPost = $matches[1];
                $seoMeta = Seo::select('title', 'keywords', 'description', 'image')
                    ->where('uri', 'like', "/news/detail/" . $idPost . "/%")
                    ->first();
                if (!$seoMeta) {
                    $article = Article::select('title', 'thumbnail')->where('id', $idPost)->first();
                    if ($article) {
                        $seoMeta = new Seo([
                            'title' => $article->title . " | お知らせ | " . config('settings.site_name'),
                            'image' => $article->thumbnail,
                        ]);
                    }
                }
            } else if (!$seoMeta && preg_match('#^/column/(\d+)$#', $uri, $matches)) {
                $idPost = $matches[1];
                $article = Article::select('title', 'thumbnail')->where('id', $idPost)->first();
                if ($article) {
                    $seoMeta = new Seo([
                        'title' => $article->title . " | コラム | " . config('settings.site_name'),
                        'image' => $article->thumbnail,
                    ]);
                }
            }

            $data = ['title' => config('settings.site_name'), 'keywords' => '', 'description' => '', 'image' => url('favicon-16x16.png')];
            if(isset($seoMeta) && $seoMeta->title != null) {
                $data['title'] = ($seoMeta->title != null) ? $seoMeta->title : "";
                $data['keywords'] = ($seoMeta->keywords != null) ? $seoMeta->keywords : "";
                $data['description'] = ($seoMeta->description != null) ? $seoMeta->description : "";
                $imgSeo = ($seoMeta->image != "" && $seoMeta->image != null) ? $seoMeta->image : 'favicon-16x16.png';
                $data['image'] = url("files/" . $imgSeo);
            }

            return ['items' => $data, 'lastModify' => (gmdate('D, d M Y H:i:s') . ' GMT')];
        });

        return response()->json(['data' => $result['items']], 200)->header('Last-Modified', $result['lastModify']);
    }
}
