<?php namespace App\Libs\Composers;

use App\Models\Solution;

class SolutionsDetailComposer
{
    use SidebarComposerTrait, RelatedComposerTrait, ObjectDetailTrait;

    public function compose($view)
    {
        $data = $view->getData();
        $parameters = $data['parameters'];
        $solutionSlug = last($parameters);

        $solution = Solution::full()
            ->withBlocks()
            ->with(array(
                'sectors', 'slides' => function ($query) {
                    $query->orderBy('solution_slides.position', 'asc');
                }, 'overviewImage', 'solutions' => function ($query) {
                    $query->full()->select("id", "title", "tagline", "lang_uri as uri", "lang_slug as slug",
                        "website_objects.website_object_id", "overview_image_id",
                        "fact_sheet_id")->orderBy('solution_solution.position');
                }, 'contentSnippets' => function ($query) {
                    $query->with('image')
                        ->orderBy('solution_content_snippet.position', 'asc');
                }, 'factSheet' => function ($query) {
                    $query->full();
                }, 'codeEmbeds'
            ))
            ->orderBy('website_objects.position', 'asc')
            ->where("lang_slug", $solutionSlug)->first();

        $this->checkIsPublished($solution, $data['isPreview']);

        $parentSolution = null;
        // Filter Navigation
        $query = Solution::full()
            ->select("id", "title", "lang_uri as uri", "lang_slug as slug")
            ->where("status", "published")
            ->orderBy("title");
        if ($solution->type == 'top_level') {
            $query->where('type', $solution->type);
        } else {
            $parentSolution = $solution->topLevelSolutions()->full()
                ->select("id", "title", "tagline", "lang_uri as uri", "lang_slug as slug",
                    "website_objects.website_object_id", "overview_image_id", "fact_sheet_id")
                ->first();
            if ($parentSolution) {
                $query = $parentSolution->solutions()->full()
                    ->select("id", "title", "tagline", "lang_uri as uri", "lang_slug as slug",
                        "website_objects.website_object_id", "overview_image_id", "fact_sheet_id")
                    ->where("status", "published")
                    ->orderBy("solution_solution.position");
            } else {
                $query->where('type', '!=', 'top_level');
            }
        }

        $solutions = $query->get();

        $solutionPosition = false;
        $nextSolution = false;
        $previousSolution = false;
        $solutionsCount = 0;

        if (!$solutions->isEmpty()) {
            $solutionsCount = $solutions->count();
            $solutionIds = $solutions->modelKeys();
            $solutionPosition = array_search($solution->id, $solutionIds);

            if ($solutionPosition !== false) {
                if ($solutionPosition > 0) {
                    $previousSolution = $solutions->get($solutionPosition - 1);
                }

                if ($solutionPosition < $solutions->count() - 1) {
                    $nextSolution = $solutions->get($solutionPosition + 1);
                }
            }
        }

        $this->composeObjectSidebar($view, $solution);
        $this->composeRelated($view, $solution);

        $metaData = new \stdClass();
        if (!empty($solution->meta_title)) {
            $metaData->meta_title = $solution->meta_title;
        } else {
            $metaData->meta_title = cut_string(strip_tags($solution->title), 100);
        }
        if (!empty($solution->meta_description)) {
            $metaData->meta_description = $solution->meta_description;
        } else {
            $metaData->meta_description = cut_string(strip_tags($solution->objective), 200);
        }
        if ($solution->overviewImage) {
            $metaData->metaImage = getMediaUrl($solution->overviewImage->filename, '400x400');
        }
        $metaData->meta_keywords = $solution->meta_keywords;

        $stickyCta = null;
        if ($solution->stickyCta) {
            $stickyCta = $solution->stickyCta;
        }

        $view->with(array(
            'solution' => $solution,
            'solutionPosition' => $solutionPosition,
            'nextSolution' => $nextSolution,
            'previousSolution' => $previousSolution,
            'solutionsCount' => $solutionsCount,
            'metaData' => $metaData,
            'parentSolution' => $parentSolution,
            'stickyCta' => $stickyCta
        ));
    }
}
