<?php

namespace App\Models;

use App\Models\Definition\GuideChamber;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

/**
 * TUREB Rehber Veritabanı aynası. Salt-okunur sicil: yalnızca senkron
 * (TurebGuideSyncService) yazar, acenteler yalnızca okur ve kendi kaynağına
 * kopyalar. Acentenin kendi kaynakları için bkz. App\Models\Resource.
 */
class TurebGuide extends Model
{
    use HasFactory;

    public const STATUS_ACTIVE = 'Eylemli';
    public const STATUS_INACTIVE = 'Eylemsiz';

    protected $fillable = [
        'source_hash',
        'full_name',
        'chamber_code',
        'regions',
        'languages',
        'phone',
        'email',
        'status',
        'fetched_at',
    ];

    protected function casts(): array
    {
        return [
            'regions' => 'array',
            'languages' => 'array',
            'fetched_at' => 'datetime',
        ];
    }

    /**
     * Bu sicil kaydından oluşturulmuş acente kaynakları.
     * (Aynı rehberi birden fazla acente kendi kaynağına ekleyebilir.)
     */
    public function resources()
    {
        return $this->hasMany(Resource::class);
    }

    /** Kaydın odası (kod eşleşmesiyle; TUREB'de odası boş satırlar da var). */
    public function chamber()
    {
        return $this->belongsTo(GuideChamber::class, 'chamber_code', 'code');
    }

    // ─── Kimlik ──────────────────────────────────────────────────

    /**
     * TUREB satır başına id vermediği için kimlik bu alanlardan türetilir.
     * Telefonu/e-postası boş adaşlar aynı hash'e düşebilir — kaynakta ayırt
     * edici bir alan olmadığından kabul edilen sınır.
     */
    public static function makeHash(string $name, ?string $chamber, ?string $phone, ?string $email): string
    {
        return hash('sha256', implode('|', [
            mb_strtolower(trim($name)),
            mb_strtolower(trim((string) $chamber)),
            preg_replace('/\D/', '', (string) $phone),
            mb_strtolower(trim((string) $email)),
        ]));
    }

    // ─── Scope'lar ───────────────────────────────────────────────

    public function scopeByChamber($query, ?string $code)
    {
        return $code ? $query->where('chamber_code', $code) : $query;
    }

    public function scopeByStatus($query, ?string $status)
    {
        return $status ? $query->where('status', $status) : $query;
    }

    /** regions/languages json dizisi içinde arar. */
    public function scopeByRegion($query, ?string $region)
    {
        return $region ? $query->whereJsonContains('regions', $region) : $query;
    }

    public function scopeByLanguage($query, ?string $language)
    {
        return $language ? $query->whereJsonContains('languages', $language) : $query;
    }

    public function scopeSearch($query, ?string $term)
    {
        if (!$term) {
            return $query;
        }

        return $query->where(function ($q) use ($term) {
            $q->where('full_name', 'like', "%{$term}%")
              ->orWhere('phone', 'like', "%{$term}%")
              ->orWhere('email', 'like', "%{$term}%");
        });
    }

    // ─── Yardımcılar ─────────────────────────────────────────────

    public function getLanguagesTextAttribute(): string
    {
        return implode(', ', $this->languages ?? []) ?: '—';
    }

    public function getRegionsTextAttribute(): string
    {
        return implode(', ', $this->regions ?? []) ?: '—';
    }

    public function getIsActiveGuideAttribute(): bool
    {
        return $this->status === self::STATUS_ACTIVE;
    }

    /** Bu rehber ilgili acentenin kaynaklarına daha önce eklenmiş mi? */
    public function importedBy(int $agencyId): ?Resource
    {
        return $this->resources()->where('agency_id', $agencyId)->first();
    }
}
