<?php

namespace App\Models\Agency;

use App\Models\User;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;

/**
 * Liste tablolarının kayıtlı görünümü.
 *
 * Aynı modül için iki kayıt olabilir: acente varsayılanı (user_id null) ve
 * kullanıcının kendi görünümü. Okurken kullanıcınınki varsa o, yoksa acente
 * varsayılanı uygulanır — yani "herkeste uygula" bir taban, "sadece bende"
 * onun üstüne binen kişisel bir katmandır.
 */
class TableView extends Model
{
    protected $fillable = [
        'agency_id',
        'user_id',
        'module',
        'columns',
        'options',
        'updated_by',
    ];

    protected $casts = [
        'columns' => 'array',
        'options' => 'array',
    ];

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

    /**
     * Bir modül için geçerli görünüm: kullanıcının kendi kaydı yoksa acente
     * varsayılanı, o da yoksa null (bileşen kendi varsayılanlarıyla çizer).
     */
    public static function resolve(string $module, ?int $agencyId = null, ?int $userId = null): ?self
    {
        // Migration henüz uygulanmadıysa tablolar kendi varsayılanlarıyla çizilsin
        if (!static::tableReady()) {
            return null;
        }

        $agencyId = $agencyId ?: (int) (Auth::user()?->currentAgencyId() ?? 0);
        $userId = $userId ?: (int) (Auth::id() ?? 0);

        if ($agencyId === 0) {
            return null;
        }

        $rows = static::where('agency_id', $agencyId)
            ->where('module', $module)
            ->where(fn ($q) => $q->whereNull('user_id')->orWhere('user_id', $userId))
            ->get();

        return $rows->firstWhere('user_id', $userId) ?: $rows->firstWhere('user_id', null);
    }

    /**
     * Görünümü herkes için kaydetme yetkisi.
     *
     * Acente içindeki en üst yetki acente sahibidir; platform tarafında
     * süper admin de aynı işi yapabilir. Diğer roller yalnızca kendi
     * görünümlerini kaydedebilir.
     */
    public static function canShare(?User $user = null): bool
    {
        if (!static::tableReady()) {
            return false;
        }

        $user = $user ?: Auth::user();
        if (!$user) {
            return false;
        }

        return $user->hasRole('agency-owner') || $user->hasRole('super-admin');
    }

    /**
     * table_views tablosu var mı? Migration uygulanmadan da listeler açılabilmeli;
     * sonuç istek boyunca önbelleklenir, her tablo için ayrı sorgu açılmaz.
     */
    protected static function tableReady(): bool
    {
        static $ready = null;

        if ($ready === null) {
            try {
                $ready = \Illuminate\Support\Facades\Schema::hasTable('table_views');
            } catch (\Throwable $e) {
                $ready = false;
            }
        }

        return $ready;
    }
}
