<?php

declare(strict_types=1);

namespace App\Http\Middleware;

use App\Domain\Account\Models\Account;
use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

/**
 * Customer panel (/panel/*) erişim middleware'i.
 *
 * İki erişim modeli:
 *  1) Gerçek müşteri (hasRole 'user') → kendi account'ları üzerinden çalışır
 *  2) Admin "Görüntüleme" modunda → session('viewing_account_id') üzerinden belirli
 *     bir hesabı görüntüler (WHM-style "Login As Customer"). Admin'in Auth::user()'ı
 *     bozulmaz; customer_account attribute'una hedef hesap inject edilir.
 *
 * Çıktı: $request->attributes->get('customer_account') ile primary Account alınır.
 */
class EnsureUserIsCustomer
{
    public function handle(Request $request, Closure $next): Response
    {
        $user = $request->user();

        if ($user === null) {
            return redirect()->route('login');
        }

        // WHM-style görüntüleme — admin başka bir hesabı görüntülüyor
        if ($user->hasRole('admin')) {
            $viewingId = $request->session()->get('viewing_account_id');

            if ($viewingId) {
                $account = Account::find($viewingId);
                if ($account === null) {
                    // Hesap silinmiş — session'ı temizle
                    $request->session()->forget(['viewing_account_id', 'viewing_owner_id', 'viewing_account_username', 'impersonator_id', 'impersonator_name']);

                    return redirect()->route('admin.dashboard')
                        ->with('error', 'Görüntülediğiniz hesap silinmiş veya bulunamıyor.');
                }

                $request->attributes->set('customer_account', $account);

                return $next($request);
            }

            // Admin /panel'e doğrudan girmek isterse → admin paneline yönlendir
            return redirect()->route('admin.dashboard');
        }

        // Reseller'lar customer panele erişemez, kendi panellerine gider
        if ($user->hasRole('reseller')) {
            return redirect()->route('reseller.dashboard');
        }

        // Gerçek müşteri akışı — owner_user_id üzerinden en son hesabı çek
        $account = Account::where('owner_user_id', $user->id)->latest('id')->first();

        if ($account === null) {
            abort(403, 'Bu kullanıcının yönetebileceği bir hosting hesabı yok. Bir bayinizle iletişime geçin.');
        }

        $request->attributes->set('customer_account', $account);

        return $next($request);
    }
}
