<?php

namespace App\Http\Controllers\Frontend;

use App\Facades\Services\BackofficeService;
use App\Http\Controllers\Controller;
use App\Libs\Exception\InvalidConfigurationException;
use App\Models\GenericBackoffice\WebsiteObject;
use Illuminate\Support\Facades\DB;

class GenericController extends Controller
{
    public function getIndex($uriPath = '')
    {
        $uri = '/' . $uriPath;
        $lang = getActiveLanguage();

        $websiteObject = WebsiteObject::whereRaw("? like concat(lang_uri, '/%')", array($uri . '/'))
            ->whereNotNull('template')
            ->join('website_objects_lang', 'website_objects_lang.website_object_id', '=', 'website_objects.website_object_id')
            ->where('website_objects_lang.wo_language_id', $lang)
            ->orderByRaw("(length( lang_uri ) - length( replace(lang_uri, '/', ''))) desc")
            ->orderByRaw("length(lang_uri) desc")
            ->first();

        if (!$websiteObject) {
            abort(404, trans("response.not_found"));
        }

        if ($websiteObject->status != 'published') {
            $user = BackofficeService::getLoggedUser();
            if (!$user) {
                abort(404, trans("response.not_found"));
            }
        }

        //Gets alternative language uris
        $langUris = [];
        $langs = getAvailableLanguages();
        if (sizeof($langs) > 1) {
            $langWOs = DB::table('website_objects_lang AS wo1')
                ->select(array('wo1.wo_language_id', 'wo1.lang_uri'))
                ->join('website_objects_lang AS wo2', 'wo1.website_object_id', '=', 'wo2.website_object_id')
                ->join('website_objects AS wo', 'wo.website_object_id', '=', 'wo2.website_object_id')
                ->where('wo2.lang_uri', $uri)
                ->get();

            foreach ($langWOs as $langWO) {
                $langUris[$langWO->wo_language_id] = $langWO->lang_uri;
            }
        }

        $object = $websiteObject->objectable;
        $contentType = $websiteObject->content_type;
        $templateId = $websiteObject->template;

        $template = config('backoffice.generic.' . $contentType . '.templates.' . $templateId);

        if (!$template) {
            throw new InvalidConfigurationException("You must provide a configuration");
        }

        $allowedParameters = 0;
        if (isset($template['parameters'])) {
            $allowedParameters = $template['parameters'];
        }
        $inputParameters = sizeof(explode('/', $uri)) - sizeof(explode('/', $websiteObject->uri));

        if ($allowedParameters < $inputParameters) {
            abort(404, trans("response.not_found"));
        }

        if ($inputParameters > 0 && isset($template['detailView'])) {
            $view = $template['detailView'];
        } else {
            $view = $template['view'];
        }

        return view($view)
            ->with(array(
                'object'     => $object,
                'parameters' => explode('/', $uriPath),
                'websiteObject' => $websiteObject,
                'langUris' => $langUris
            ));
    }
}
