<?php

namespace App\Models;

use App\Components\Functions;
use App\Jobs\AddRenterConversation;
use App\Jobs\AddRenterConversationV2;
use App\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Spatie\Activitylog\Traits\LogsActivity;

class Renter extends Model
{
    //
    use SoftDeletes;
    use LogsActivity;

    protected static $logAttributes = ['*'];

    const LIVING = 0;
    const LEFT = 1;
    const JUST_REGISTER = 2;

    protected $fillable = [
        'email',
        'name',
        'address',
        'phone',
        'date_joined',
        'hostel_id',
        'hostel_name',
        'room_id',
        'room_name',
        'status',
        'user_id',
        'residence_status',
        'date_end_residence',
        'image',
        'id_number_front',
        'id_number_back',
        'is_self_register',
        'id_number_date',
        'id_number_location',
        'note',
        'birthday',
        'last_name',
        'work_place_id'
    ];

    protected $dates = [
        'created_at',
        'updated_at',
        'date_joined',
        'date_end_residence',
        'birthday',
        'deleted_at'
    ];

    public function residence()
    {
        return $this->hasOne(Residence::class, 'user_id', 'user_id');
    }

    public function getImageUrlAttribute()
    {
        if (!empty($this->attributes['image'])) {
            return '/files/' . $this->attributes['image'];
        }

        return '/frontend3/assets/img/avatar_thue@1x.png';
    }

    public function renterRoom()
    {
        return $this->belongsTo(RenterRoom::class, 'user_id', 'user_id');
    }

    public function workPlace()
    {
        return $this->belongsTo(Workplace::class);
    }

    public function getImageAttribute()
    {
        if (str_contains(request()->fullUrl(), 'api/v1')) {
            if (!empty($this->attributes['image'])) {
                return '/files/' . $this->attributes['image'];
            }

            return '/frontend3/assets/img/avatar_thue@1x.png';
        }

        return $this->attributes['image'];
    }


    public static function boot()
    {
        parent::boot();
        static::created(function ($item) {

            if (empty($item->email)) {
                if (!empty($item->user_id)) {
                    $user = User::find($item->user_id);
                    if ($user) {
                        $item->email = $user->email;
                        $item->save();
                    }
                }
            }

            if (!$item->user) {
                return;
            }
            $nameArr = explode(' ', $item->user->name_text);
            if (!is_array($nameArr)) {
                return;
            }
            $item->last_name = $nameArr[count($nameArr) - 1];
            $item->save();


            if (auth('backend')->check()) {
                //dispatch(new AddRenterConversation($item->room_id, $item->user_id, auth('backend')->user()->id));
                dispatch(new AddRenterConversationV2($item->room_id, $item->user_id, auth('backend')->user()->id));
            } else {
                $token = \request()->header('authorization');
                if ($token) {
                    $user = \JWTAuth::parseToken()->toUser();
                    if($user) {
                        //dispatch(new AddRenterConversation($item->room_id, $item->user_id, $user->id));
                        dispatch(new AddRenterConversationV2($item->room_id, $item->user_id, $user->id));
                    } else {
                        //dispatch(new AddRenterConversation($item->room_id, $item->user_id, $item->hostel->owner_id));
                        dispatch(new AddRenterConversationV2($item->room_id, $item->user_id, $item->hostel->owner_id));
                    }

                }
            }
        });
    }

    public function user()
    {
        return $this->belongsTo(User::class, 'user_id', 'id');
    }

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

    public function contract()
    {
        return $this->belongsTo(Contract::class, 'renter_id', 'user_id');
    }

    public function contractItem()
    {
        return $this->belongsTo(Contract::class, 'user_id', 'renter_id');
    }

    public function room()
    {
        return $this->belongsTo(Room::class, 'room_id', 'id');
    }

    public function getAddressTextAttribute()
    {

        $addressDetail = $this->getAddressDetailAttribute();
        if (!empty($addressDetail)) {
            return $this->attributes['address'] . ', ' . $addressDetail;
        }


        return $this->attributes['address'];
    }

    public function getAddressDetailAttribute()
    {
        $user = $this->user;
        if (!$user) {
            return null;
        }

        $district = $user->district_id;
        $province = $user->province_id;
        $ward = $user->ward_id;
        $districtText = '';
        $provinceText = '';
        $wardText = '';

        if (!empty($district)) {
            $districtItem = Functions::getDistrictName($district);
            if ($districtItem) {
                $districtText = $districtItem->name . ', ';
            }
        }

        if (!empty($province)) {
            $provinceItem = Functions::getProvinceName($province);
            if ($provinceItem) {
                $provinceText = $provinceItem->name;
            }
        }

        if (!empty($ward)) {
            $wardItem = Functions::getWardName($ward);
            if ($wardItem) {
                $wardText = $wardItem->name . ', ';
            }
        }
        return trim($wardText . $districtText . $provinceText);
    }
}
