<?php

namespace App\Models;

use Filament\Models\Contracts\FilamentUser;
use Filament\Models\Contracts\HasAvatar;
use Filament\Panel;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
use Spatie\Permission\Traits\HasRoles;

class User extends Authenticatable implements FilamentUser, HasAvatar
{
    use HasRoles, Notifiable;

    protected $fillable = [
        'name',
        'email',
        'password',
        'phone',
        'job_title',
        'is_active',
        'avatar',
        'bonus_percent',
    ];

    protected $hidden = [
        'password',
        'remember_token',
    ];

    protected function casts(): array
    {
        return [
            'email_verified_at' => 'datetime',
            'password' => 'hashed',
            'is_active' => 'boolean',
            'bonus_percent' => 'decimal:2',
        ];
    }

    /**
     * مجموع فروش (فاکتور و فاکتور رسمی، غیرباطل) در بازه‌ی زمانی اختیاری.
     */
    public function salesTotal(?\Carbon\Carbon $from = null, ?\Carbon\Carbon $to = null): float
    {
        return (float) $this->invoices()
            ->whereIn('type', ['invoice', 'official'])
            ->where('status', '!=', 'void')
            ->when($from, fn ($q) => $q->whereDate('issue_date', '>=', $from))
            ->when($to, fn ($q) => $q->whereDate('issue_date', '<=', $to))
            ->sum('grand_total');
    }

    /**
     * مبلغ پاداش بر اساس درصد پاداش.
     */
    public function bonusAmount(?\Carbon\Carbon $from = null, ?\Carbon\Carbon $to = null): float
    {
        return $this->salesTotal($from, $to) * ((float) $this->bonus_percent / 100);
    }

    public function canAccessPanel(Panel $panel): bool
    {
        return $this->is_active;
    }

    public function getFilamentAvatarUrl(): ?string
    {
        return $this->avatar ? asset('storage/' . $this->avatar) : null;
    }

    public function isSuperAdmin(): bool
    {
        return $this->hasRole('admin');
    }

    // نگه‌داشته‌شده برای سازگاری با کد قبلی؛ معادل مدیر کل است.
    public function isAdmin(): bool
    {
        return $this->isSuperAdmin();
    }

    /**
     * آیا کاربر می‌تواند همه‌ی رکوردهای یک بخش را ببیند (نه فقط رکوردهای خودش)؟
     * مدیر کل همیشه می‌تواند؛ سایر نقش‌ها در صورت داشتن مجوز view_all_{section}.
     */
    public function canSeeAll(string $section): bool
    {
        return $this->isSuperAdmin() || $this->can("view_all_{$section}");
    }

    /**
     * برچسب فارسی نقش اصلی کاربر.
     */
    public function roleLabel(): string
    {
        $role = $this->roles->first()?->name;

        return $role ? \App\Support\AccessControl::roleLabel($role) : '—';
    }

    // مشتری‌های اختصاص‌یافته به این کارمند
    public function customers(): HasMany
    {
        return $this->hasMany(Customer::class, 'assigned_user_id');
    }

    public function invoices(): HasMany
    {
        return $this->hasMany(Invoice::class, 'user_id');
    }

    public function interactions(): HasMany
    {
        return $this->hasMany(Interaction::class);
    }

    public function payments(): HasMany
    {
        return $this->hasMany(Payment::class);
    }

    // تسک‌هایی که به این کاربر اختصاص یافته
    public function tasks(): BelongsToMany
    {
        return $this->belongsToMany(Task::class);
    }

    public function createdTasks(): HasMany
    {
        return $this->hasMany(Task::class, 'created_by');
    }

    // فعالیت‌هایی که این کاربر انجام داده (لاگ فعالیت)
    public function activities(): HasMany
    {
        return $this->hasMany(\Spatie\Activitylog\Models\Activity::class, 'causer_id')
            ->where('causer_type', self::class)
            ->latest();
    }

    // تاریخچه‌ی ورود و خروج
    public function loginLogs(): HasMany
    {
        return $this->hasMany(LoginLog::class)->latest('logged_in_at');
    }
}
