<?php

namespace App\Http\Controllers\Frontend;

use App\Http\Controllers\Controller;
use App\Libs\Facades\Localization;
use App\Libs\Support\Sanitizer\Sanitizer;
use App\Mail\AssessmentReceived;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Storage;
use Illuminate\Support\Facades\Validator;
use ReCaptcha\ReCaptcha;
use App\Http\Resources\Project as ProjectResource;
use App\Models\Assessment;
use App\Models\BlogPost;
use App\Models\CaseStudy;
use App\Models\Clipping;
use App\Models\EventItem;
use App\Models\News;
use App\Models\Office;
use App\Models\PressRelease;
use App\Models\Project;
use App\Models\Publication;
use App\Models\Sector;
use App\Models\Solution;
use App\Models\VisitorDownload;

class AjaxController extends Controller
{
    public function postBlogPosts()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'page' => 'required|integer|min:1',
                'rows' => 'required|integer|between:1,20',
                'categories' => 'nullable|array',
                'search' => 'nullable|string|max:100'
            )
        );

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }
        $rows = request()->input('rows');
        $page = request()->input('page');
        $cats = request()->input('categories');

        $sanitizer = new Sanitizer(['search' => request()->input('search')], ['search' => 'strip_tags|xss_clean|trim']);
        $sanitizedData = $sanitizer->sanitize();
        $searchString = $sanitizedData['search'];

        // $featuredPostQuery = BlogPost::full()
        //     ->with(['media', 'authors'])
        //     ->where('status', 'published')
        //     ->where('lang_status', 'published')
        //     ->where('is_feature_post', '1')
        //     ->inCategories($cats)
        //     ->search($searchString);

        // $featuredPost = $featuredPostQuery->orderBy('date', 'desc')
        //     ->first();

        // if ($page == 1 && $featuredPost) {
        //     $rows = $rows - 2;
        // }

        $postsQuery = BlogPost::full()
            ->with(['media', 'authors'])
            ->where('status', 'published')
            ->where('lang_status', 'published')
            // ->where('blog_posts.id', '!=', $featuredPost ? $featuredPost->id : 0)
            ->inCategories($cats)
            ->search($searchString);

        if (!$searchString) {
            $postsQuery->orderBy('date', 'desc');
        }

        // $offset = $page === 1 ? 0 : ($page - 1) * $rows - ($featuredPost ? 2 : 0);
        $offset = $page === 1 ? 0 : ($page - 1) * $rows;

        $count = $postsQuery->count();

        $posts = $postsQuery->offset($offset)
            ->limit($rows)
            ->get();

        return view('frontend/templates/components/blog_list', array(
            'posts' => $posts,
            'page' => $page,
            'total' => $count,
        ));
    }

    public function postCaseStudies()
    {

        $validator = Validator::make(
            request()->all(),
            array(
                'page' => 'required|integer|min:1',
                'rows' => 'required|integer|between:1,50',
                'type' => 'nullable|in:corporate,public',
                'sector' => 'nullable|integer'
            )
        );

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $query = CaseStudy::full()->with(array(
            "overviewImage",
            "sectors" => function ($query) {
                $query->full()->select("id", "title", "sector_type");
            },
            "downloads" => function ($query) {
                $query->full()->orderBy("case_study_publication.position", "asc")
                    ->select("id")
                    ->with(array(
                        "document" => function ($query) {
                            $query->wherePivot("language_id", Localization::getActiveLocale());
                        }
                    ));
            }
        ))
            ->select("id", "title", "tagline", "overview_image_id", "summary", "lang_uri as uri", "lang_slug as slug")
            ->where("status", "published")
            ->where("lang_status", "published")
            ->orderBy("position");

        $sectorId = request()->input("sector");
        $sectorType = request()->input("type");

        if (!empty($sectorId) && $sectorId) {
            $query->whereHas("sectors", function ($q) use ($sectorId) {
                $q->where("id", "=", $sectorId);
            });
        } elseif (!empty($sectorType)) {
            $query->whereHas("sectors", function ($q) use ($sectorType) {
                $q->where("sector_type", "=", $sectorType);
            });
        }

        $caseStudies = $query->get();
        $sector = null;
        if (!empty($sectorId)) {
            $sector = Sector::full()->where("id", $sectorId)
                ->select("id", "title", "tagline", "lang_uri", "lang_slug")
                ->first();
        }

        return view('frontend/templates/components/case_studies_list',
            array("caseStudies" => $caseStudies, "sector" => $sector));
    }

    public function postProjects()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'page' => 'required|integer|min:1',
                'rows' => 'required|integer|between:1,200',
                'search' => 'nullable|alpha_num_space',
                // 'mapBounds' => 'regex:/^-?[0-9]\d*(\.\d+)?,-?[0-9]\d*(\.\d+)?,-?[0-9]\d*(\.\d+)?,-?[0-9]\d*(\.\d+)?$/',
                'topic' => 'nullable|array',
                'topic.*' => 'nullable|integer',
                'cobenefit' => 'nullable|array',
                'cobenefit.*' => 'integer',
                'technology' => 'nullable|array',
                'technology.*' => 'integer',
                'standard' => 'nullable|array',
                'standard.*' => 'integer',
                'location' => 'nullable|array',
                'location.*' => 'in:africa,asia,europe,north_america,south_america,oceania',
                'country' => 'nullable|array',
                'country.*' => 'integer',
                'cf_type' => 'nullable|array',
                'cf_type.*' => 'in:au,carbon,gold',
                'isMobile' => 'boolean',
            )
        );

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }
        //Log::info('AJAX projects - Validation successful');
        $topics = request()->input("topic");
        $cobenefits = request()->input("cobenefit");
        $technologies = request()->input("technology");
        $countries = request()->input("country");
        $standards = request()->input("standard");
        $locations = request()->input("location");
        $page = request()->input("page");
        $rows = request()->input("rows");
        // $mapBounds = request()->input("mapBounds");
        $searchString = request()->input("search");
        $isMobile = request()->input("isMobile");

        $query = Project::full()->with(array(
            "overviewImage",
            /*
            "technologies" => function ($query) {
                $query->full()->select("id", "lang_slug as slug", "lang_uri as uri", "title", "icon_light_id",
                    "icon_id", "icon_cf_id")
                    ->with("iconLight", "icon", "iconCf")
                    ->orderBy('project_technologies.position');
            },
            "standards" => function ($query) {
                $query->full()
                    ->select("id", "lang_slug as slug", "lang_uri as uri", "title", "logo_image_id")
                    ->with('logoImage')
                    ->orderBy('project_standards.position');
            },
            */
            "country" => function ($query) {
                $query->full()->select("id", "title");
            },
            /*
            "cobenefits" => function ($query) {
                $query->full()->select("id", "project_id", "cobenefit_id")
                    ->orderBy("website_objects.position")
                    ->with(array(
                        "cobenefit" => function ($query) {
                            $query->full()
                                ->select("id", "lang_uri as uri", "title", "lang_slug as slug", "icon_dark_id",
                                    "icon_cf_id")
                                ->with("iconDark", "iconCf");
                        }
                    ));
            }
            */
        ))->select("id", "projects_lang.title", "lang_uri as uri", "lang_slug as slug", "location_lat",
            "location_lng",
            "website_objects.website_object_id", "overview_image_id",
            "projects.country_id")
        ->where("status", "published")
        ->where("lang_status", "published")
        ->where("is_hero", true);

        $query->orderBy('position');

        //Log::info('AJAX projects - Begin Model filters');
        if (!empty($topics)) {
            $query->filterByTopics($topics);
        }

        if (!empty($cobenefits)) {
            $query->filterByCobenefits($cobenefits);
        }

        if (!empty($technologies)) {
            $query->filterByTechnologies($technologies);
        }

        if (!empty($standards)) {
            $query->filterByStandards($standards);
        }

        if (!empty($locations)) {
            $query->filterByLocations($locations);
        }

        if (!empty($countries)) {
            $query->filterByCountries($countries);
        }

        if (!empty($mapBounds)) {
            $bounds = explode(",", $mapBounds);
            $query->filterByBounds($bounds);
        }

        if ($searchString) {
            $query->where(function ($query) use ($searchString) {
                $query->orWhere('projects_lang.title', 'like', '%'.$searchString.'%')
                    ->orWhere('projects_lang.content', 'like', '%'.$searchString.'%');
            });
        }

        if ($page > 1) {
            $query->skip(($page - 1) * $rows);
        }

        $projects = $query->take($rows)->get();
        $projectPages = [];
        $projectPage = '';
        $projectOne = null;
        $projectsPerPage = 8;
        $invert = false;
        $colorId = 0;
        $colorArray = ['green', 'yellow', 'blue', 'orange'];
        foreach($projects as $i => $project) {
            if ($isMobile) {
                $projectPage .= view(
                    'frontend.templates.blocks.project-slide-mobile',
                    [
                        'project' => $project,
                        'container_class' => 'project-slide-mobile--single',
                        'box_color' => 'project-slide-mobile--'.$colorArray[$colorId],
                    ]
                )->render();
                $colorId = $colorId >= 3 ? 0 : $colorId + 1;
            } else {
                if ($i % 2 === 1) {
                    $invert = ($i / 2) % 2 === 0;
                    $projectPage .= view(
                        'frontend.templates.blocks.project-slide',
                        [
                            'projectOne' => $projectOne,
                            'projectTwo' => $project,
                            'invert' => $invert,
                            'container_class' => 'project-slide--single',
                            'box_color' => 'project-slide--'.$colorArray[$colorId],
                        ]
                    )->render();
                    $projectOne = null;
                    $colorId = $colorId >= 3 ? 0 : $colorId + 1;
                } else {
                    $projectOne = $project;
                }
            }
            if (($i + 1) % $projectsPerPage === 0) {
                $projectPages[] = $projectPage;
                $projectPage = '';
            }
        }
        if (!$isMobile && $projectOne !== null) {
            $projectPage .= view(
                'frontend.templates.blocks.project-slide',
                [
                    'projectOne' => $projectOne,
                    'invert' => !$invert,
                    'container_class' => 'project-slide--single'
                ]
            )->render();
        }
        if ($projectPage) {
            $projectPages[] = $projectPage;
        }

        $projects->loadRelated('sustainabilityTopics', 'position');

        return response()->json([
            'projects' => ProjectResource::collection($projects),
            'projectPages' => $projectPages
        ]);
        /*
        return view('frontend/templates/components/projects_map_list',
            array("projects" => $projects));
        */
    }

    public function postSolutions()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'page' => 'required|integer|min:1',
                'rows' => 'required|integer|between:1,50',
                'topic' => 'nullable|array',
                'topic.*' => 'integer',
                'value' => 'nullable|array',
                'sector' => 'nullable|array',
                'sector.*' => 'integer',
                'business_line' => 'nullable|array',
                'business_line.*' => 'integer',
            )
        );

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $topics = request()->input("topic");
        $values = request()->input("value");
        $sectors = request()->input("sector");
        $businessLines = request()->input("business_line");

        $query = Solution::full()->with(array(
            "overviewImage",
            "sustainability_topics" => function ($query) {
                $query->full()->select("id", "title", "color_scheme", "image_id")
                    ->orderBy("website_objects.position")
                    ->with("image");
            },
            "values" => function ($query) {
                $query->full()->select("id", "title")
                    ->orderBy("website_objects.position");
            },
            "businessLines" => function ($query) {
                $query->full()->select("id", "title")
                    ->orderBy("website_objects.position");
            },
        ))
            ->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")
            ->where("lang_status", "published")
            ->orderBy("website_objects.position", 'asc');

        if (!empty($topics)) {
            $query->filterByTopics($topics);
        }

        if (!empty($values)) {
            $query->filterByValues($values);
        }

        if (!empty($sectors)) {
            $query->filterBySectors($sectors);
        }

        if (!empty($businessLines)) {
            $query->filterByBusinessLines($businessLines);
        }

        $solutions = $query->get();
        /*
        $projects->loadRelated('sustainabilityTopics', 'position',
            array("SustainabilityTopic" => array("image")));
        */
        return view('frontend/templates/components/solutions_list',
            array("solutions" => $solutions));
    }

    public function postOffices()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'viewType' => "nullable|in:list,home",
                'continent' => 'nullable|in:europe,asia,africa,oceania,north_america,south_america',
                'officeType' => 'nullable|in:offices,headquarters'
            )
        );

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $continent = request()->input("continent");
        $viewType = request()->input("viewType", 'list');
        $officeType = request()->input("officeType");

        $query = Office::full()->with(array(
            "country", "overviewImage", 'contact' => function ($q) {
                $q->with('image');
            }
        ))->where("status", "published")
            ->where("lang_status", "published")
            ->orderBy("website_objects.position", "asc");

        if ($continent) {
            $query->filterByContinent($continent);
        }

        if ($officeType && $officeType == 'headquarters') {
            $query->where('is_headquarter', 1);
        }

        $offices = $query->get();
        $officeMarkers = array();
        foreach ($offices as $office) {
            $image = $office->overviewImage ? getMediaUrl($office->overviewImage->filename, '420x670') : '';
            $contact = null;
            if ($office->contact) {
                $contactImage = null;
                $contactEmailLink = null;
                if ($office->contact->image) {
                    $contactImage = getMediaUrl($office->contact->image->filename, '200x200');
                }
                if ($office->contact->email) {
                    $contactEmailLink = email_link_tag($office->contact->email);
                }
                $contact = array(
                    'name' => $office->contact->name,
                    'image' => $contactImage,
                    'emailLink' => $contactEmailLink
                );
            }

            $marker = array(
                'markerType' => 'office',
                'id' => $office->id,
                'title' => $office->title,
                'location_lat' => $office->location_lat,
                'location_lng' => $office->location_lng,
                'location_zoom' => $office->location_zoom,
                'country' => $office->country->title,
                'continent' => $office->country->continent,
                'is_headquarter' => $office->is_headquarter,
                'content' => $office->content,
                'detailImage' => $image,
                'contact' => $contact
            );
            $officeMarkers[] = $marker;
        }

        if ($viewType == 'list') {
            $viewName = 'frontend/templates/components/offices_list';
            if (Localization::getWebsite()->id == 2) {
                $viewName = 'frontend/cf/templates/components/offices_list';
            }
            return response()->json([
                'offices' => view($viewName, [
                    'offices' => $offices,
                ])->render(),
                'officeMarkers' => $officeMarkers,
            ]);
        } elseif ($viewType == 'home') {
            return response()->json($officeMarkers);
        }
    }

    public function postEvents()
    {
        $today = date("Y-m-d");
        $validator = Validator::make(
            request()->all(),
            array(
                'month' => 'nullable|integer|between:1,12',
                'year' => 'nullable|integer|between:2010,2100',
                'highlightedSlug' => '',
                'page' => 'nullable|integer|min:1',
                'rows' => 'nullable|integer|between:1,50',
                'blockOnly' => 'boolean',
                'archive' => 'boolean'
            )
        );

        $blockOnly = request()->input('blockOnly');
        $page = request()->input('page', 1);
        $rows = request()->input('rows', 12);

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $month = request()->input("month");
        $year = request()->input("year");
        $archive = request()->input("archive");

        $query = EventItem::full()
            ->with(array(
                'media', 'document'
                => function ($query) {
                        $activeLang = Localization::getActiveLocale();
                        $query->where('event_items_documents.language_id', '=', $activeLang);
                    }
            ))
            ->where("status", "published")
            ->where("lang_status", "published")
            ->where("no_index", false);

        if ($archive != "true") {
            $query
                ->orderBy("date", "asc")
                ->whereRaw("end_date >= '{$today}'");
        } else {
            $query->orderBy("date", "desc")
                ->whereRaw("end_date < '{$today}'");
        }

        $query->orderBy("date", "desc");

        if ($month) {
            $query->whereRaw("MONTH(date) = {$month}");
        }

        if ($year) {
            $query->whereRaw("YEAR(date) = {$year}");
        }

        /*
        if ($month && $month > 0) {
            $year = date("Y");
            if ($month < date("m")) {
                $year += 1;
            }
            if ($month < 10) {
                $month = "0".$month;
            } // needed for between to work properly
            $query = $query->whereRaw(
                "'{$year}-{$month}' BETWEEN DATE_FORMAT(date,'%Y-%m') AND DATE_FORMAT(end_date,'%Y-%m') "
            );
        }
        */

        if ($page > 1) {
            $query->skip(($page - 1) * $rows);
        }

        $events = $query->take($rows)->get();
        $isEnd = $events->count() < $rows;

        if(isset($blockOnly) && $blockOnly) {
            return view(
                'frontend/templates/components/articles_list_items_v2',
                array("items" => $events, "type" => "event")
            );
        }

        return view('frontend/templates/components/articles_grid_items',
            array("items" => $events, "type" => "event", "isEnd" => $isEnd));
    }

    public function postNews()
    {
        $isCf = Localization::getWebsite()->id == 2;
        $validator = Validator::make(
            request()->all(),
            array(
                'year' => '',
                'type' => 'nullable|in:in_media,news,all,blog,press_release',
                'page' => 'nullable|integer|min:1',
                'rows' => 'nullable|integer|between:1,50',
                'blockOnly' => 'boolean',
            )
        );

        $blockOnly = request()->input('blockOnly');
        $page = request()->input('page', 1);
        $rows = request()->input('rows', 12);

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $year = request()->input("year");
        $type = request()->input("type");

        $query = News::full()
            ->with(array(
                'media', 'document'
                => function ($query) {
                        $activeLang = Localization::getActiveLocale();
                        $query->where('news_documents.language_id', '=', $activeLang);
                    }
            ))
            ->where("status", "published")
            ->where("lang_status", "published")
            ->orderBy("date", "desc");

        if ($year && $year != 'all') {
            $query = $query->whereRaw("Year(date) =".$year);
        }
        if ($type && $type != 'all') {
            $query = $query->where("type", $type);
        } else {
            $query = $query->whereIn("type", array('news', 'in_media', 'press_release'));
        }

        if ($page > 1) {
            $query->skip(($page - 1) * $rows);
        }

        $news = $query->take($rows)->get();
        $isEnd = $news->count() < $rows;

        if(isset($blockOnly) && $blockOnly) {
            return view(
                'frontend/templates/components/articles_list_items_v2',
                array("items" => $news, "type" => "news")
            );
        }

        return view(
            'frontend/templates/components/articles_grid_items',
            array("items" => $news, "type" => "news", "isEnd" => $isEnd)
        );
    }

    public function postClippings()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'page' => 'nullable|integer|min:1',
                'rows' => 'nullable|integer|between:1,50',
            )
        );

        $page = request()->input('page', 1);
        $rows = request()->input('rows', 12);

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $query = Clipping::full()
            ->where("status", "published")
            ->where("lang_status", "published")
            ->orderBy("date", "desc");

        if ($page > 1) {
            $query->skip(($page - 1) * $rows);
        }

        $clippings = $query->take($rows)->get();

        return view(
            'frontend/templates/components/clippings-list',
            array("articles" => $clippings)
        );
    }

    public function postPublications()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'year' => 'nullable',
                'type' => 'nullable|in:white_paper,fact_sheet,other,all,quick_guide,report',
                'page' => 'nullable|integer|min:1',
                'rows' => 'nullable|integer|between:1,50',
                'blockOnly' => 'boolean',
            )
        );

        $blockOnly = request()->input('blockOnly');
        $page = request()->input('page', 1);
        $rows = request()->input('rows', 12);

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $year = request()->input("year");
        $type = request()->input("type");

        $query = Publication::full()
            ->with('media')
            ->where("status", "published")
            ->where("lang_status", "published")
            ->where("list_on_publications", 1)
            ->orderBy("date", "desc");

        if ($year && $year != 'all') {
            $query = $query->whereRaw("Year(date) =".$year);
        }
        if ($type && $type != 'all') {
            $query = $query->where("type", $type);
        }

        if ($page > 1) {
            $query->skip(($page - 1) * $rows);
        }

        $publications = $query->take($rows)->get();
        $isEnd = $publications->count() < $rows;

        foreach ($publications as $publication) {
            $publication->content = $publication->details;
            $publication->isPublication = true;
        }

        if(isset($blockOnly) && $blockOnly) {
            return view(
                'frontend/templates/components/articles_list_items_v2',
                array("items" => $publications, "type" => "publication")
            );
        }

        return view('frontend/templates/components/articles_grid_items',
            array("items" => $publications, "type" => "publication", "isEnd" => $isEnd));
    }

    public function postReleases()
    {
        $website = Localization::getWebsite();

        $validator = Validator::make(
            request()->all(),
            array(
                'year' => 'nullable',
                'page' => 'nullable|integer|min:1',
                'rows' => 'nullable|integer|between:1,50'
            )
        );

        $page = request()->input('page', 1);
        $rows = request()->input('rows', 10);

        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $year = request()->input("year");

        $query = PressRelease::full()
            ->with(array(
                'media', 'document'
                => function ($query) {
                        $activeLang = Localization::getActiveLocale();
                        $query->where('press_releases_documents.language_id', '=', $activeLang);
                    }
            ))
            ->where("status", "published")
            ->where("lang_status", "published")
            ->orderBy("date", "desc");

        if ($year && $year != 'all') {
            $query = $query->whereRaw("Year(date) =".$year);
        }

        if ($page > 1) {
            $query->skip(($page - 1) * $rows);
        }

        $releases = $query->take($rows)->get();

        return view('frontend/templates/components/articles_list_items',
            array("items" => $releases));
    }

    public function postFullSearch()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'page' => 'required|integer|min:1',
                'rows' => 'required|integer|between:1,50',
                'group' => 'nullable|in:resources,news,clients,solutions,projects'
            )
        );
        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }
        $website = Localization::getWebsite();

        $sanitizer = new Sanitizer(['search_string' => request()->input('search_string')],
            ['search_string' => 'strip_tags|xss_clean|trim']);
        $sanitizedData = $sanitizer->sanitize();
        $searchString = $sanitizedData['search_string'];

        $group = request()->input('group', false);

        $contentTypes = false;
        if ($group) {
            $contentTypes = $website->getSearchGroups($group);
        }

        $page = request()->input('page');
        $rows = request()->input('rows');
        $results = $website->search($searchString, false, $contentTypes, false, $rows, $page);

        $website = Localization::getWebsite();
        if ($website->id == 2) {
            return view('frontend/cf/templates/components/search_results',
                array("results" => $results['records']));
        } else {
            return view('frontend/templates/components/search_results',
                array("results" => $results['records']));
        }
    }

    public function postSearch()
    {
        $sanitizer = new Sanitizer(['search_string' => request()->input('search_string')],
            ['search_string' => 'strip_tags|xss_clean|trim']);
        $sanitizedData = $sanitizer->sanitize();
        $searchString = $sanitizedData['search_string'];

        if (strlen($searchString) < 3) {
            return response()->json(array());
        }

        $website = Localization::getWebsite();

        $resources = $website->search($searchString, false, array('page', 'publication', 'client'), false, 6);
        $news = $website->search($searchString, false, array('news', 'event_item', 'press_release', 'blog_post'), false,
            6);
        $clients = $website->search($searchString, false, array('case_study', 'sector'), false, 6);
        $solutions = $website->search($searchString, false, array('solution'), false, 6);
        $projects = $website->search($searchString, false, array('project'), false, 6);

        $results = array();

        if (!empty($resources)) {
            $results[] = array(
                'group' => 'resources',
                'groupLabel' => trans('frontend.resources'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.resources'),
                'items' => $resources
            );
        }
        if (!empty($news)) {
            $results[] = array(
                'group' => 'news',
                'groupLabel' => trans('frontend.news_and_events'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.news_and_events'),
                'items' => $news
            );
        }
        if (!empty($clients)) {
            $results[] = array(
                'group' => 'clients',
                'groupLabel' => trans('frontend.clients'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.clients'),
                'items' => $clients
            );
        }
        if (!empty($solutions)) {
            $results[] = array(
                'group' => 'solutions',
                'groupLabel' => trans('frontend.solutions'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.solutions'),
                'items' => $solutions
            );
        }
        if (!empty($projects)) {
            $results[] = array(
                'group' => 'projects',
                'groupLabel' => trans('frontend.projects'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.projects'),
                'items' => $projects
            );
        }

        return response()->json($results);
    }

    public function postSearchCf()
    {
        $sanitizer = new Sanitizer(['search_string' => request()->input('search_string')],
            ['search_string' => 'strip_tags|xss_clean|trim']);
        $sanitizedData = $sanitizer->sanitize();
        $searchString = $sanitizedData['search_string'];

        if (strlen($searchString) < 3) {
            return response()->json(array());
        }

        $website = Localization::getWebsite();

        $resources = $website->search($searchString, false, array('page'/* , 'publication' */), false, 6);
        $news = $website->search($searchString, false, array('news', 'event_item', 'press_release'), false, 6);
        $clients = $website->search($searchString, false, array('cf_case_study'), false, 6);
        $solutions = $website->search($searchString, false, array('cf_solution'), false, 6);
        $projects = $website->search($searchString, false, array('project'), false, 6);

        /** Fixes uris for the different types of solutions */
        /*
        $parentUri = array(
            'carbon' => 'carbon-management',
            'energy' => 'onsite-energy-efficiency',
            'farming' => 'australian-carbon-farming'
        );
        foreach ($solutions as $solution) {
            $uriParts = explode('/', $solution->uri);
            $solution->uri = str_replace($uriParts[1], $parentUri[$uriParts[1]], $solution->uri);
        }
        */

        $results = array();

        if (!empty($resources)) {
            $results[] = array(
                'group' => 'resources',
                'groupLabel' => trans('frontend.resources'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.resources'),
                'items' => $resources
            );
        }
        if (!empty($news)) {
            $results[] = array(
                'group' => 'news',
                'groupLabel' => trans('frontend.news_and_events'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.news_and_events'),
                'items' => $news
            );
        }
        if (!empty($clients)) {
            $results[] = array(
                'group' => 'clients',
                'groupLabel' => trans('frontend.clients'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.clients'),
                'items' => $clients
            );
        }
        if (!empty($solutions)) {
            $results[] = array(
                'group' => 'solutions',
                'groupLabel' => trans('frontend.solutions'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.solutions'),
                'items' => $solutions
            );
        }
        if (!empty($projects)) {
            $results[] = array(
                'group' => 'projects',
                'groupLabel' => trans('frontend.projects'),
                'linkLabel' => trans('frontend.see_all').' '.trans('frontend.projects'),
                'items' => $projects
            );
        }

        return response()->json($results);
    }

    public function postDownload()
    {
        $validator = Validator::make(
            request()->all(),
            array(
                'download_id' => 'required|integer|min:1'
            )
        );
        if ($validator->fails()) {
            return response()->json(array(
                "error" => "validation",
                "description" => "bad syntax",
                "validation" => $validator->messages()
            ), 400);
        }

        $visitor = null;
        $downloadId = request()->input('download_id');
        $website = Localization::getWebsite();
        $token = request()->cookie('visitor_token');

        if ($token) {
            //Looks if token belongs to a website user
            $visitor = $website->getVisitorByToken($token);
        }

        // If website has tracked pages conversions are made trough Sugar
        if (!$visitor && !$website->track_pages) {
            return response()->json(array(
                "status" => "not_visitor",
            ), 200);
        } else {
            return response()->json(array(
                "status" => "success",
            ), 200);
        }
    }

    public function getDownloadRequest($downloadId)
    {
        if (!$downloadId || !is_numeric($downloadId)) {
            abort(404);
        }
        $token = request()->cookie('visitor_token');
        $website = Localization::getWebsite();
        $visitor = null;
        if ($token) {
            //Looks if token belongs to a website user
            $visitor = $website->getVisitorByToken($token);
        }

        if (!$visitor && !$website->track_pages) {
            abort(404);
        }


        $pub = Publication::full()
            ->where('id', $downloadId)
            ->with(array(
                'document' => function ($query) {
                    $query->where('publication_media_item.language_id', Localization::getActiveLocale());
                }
            ))->first();

        if ($pub) {
            if (!$website->track_pages) {
                $newDownload = new VisitorDownload(array('publication_id' => $pub->id));
                $visitor->downloads()->save($newDownload);
            }
            $doc = $pub->document->get(0);
            if (!$doc) {
                abort(404);
            }

            return Storage::download(config('path.internal.media').'/'.$doc->filename);
        } else {
            abort(404);
        }
    }

    private function checkRecaptcha($recaptchaResponse)
    {
        $secret = config('google.recaptcha.secretKey');
        $remoteIp = request()->getClientIp();
        $recaptcha = new ReCaptcha($secret);
        $resp = $recaptcha->verify($recaptchaResponse, $remoteIp);
        if ($resp->isSuccess()) {
            return true;
        } else {
            //$errors = $resp->getErrorCodes();
            return false;
        }
    }

    public function postSubmitAssessment()
    {
        $data = [
            'first_name' => request()->input('first_name'),
            'last_name' => request()->input('last_name'),
            'job_title' => request()->input('job_title'),
            'company' => request()->input('company'),
            'assessment_email' => request()->input('assessment_email'),
            'site_name' => request()->input('site_name'),
            'site_country' => request()->input('site_country'),
            'industry_sector' => request()->input('industry_sector'),
            'location_found' => request()->input('location_found'),
            'location_lat' => request()->input('location_lat'),
            'location_lng' => request()->input('location_lng'),
            'rooftop_size' => request()->input('rooftop_size'),
            'electricity_consumption' => request()->input('electricity_consumption'),
            'g-recaptcha-response' => request()->input('g-recaptcha-response'),
            'is_upload' => request()->input('is_upload'),
        ];

        $filters = [
            'first_name' => 'strip_tags|xss_clean|trim',
            'last_name' => 'strip_tags|xss_clean|trim',
            'job_title' => 'strip_tags|xss_clean|trim',
            'company' => 'strip_tags|xss_clean|trim',
            'assessment_email' =>'strip_tags|xss_clean|trim',
            'site_name' => 'strip_tags|xss_clean|trim',
            'site_country' => 'strip_tags|xss_clean|trim',
            'industry_sector' => 'strip_tags|xss_clean|trim',
            'location_found' => 'strip_tags|xss_clean|trim',
            'location_lat' => 'strip_tags|xss_clean|trim',
            'location_lng' => 'strip_tags|xss_clean|trim',
            'rooftop_size' => 'strip_tags|xss_clean|trim|empty_string_to_null',
            'electricity_consumption' => 'strip_tags|xss_clean|trim|empty_string_to_null',
            'is_upload' => 'strip_tags|xss_clean|trim',
        ];

        $sanitizer = new Sanitizer($data, $filters);
        $data = $sanitizer->sanitize();

        $rules = array(
            'first_name' => 'required|max:30',
            'last_name' => 'required|max:30',
            'job_title' => 'required|max:60',
            'company' => 'required|max:60',
            'assessment_email' => 'required|email|max:255',
            'site_name' => 'required|max:60',
            'site_country' => 'required|max:60',
            'industry_sector' => 'required_if:is_upload,0|max:60',
            'location_found' => 'required|max:200',
            'location_lat' => 'required|numeric',
            'location_lng' => 'required|numeric',
            'rooftop_size' => 'nullable|numeric',
            'electricity_consumption' => 'nullable|required_if:is_upload,0|numeric',
            'load_profile' => 'file|mimes:pdf,doc,docx,jpg,png,txt,csv|max:2048',
            'g-recaptcha-response' => 'required',
            'is_upload' => 'required|in:1,0'
        );

        $validator = Validator::make(
            $data,
            $rules
        );

        if ($validator->fails()) {
            return response()->json(array(
                "status" => "validation_errors",
                "validation" => $validator->messages(),
                "message" => trans("There are validation errors. Please check the highlighted fields.")
            ), 200);
        }

        if (!request()->hasFile('load_profile') && $data['is_upload'] == '1') {
            return response()->json(array(
                "status" => "validation_errors",
                "validation" => array('load_profile' => array('Load profile is required')),
                "message" => trans("There are validation errors. Please check the highlighted fields.")
            ), 200);
        }

        if (!$this->checkRecaptcha(request()->input('g-recaptcha-response'))) {
            return response()->json(array(
                "status" => "validation_errors",
                "validation" => array(
                    'g-recaptcha-response' => 'Captcha verification Failed'
                )
            ), 200);
        }

        $filename = null;
        if (request()->hasFile('load_profile')) {
            $file = request()->file('load_profile');
            $filename = random_string('alnum', 20).'.'.$file->getClientOriginalExtension();
            $file->storeAs(
                '',
                $filename,
                'assessment_profiles'
            );
        }

        $assessment = new Assessment();
        $assessment->first_name = $data['first_name'];
        $assessment->last_name = $data['last_name'];
        $assessment->job_title = $data['job_title'];
        $assessment->company = $data['company'];
        $assessment->email = $data['assessment_email'];
        $assessment->site_name = $data['site_name'];
        $assessment->country = $data['site_country'];
        $assessment->location = $data['location_found'];
        $assessment->location_lat = substr($data['location_lat'], 0, 10);
        $assessment->location_lng = substr($data['location_lng'], 0, 10);
        $assessment->industry_sector = $data['industry_sector'];
        $assessment->rooftop_size = $data['rooftop_size'];
        $assessment->electricity_consumption = $data['electricity_consumption'];
        $assessment->load_profile = $filename;

        $assessment->save();

        $this->sendAssessmentEmail($assessment);

        return response()->json(array(
            "status" => "success"
        ), 200);
    }

    private function sendAssessmentEmail($assessment)
    {
        $website = Localization::getWebsite();

        Mail::to(
            config('mail.addresses.assessments.email'),
            config('mail.addresses.assessments.name')
        )->send(new AssessmentReceived($assessment, $website));
    }
}
