<?php

namespace App\Http\Controllers\Admin;

use App\Http\Controllers\Controller;
use App\Models\Interview;
use App\Services\GoogleCalendarService;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Storage;
use Illuminate\Validation\Rules\Password;

class ProfileController extends Controller
{
    public function show()
    {
        $user = auth()->user();
        return view('admin.profil.index', compact('user'));
    }

    public function update(Request $request)
    {
        $user = auth()->user();

        $request->validate([
            'name'  => 'required|string|max:255',
            'email' => 'required|email|unique:users,email,' . $user->id,
            'bio'   => 'nullable|string|max:500',
        ]);

        $user->update([
            'name'  => $request->name,
            'email' => $request->email,
            'bio'   => $request->bio,
        ]);

        return back()->with('success', 'Profil bilgileri güncellendi.');
    }

    public function updatePassword(Request $request)
    {
        $request->validate([
            'current_password'      => 'required',
            'password'              => ['required', 'confirmed', Password::min(8)],
        ], [
            'current_password.required' => 'Mevcut şifre zorunludur.',
            'password.required'         => 'Yeni şifre zorunludur.',
            'password.min'              => 'Şifre en az 8 karakter olmalıdır.',
            'password.confirmed'        => 'Şifreler eşleşmiyor.',
        ]);

        $user = auth()->user();

        if (!Hash::check($request->current_password, $user->password)) {
            return back()->withErrors(['current_password' => 'Mevcut şifre yanlış.'])->withFragment('password');
        }

        $user->update(['password' => Hash::make($request->password)]);

        return back()->with('success', 'Şifre başarıyla güncellendi.')->withFragment('password');
    }

    public function updateAvatar(Request $request)
    {
        $request->validate([
            'avatar' => 'required|image|mimes:jpg,jpeg,png,gif,webp|max:2048',
        ]);

        $user = auth()->user();

        // Eski avatarı sil
        if ($user->avatar && Storage::disk('public')->exists($user->avatar)) {
            Storage::disk('public')->delete($user->avatar);
        }

        $path = $request->file('avatar')->store('avatars', 'public');
        $user->update(['avatar' => $path]);

        return back()->with('success', 'Profil fotoğrafı güncellendi.');
    }

    public function removeAvatar()
    {
        $user = auth()->user();

        if ($user->avatar && Storage::disk('public')->exists($user->avatar)) {
            Storage::disk('public')->delete($user->avatar);
        }

        $user->update(['avatar' => null]);

        return back()->with('success', 'Profil fotoğrafı kaldırıldı.');
    }

    // ─── Google Calendar OAuth ────────────────────────────────────────────────

    public function googleConnect()
    {
        $user    = auth()->user();
        $service = app(GoogleCalendarService::class);

        if (!$service->isEnabled()) {
            return back()->with('error', 'Google Calendar entegrasyonu henüz yapılandırılmamış. Lütfen Site Ayarları\'ndan Client ID ve Client Secret girin.');
        }

        // CSRF koruması için state parametresi oluştur ve session'a kaydet
        $state = \Illuminate\Support\Str::random(40);
        session(['google_oauth_state' => $state]);

        $url = $service->getAuthUrlForUser($user, $state);
        return redirect($url);
    }

    public function googleCallback(Request $request)
    {
        $user    = auth()->user();
        $service = app(GoogleCalendarService::class);

        if ($request->filled('error')) {
            return redirect()->route('admin.profil.show')
                ->with('error', 'Google Calendar bağlantısı iptal edildi.');
        }

        if (!$request->filled('code')) {
            return redirect()->route('admin.profil.show')
                ->with('error', 'Geçersiz Google callback.');
        }

        // State parametresi doğrulaması (CSRF koruması)
        $sessionState = session('google_oauth_state');
        $requestState = $request->input('state');
        session()->forget('google_oauth_state');

        if (!$sessionState || !$requestState || !hash_equals($sessionState, $requestState)) {
            return redirect()->route('admin.profil.show')
                ->with('error', 'Güvenlik doğrulaması başarısız. Lütfen tekrar deneyin.');
        }

        $success = $service->handleCallbackForUser($request->code, $user);

        if ($success) {
            // Bağlantı öncesi oluşturulmuş, Google'a gönderilmemiş aktif görüşmeleri senkronize et
            $user->refresh();
            $pendingInterviews = Interview::whereNull('google_event_id')
                ->whereIn('status', ['scheduled', 'rescheduled'])
                ->get();

            foreach ($pendingInterviews as $interview) {
                try {
                    $service->createEvent($interview);
                } catch (\Exception $e) {
                    \Illuminate\Support\Facades\Log::warning('Geçmiş görüşme senkronizasyon hatası: ' . $e->getMessage());
                }
            }
        }

        return redirect()->route('admin.profil.show')
            ->with(
                $success ? 'success' : 'error',
                $success ? 'Google Takvim başarıyla bağlandı.' : 'Google Takvim bağlantısı başarısız oldu.'
            );
    }

    public function googleDisconnect()
    {
        $user = auth()->user();

        $user->update([
            'google_access_token'     => null,
            'google_refresh_token'    => null,
            'google_token_expires_at' => null,
        ]);

        return back()->with('success', 'Google Takvim bağlantısı kesildi.');
    }
}
