<?php

namespace App\Actions\StorageProvider;

use App\Models\StorageProvider;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Laravel\Socialite\Facades\Socialite;
use Laravel\Socialite\Two\User;
use Throwable;

class HandleProviderCallback
{
    public function callback(Request $request, string $provider): string|RedirectResponse
    {
        try {
            $providerId = $request->session()->get('storage_provider_id');
            /** @var StorageProvider $storageProvider */
            $storageProvider = StorageProvider::query()->findOrFail($providerId);
            /** @var User $oauthUser */
            $oauthUser = Socialite::driver($provider)->user();
            $storageProvider->token = $oauthUser->token;
            $storageProvider->refresh_token = $oauthUser->refreshToken;
            $storageProvider->token_expires_at = now()->addSeconds($oauthUser->expiresIn);
            $storageProvider->connected = true;
            $storageProvider->save();
            /** @TODO toast success message */
        } catch (Throwable) {
            /** @TODO toast failed message */
        }

        return redirect()->route('storage-providers');
    }
}