<?php

namespace App\Models;

use App\Models\Interfaces\CardableModel;
use App\Models\Traits\LanguageSupportTrait;
use App\Models\Traits\BlocksTrait;
use Illuminate\Support\Facades\DB;

class Solution extends ContentTypeModel implements CardableModel
{
    use LanguageSupportTrait;
    use BlocksTrait;

    protected $hidden = array('languages', "websites");
    protected $with = array("websites.languages", "languages");

    public function slides()
    {
        return $this->belongsToMany(MediaItem::class, "solution_slides");
    }

    public function sustainability_topics()
    {
        return $this->belongsToMany(SustainabilityTopic::class, "solution_sustainability_topic");
    }

    public function sectors()
    {
        return $this->belongsToMany(Sector::class, "solution_sector");
    }

    public function values()
    {
        return $this->belongsToMany(Value::class, "solution_value");
    }

    public function businessLines()
    {
        return $this->belongsToMany(BusinessLine::class, "solution_business_line");
    }

    public function testimonials()
    {
        return $this->belongsToMany(Testimonial::class, "solution_testimonial");
    }

    public function blocks()
    {
        return $this->belongsToMany(Block::class, 'solution_blocks');
    }

    public function overviewImage()
    {
        return $this->belongsTo(MediaItem::class);
    }

    public function factSheet()
    {
        return $this->belongsTo(Publication::class);
    }

    public function icon()
    {
        return $this->belongsTo(MediaItem::class);
    }

    public function iconHover()
    {
        return $this->belongsTo(MediaItem::class);
    }

    public function contentSnippets()
    {
        return $this->belongsToMany(ContentSnippet::class, "solution_content_snippet");
    }

    public function scopeFilterByTopics($query, $topics)
    {
        return $query->whereExists(function ($query) use ($topics) {
            $query->select(DB::raw(1))
                ->from("solution_sustainability_topic")
                ->whereRaw("solution_sustainability_topic.solution_id = solutions.id")
                ->whereIn("solution_sustainability_topic.sustainability_topic_id", $topics);
        });
    }

    public function scopeFilterByValues($query, $values)
    {
        return $query->whereExists(function ($query) use ($values) {
            $query->select(DB::raw(1))
                ->from("solution_value")
                ->whereRaw("solution_value.solution_id = solutions.id")
                ->whereIn("solution_value.value_id", $values);
        });
    }

    public function scopeFilterByBusinessLines($query, $values)
    {
        return $query->whereExists(function ($query) use ($values) {
            $query->select(DB::raw(1))
                ->from("solution_business_line")
                ->whereRaw("solution_business_line.solution_id = solutions.id")
                ->whereIn("solution_business_line.business_line_id", $values);
        });
    }

    public function scopeFilterBySectors($query, $sectors)
    {
        return $query->whereExists(function ($query) use ($sectors) {
            $query->select(DB::raw(1))
                ->from("solution_sector")
                ->whereRaw("solution_sector.solution_id = solutions.id")
                ->whereIn("solution_sector.sector_id", $sectors);
        });
    }

    public function sidebarWidgets()
    {
        return $this->belongsToMany(SidebarWidget::class, 'solution_sb_widgets');
    }

    public function codeEmbeds()
    {
        return $this->belongsToMany(CodeEmbed::class, "solution_code_embeds");
    }

    public function solutions()
    {
        return $this->belongsToMany(Solution::class, "solution_solution", "solution_id", "child_solution_id");
    }

    public function topLevelSolutions()
    {
        return $this->belongsToMany(Solution::class, "solution_solution", "child_solution_id", "solution_id");
    }

    public function getCardFields()
    {
        $wo = $this->websites()->first();
        if ($wo->status != 'published' || $wo->lang_status != 'published') {
            return null;
        }

        $fieldsObject = new \stdClass();
        $fieldsObject->subject = '';
        $fieldsObject->title = $this->title;
        $fieldsObject->excerpt = '<p>' . $this->reference_summary . '</p>';
        $fieldsObject->image = $this->overviewImage;
        $fieldsObject->image_alt = $this->title;
        $fieldsObject->cta = generateObjectLinkJson($this);
        $fieldsObject->cta2 = null;

        return $fieldsObject;
    }
}
