<?php namespace App\Libs\Composers;

use App\Models\CaseStudy;
use Illuminate\Support\Collection as BaseCollection;
use App\Models\Sector;
use Illuminate\Support\Facades\Validator;

class CaseStudiesDetailComposer
{
    use SidebarComposerTrait, RelatedComposerTrait, ObjectDetailTrait;

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

        $caseStudy = CaseStudy::full()
            ->withBlocks()
            ->with(array('downloads' => function($query) {
                $query->full();
            }, 'sectors', 'slides' => function ($query) {
                    $query->orderBy('case_studies_slides.position', 'asc');
                }, 'overviewImage', 'clientImage', 'contentSnippet' => function ($query) {
                    $query->full()->with('image');
                },
                'codeEmbeds'
            ))
            ->orderBy('website_objects.position', 'asc')
            ->where("lang_slug", $slug)->first();

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

        // Filter Navigation
        $query = CaseStudy::full()
            ->select("id", "title", "lang_uri as uri", "lang_slug as slug")
            ->where("status", "published")
            ->orderBy("title");


        $validator = Validator::make(
            request()->all(),
            array(
                'filter.sector' => 'regex:/^(\d+(,\d+)*)?$/'
            )
        );

        $filtersInput = null;

        if (!$validator->fails()) {
            $filtersInput = request()->get("filter");
        }

        $filters = new BaseCollection();
        $filterHash = "";

        if (!empty($filtersInput)) {
            if (!empty($filtersInput["sector"])) {
                $filterIds = explode(",", $filtersInput["sector"]);
                $filterData = Sector::full()
                    ->select("id", "title")->whereIn("id", $filterIds)->get();

                $filters = $filters->merge($filterData);
                $query->filterBySectors($filterIds);
            }

            $filterHash = getFilterHash($filtersInput);
        }


        $cases = $query->get();

        $casePosition = false;
        $nextCase = false;
        $previousCase = false;
        $casesCount = 0;


        if (!$cases->isEmpty()) {
            $casesCount = $cases->count();
            $caseIds = $cases->modelKeys();
            $casePosition = array_search($caseStudy->id, $caseIds);

            if ($casePosition !== false) {
                if ($casePosition > 0) {
                    $previousCase = $cases->get($casePosition - 1);
                }

                if ($casePosition < $cases->count() - 1) {
                    $nextCase = $cases->get($casePosition + 1);
                }
            }
        }

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

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

        $view->with(array(
            'caseStudy' => $caseStudy,
            'casePosition' => $casePosition,
            'nextCase' => $nextCase,
            'previousCase' => $previousCase,
            'casesCount' => $casesCount,
            'filters' => $filters,
            'filterHash' => $filterHash,
            'metaData' => $metaData
        ));
    }
}
