<?php

namespace App\Services;

use App\Models\Reservation;
use App\Models\User;
use App\Support\PhoneNormalizer;

class ReservationGuestLinker
{
    /**
     * Misafir telefonu ile saklanmış rezervasyonları kullanıcıya bağlar (user_id güncellenir).
     *
     * @return int Güncellenen satır sayısı
     */
    public static function claimFor(User $user): int
    {
        $canonical = PhoneNormalizer::canonicalTurkey($user->phone);

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

        return Reservation::query()
            ->whereNull('user_id')
            ->where('guest_phone_normalized', $canonical)
            ->update(['user_id' => $user->id]);
    }

    /**
     * Kanonik numaraya göre doğrulanmış telefonlu ilk kullanıcıyı bulur (tüm olası yazımla).
     */
    public static function findVerifiedUserByCanonical(?string $canonical): ?User
    {
        if ($canonical === null) {
            return null;
        }

        return User::query()
            ->where(function ($q) use ($canonical) {
                $q->where('phone', $canonical)
                    ->orWhere('phone', '0' . $canonical)
                    ->orWhere('phone', '+90' . $canonical)
                    ->orWhere('phone', '90' . $canonical);
            })
            ->whereNotNull('phone_verified_at')
            ->first();
    }

    /**
     * Doğrulama zorunlu değilse (mevcut hesap için) doğrudan bağlama.
     */
    public static function findUserByCanonical(?string $canonical): ?User
    {
        if ($canonical === null) {
            return null;
        }

        return User::query()
            ->where(function ($q) use ($canonical) {
                $q->where('phone', $canonical)
                    ->orWhere('phone', '0' . $canonical)
                    ->orWhere('phone', '+90' . $canonical)
                    ->orWhere('phone', '90' . $canonical);
            })
            ->first();
    }
}
