<?php

namespace App\Models;

use App\Components\Functions;
use App\User;
use Illuminate\Database\Eloquent\Model;

class HostelPostCrawl extends Model
{
    //
    const FROM_FACEBOOK = 0;
    const FROM_OHANA = 1;
    const FROM_PHONGTRO_123 = 3;
    const FROM_USER_ITRO_POST = 120;

    protected $fillable = [
        'user_post',
        'user_post_image',
        'user_post_phone',
        'content',
        'source_link',
        'province_id',
        'district_id',
        'ward_id',
        'address',
        'post_id',
        'is_confirm',
        'from',
        'title',
        'price',
        'type',
        'lat',
        'lng',
        'hostel_id',
        'price_min',
        'price_max',
        'dynamic_link',
        'is_active'
    ];

    protected $dates = [
        'created_at',
        'updated_at'
    ];

    public static function boot()
    {
        parent::boot();
        static::saved(function ($item) {
            if (empty($item->dynamic_link)) {
                $dynamicLink = Functions::generateDynamicLinkHostelPostCrawl($item);
                HostelPostCrawl::query()
                    ->where('id', $item->id)
                    ->whereNull('dynamic_link')
                    ->update([
                        'dynamic_link' => $dynamicLink
                    ]);
            }
        });
    }

    public function medias()
    {
        return $this->hasMany(HostelPostCrawlMedia::class, 'hostel_post_crawl_id', 'id');
    }

    public function province()
    {
        return $this->belongsTo(Province::class, 'province_id', 'provinceid');
    }

    public function getFromTextAttribute()
    {
        $items = [HostelPostCrawl::FROM_FACEBOOK => 'Facebook',
            HostelPostCrawl::FROM_PHONGTRO_123 => 'Phongtro 123',
            HostelPostCrawl::FROM_OHANA => 'Ohana',
            HostelPostCrawl::FROM_USER_ITRO_POST => 'User'
        ];

        if(isset($items[$this->attributes['from']]))
        {
            return $items[$this->attributes['from']];
        }

        return null;
    }

    public function district()
    {
        return $this->belongsTo(District::class, 'district_id', 'districtid');
    }

    public function ward()
    {
        return $this->belongsTo(Ward::class, 'ward_id', 'wardid');
    }

    public function hostel()
    {
        return $this->belongsTo(Hostel::class, 'hostel_id', 'id');
    }

    public function hostelType()
    {
        return $this->belongsTo('App\Models\HostelType', 'type', 'id');
    }

    public function userWishlists()
    {
        return $this->belongsToMany(User::class, 'hostel_post_crawl_wishlists', 'hostel_post_crawl_id', 'user_id');
    }

    public function scopeIsWithinMaxDistance($query, $coordinates, $radius = 15)
    {
        $haversine = "(6371 * acos(cos(radians(" . $coordinates['lat'] . ")) 
                    * cos(radians(`hostel_post_crawls`.`lat`)) 
                    * cos(radians(`hostel_post_crawls`.`lng`) 
                    - radians(" . $coordinates['lng'] . ")) 
                    + sin(radians(" . $coordinates['lat'] . ")) 
                    * sin(radians(`hostel_post_crawls`.`lat`))))";

        return $query->select('*')
            ->selectRaw("{$haversine} AS distance")
            ->whereRaw("{$haversine} < ?", [$radius]);
    }
}
