<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Laravel\Sanctum\HasApiTokens;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable
{
    use HasApiTokens, HasFactory, Notifiable, HasRoles;

    /**
     * The attributes that are mass assignable.
     *
     * @var array<int, string>
     */

    protected $connection = 'mysql';
    protected $fillable = [
        'person_id',
        'name',
        'email',
        'username',
        'password',
        'phone',
        'otp',
        'otp_created_at',
    ];

    /**
     * The attributes that should be hidden for serialization.
     *
     * @var array<int, string>
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast.
     *
     * @var array<string, string>
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
        'otp_created_at' => 'datetime'
    ];

    public $with = [
        'metas',
        'person'
    ];

    public $appends = [
        'meta',
        'avatar_url',
        'full_name'
    ];

    public function getAvatarUrlAttribute()
    {
        return asset('images/specialities/anak.png');
    }

    public function getFullNameAttribute()
    {
        return $this->person?->full_name;
    }

    public function getMetaAttribute()
    {
        $orgMeta = [];
        foreach ($this->metas as $meta) {
            $orgMeta[$meta->type] = $meta->value;
        }

        return (object) $orgMeta;
    }

    public function managedCorporates()
    {
        return $this->belongsToMany(Corporate::class, 'corporate_manager', 'user_id', 'corporate_id');
    }
    
    public function metas()
    {
        return $this->morphMany(Meta::class, 'metaable');
    }

    public function person()
    {
        return $this->belongsTo(Person::class, 'person_id');
    }

    public function ownedPersons()
    {
        return $this->hasMany(Person::class, 'owner_user_id');
    }

    public function notificationTokens()
    {
        return $this->morphMany(NotificationToken::class, 'notifiabletoken');
    }

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