<?php namespace App\Libs\Composers\CF;

use Project;
use App;
use Input;
use Validator;
use Technology;
use Standard;
use Cobenefit;
use stdClass;
use Illuminate\Database\Eloquent\Collection as EloquentCollection;
use Illuminate\Support\Collection as BaseCollection;
use App\Libs\Composers\SidebarComposerTrait;
use App\Libs\Composers\RelatedComposerTrait;

class CfProjectsDetailComposer
{
    use SidebarComposerTrait,
        \App\Libs\Composers\CF\CfRelatedComposerTrait;

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

        $slug = last($parameters);

        $project = Project::full()->where("website_objects.slug", $slug)
            //    ->where("status", "published")
            ->with(array(
                "slides" => function ($query) {
                    $query->orderBy("project_slides.position", "asc");
                },
                "cobenefits" => function ($query) {
                    $query->full()->select("id", "title", "mesure", "project_id", "cobenefit_id")
                        ->orderBy("website_objects.position")
                        ->take(3)
                        ->with(array(
                            "cobenefit" => function ($query) {
                                $query->full()
                                    ->select("id", "uri", "title", "slug", "icon_light_id", 'icon_dark_id',
                                        'icon_cf_id')
                                    ->with(array("iconLight", "iconCf"));
                            }
                        ));
                },
                "technologies" => function ($query) {
                    $query->full()
                        ->select("id", "slug", "uri", "title", "icon_light_id")
                        ->with('iconLight')
                        ->orderBy('project_technologies.position');
                },
                "standards" => function ($query) {
                    $query->full()->select("id", "slug", "uri", "title", 'logo_image_id')
                        ->with('logoImage')
                        ->orderBy('project_standards.position');
                }
            ))
            ->first();

        if (!$project) {
            abort(404);
        }

        if ($project->status != 'published') {
            $user = \Auth::guard('admin')->user();
            if (!$user) {
                abort(404);
            }
        }

        $query = Project::full()
            ->select("id", "title", "uri", "slug")
            ->where("status", "published");

        $validator = Validator::make(
            Input::all(),
            array(
                'filter.cobenefit' => 'regex:/^(\d+(,\d+)*)?$/',
                'filter.technology' => 'regex:/^(\d+(,\d+)*)?$/',
                'filter.standard' => 'regex:/^(\d+(,\d+)*)?$/',
                'filter.location' => array('regex:/^((africa|asia|europe|north_america|south_america|oceania)(,africa|asia|europe|north_america|south_america|oceania)*)?$/'),
                'letter' => 'in:a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z',
                'viewType' => 'in:list,map',
                'australian_projects' => 'in:0,1',
                'global_projects' => 'in:0,1',
                'goldpower_projects' => 'in:0,1'
            )
        );

        $filtersInput = null;
        $viewType = null;
        $letter = null;
        $queryVars = '?';

        if (!$validator->fails()) {
            $filtersInput = Input::get("filter");
            $viewType = Input::get("viewType");
            $letter = Input::get("letter");
            $australianProjects = Input::get("australian_projects", false);
            $globalProjects = Input::get("global_projects", false);
            $goldpowerProjects = Input::get("goldpower_projects", false);
        }

        if (!$australianProjects && !$globalProjects && !$goldpowerProjects) {
            $cfType = 'all';
        } else {
            $cfType = array();
            if ($australianProjects) {
                $cfType[] = 'au';
                $queryVars .= '&australian_projects=1';
            }
            if ($globalProjects) {
                $cfType[] = 'carbon';
                $queryVars .= '&global_projects=1';
            }
            if ($goldpowerProjects) {
                $cfType[] = 'gold';
                $queryVars .= '&goldpower_projects=1';
            }
        }

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

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

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

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

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

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

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

            if (!empty($filtersInput["location"])) {
                $filterIds = explode(",", $filtersInput["location"]);
                $filterData = array();
                foreach ($filterIds as $location) {
                    $locationObject = new stdClass();
                    $locationObject->title = translation("frontend.".$location);
                    $locationObject->id = $location;
                    $filterData[] = $locationObject;
                }

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

            $filterHash = getFilterHash($filtersInput);
        }

        if ($cfType != "all") {
            $query->filterByCfType($cfType);
        }

        if (!empty($letter)) {
            $query->filterByLetter($letter);
            if (empty($filterHash)) {
                $filterHash .= "#";
            } else {
                $filterHash .= "&";
            }
            $filterHash .= "letter=".$letter;
        }

        if (!empty($viewType)) {
            if (empty($filterHash)) {
                $filterHash .= "#";
            } else {
                $filterHash .= "&";
            }

            $filterHash .= "viewType=".$viewType;
        }

        $queryNext = clone $query;
        $queryPrev = clone $query;
        $queryPos = clone $query;

        $query->orderBy("title");

        $count = $query->count();

        $position = $queryPos
            ->where("title", "<", $project->title)
            ->orderBy('title', 'desc')
            ->count();
        $next = $queryNext
            ->where("title", ">", $project->title)
            ->orderBy('title', 'asc')
            ->take(1)
            ->first();
        $previous = $queryPrev
            ->where("title", "<", $project->title)
            ->orderBy('title', 'desc')
            ->take(1)
            ->first();

        $navigator = array(
            'total' => $count,
            'position' => ($position + 1),
            'next' => $next,
            'previous' => $previous
        );

        $this->composeObjectSidebar($view, $project, 'cfSidebarWidgets');
        $this->composeRelated($view, $project);

        /** Emulates standard CF slides **/
        $slides = new BaseCollection();
        foreach ($project->slides as $slideMedia) {
            $slide = new stdClass();
            $slide->title = $project->title;
            $slide->type = "basic";
            if ($slides->count() == 0) {
                $slide->content = "<h2>".\Lang::get('frontend.projects')."</h2>";
                $slide->content .= "<h1>".$project->title."</h1>";
            } else {
                $slide->content = "";
            }
            $slide->link = null;
            $slide->image = $slideMedia;

            $slides->push($slide);
        }

        $metaData = new \stdClass();
        if (!empty($project->meta_title)) {
            $metaData->meta_title = $project->meta_title;
        } else {
            $metaData->meta_title = cut_string(strip_tags($project->title), 100);
        }
        if (!empty($project->meta_description)) {
            $metaData->meta_description = $project->meta_description;
        } else {
            $metaData->meta_description = cut_string(strip_tags($project->objective), 200);
        }

        if ($project->cf_no_index) {
            $metaData->no_index = true;
        }
        $metaData->meta_keywords = $project->meta_keywords;
        if ($project->overviewImage) {
            $metaData->metaImage = getMediaUrl($project->overviewImage->filename, '340x300');
        }

        $codeEmbeds = $project->related('codeEmbeds');

        $view->with(array(
            'project' => $project,
            'navigator' => $navigator,
            'filters' => $filters,
            'filterHash' => $filterHash,
            'slides' => $slides,
            'metaData' => $metaData,
            'queryVars' => $queryVars,
            'objectEmbeds' => $codeEmbeds
        ));
    }
}
