<?php

use App\Libs\Facades\Localization;

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

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

    public function media()
    {
        return $this->belongsTo("MediaItem");
    }

    public function categories()
    {
        return $this->belongsToMany("BlogCategory");
    }

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

    public function tags()
    {
        return $this->belongsToMany("BlogTag");
    }

    public function authors()
    {
        return $this->belongsToMany("BlogAuthor");
    }

    public function relatedPosts()
    {
        return $this->belongsToMany("BlogPost", "blog_post_blog_post", "blog_post_id", "blog_related_id");
    }

    public function questions()
    {
        return $this->hasMany("BlogQuestion");
    }

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

    public function ctaBarContact()
    {
        return $this->belongsTo('Contact');
    }

    public function getKeywords()
    {
        $keywords = [];
        foreach ($this->tags as $tag) {
            $keywords[] = $tag->title;
        }
        return implode(', ', $keywords);
    }

    public function getAuthors()
    {
        $authors = [];
        foreach ($this->authors as $author) {
            $authors[] = $author->title;
        }
        return implode(', ', $authors);
    }

    public function scopeInCategories($query, $cats)
    {
        if (empty($cats)) {
            return $query;
        }
        return $query->whereExists(function ($query) use ($cats) {
            $query->selectRaw('1')
                ->from('blog_category_blog_post')
                ->whereRaw('blog_category_blog_post.blog_post_id = blog_posts.id')
                ->whereIn('blog_category_id', $cats);
        });
    }

    public function scopeSearch($query, $searchTerms)
    {
        if (!$searchTerms) {
            return $query;
        }
        //dd($searchTerms);
        $languageId = Localization::getActiveLocale();
        return $query->join(
            "website_object_search",
            "website_objects.website_object_id",
            "=",
            "website_object_search.website_object_id"
        )->whereRaw("website_objects.website_object_id = website_object_search.website_object_id")
            ->where('website_object_search.content_type', 'blog_post')
            ->whereRaw("MATCH(primary_search, secondary_search)
                AGAINST (? IN BOOLEAN MODE)", array($searchTerms))
            ->where("website_object_search.website_id", 1)
            ->where("website_object_search.language_id", $languageId)
            ->orderByRaw("MATCH (primary_search)
                AGAINST (? IN BOOLEAN MODE) * 2 +
                MATCH (secondary_search)
                AGAINST (? IN BOOLEAN MODE) desc",
                array($searchTerms, $searchTerms)
            );
    }

    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->media;
        $fieldsObject->image_alt = $this->title;
        $fieldsObject->cta = generateObjectLinkJson($this);
        $fieldsObject->cta2 = null;

        return $fieldsObject;
    }
}
