<?php

namespace App\Http\Controllers\Auth;

use Google_Client;
use Google_Service_OneTap;
use App\Models\User;
use App\Models\Lead;
use App\Models\Admin;
use App\Models\Setting;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Facades\Hash;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Laravel\Socialite\Facades\Socialite;
use Illuminate\Support\Facades\Notification;
use App\Notifications\CompanyCreatedNotification;
use App\Notifications\CandidateCreateNotification;
use App\Notifications\Admin\NewUserRegisteredNotification;
use App\Notifications\CompanyCreateApprovalPendingNotification;
use App\Notifications\CandidateCreateApprovalPendingNotification;

class SocialLoginController extends Controller
{
    public function redirect($provider)
    {
        $this->forgetSocialSessions();
        session(['social_user' => request('user')]);

        return Socialite::driver($provider)->redirect();
    }

    public function callback($provider)
    {
        $this->forgetSocialSessions();

        try {
            $socialiteUser = Socialite::driver($provider)->user();

            $socialiteUserId = $socialiteUser->getId();
            $socialiteUserName = $socialiteUser->getName();
            $socialiteUseremail = $socialiteUser->getEmail();
            $socialiteUserimage = $socialiteUser->getAvatar();

            $user = User::where([
                'provider' => $provider,
                'provider_id' =>  $socialiteUserId,
            ])->first();

        if (!$user) {
            session(['provider' => $provider]);
            session(['socialiteUserId' => $socialiteUserId]);
            session(['socialiteUserName' => $socialiteUserName]);
            session(['socialiteUseremail' => $socialiteUseremail]);
            session(['socialiteUserimage' => $socialiteUserimage]);

            $is_exists_email = User::where('email', $socialiteUseremail)->exists();
           
            if(!$is_exists_email){
            // Create user account
                $data['password']= Str::random(8, 'alnum') . '@#';
                $user = User::create([
                    'name' => $socialiteUserName,
                    'email' => $socialiteUseremail,
                    'username' => Str::slug($socialiteUserName) . '_' . Str::random(5),
                    'password' => Hash::make($data['password']),
                    'image' => $socialiteUserimage,
                    'provider' => $provider,
                    'provider_id' =>  $socialiteUserId,
                    'role' => 'Candidate',
                    'email_verified_at' => now(),
                ]);
                $oldUser = $user;
                // if mail configured, send notification to candidate and company

                $data = array('data'=>$oldUser);
                Mail::send('mails.welcome-mail', $data, function($message) use($oldUser) {
                    $message->to($oldUser->email, 'Gradding')->subject
                    ('Welcome to Gradding');
                    $message->from('contact@gradding.com','Gradding Team');
                });

                $admins = Admin::all();
                foreach ($admins as $admin) {
                    $admin->notify(new NewUserRegisteredNotification($admin, $user));
                }
        }
            $lead = new Lead;
                $lead->name = $socialiteUserName;
                $lead->email = $socialiteUseremail;
                $lead->url =  'Google-Login';
                $lead->source =  'Google-Login';
                if (auth('user')->check() && auth('user')->user()->role == 'candidate'){
                    $lead->user_id =  auth()->user()->id;
                }
                else{
                    $lead->user_id =  $user->id;
                }
                $lead = $lead->save();
    
    
            Auth::guard('user')->login($user);
        }

        Auth::guard('user')->login($user);

        $this->forgetSocialSessions();
        return redirect()->route('user.dashboard');
        } catch (\Exception $e) {
            return redirect()->route('login');
        }
    }


    // public function register(Request $request){
    //     $provider = session('provider');
    //     $socialiteUserId = session('socialiteUserId');
    //     $socialiteUserName = session('socialiteUserName');
    //     $socialiteUseremail =session('socialiteUseremail');
    //     $socialiteUserimage = session('socialiteUserimage');

    //     // Checking email exists or not

    //     $this->forgetSocialSessions();
    //     return redirect()->route('user.dashboard');
    // }

    protected function forgetSocialSessions(){
        session()->forget('provider');
        session()->forget('socialiteUserId');
        session()->forget('socialiteUserName');
        session()->forget('socialiteUseremail');
        session()->forget('socialiteUserimage');
        session()->forget('socialiteUserimage');
    }


    // public function redirectToGoogle()
    // {
    //     return Socialite::driver('google')->redirect();
    // }
    
    // public function handleGoogleCallback()
    // {
    //     $user = Socialite::driver('google')->user();
    
    //     $existingUser = User::where('email', $user->email)->first();
    
    //     if ($existingUser) {
    //         Auth::login($existingUser);
    //     } else {
    //         $newUser = new User();
    //         $newUser->name = $user->name;
    //         $newUser->email = $user->email;
    //         $newUser->password = bcrypt('password'); // Set a default password for new users
    //         $newUser->save();
    
    //         Auth::login($newUser);
    //     }
    
    //     return redirect('/candidate/dashboard');
    // }


    public function facebookCallback()
    {
        $this->forgetSocialSessions();

        // try {
            $socialiteUser = Socialite::driver('facebook')->user();

            $socialiteUserId = $socialiteUser->getId();
            $socialiteUserName = $socialiteUser->getName();
            $socialiteUseremail = $socialiteUser->getEmail();
            $socialiteUserimage = $socialiteUser->getAvatar();

            $user = User::where([
                'provider' => 'facebook',
                'provider_id' =>  $socialiteUserId,
            ])->first();

        if (!$user) {
            session(['provider' => 'facebook']);
            session(['socialiteUserId' => $socialiteUserId]);
            session(['socialiteUserName' => $socialiteUserName]);
            session(['socialiteUseremail' => $socialiteUseremail]);
            session(['socialiteUserimage' => $socialiteUserimage]);

            $is_exists_email = User::where('provider_id', $socialiteUserId)->exists();
           
            if(!$is_exists_email){
            // Create user account
                $data['password']= Str::random(8, 'alnum') . '@#';
                $user = User::create([
                    'name' => $socialiteUserName,
                    'email' => $socialiteUseremail,
                    'username' => Str::slug($socialiteUserName) . '_' . Str::random(5),
                    'password' => Hash::make($data['password']),
                    'image' => $socialiteUserimage,
                    'provider' => 'facebook',
                    'provider_id' =>  $socialiteUserId,
                    'role' => 'Candidate',
                    'email_verified_at' => now(),
                ]);
                $oldUser = $user;
                // if mail configured, send notification to candidate and company

                // $data = array('data'=>$oldUser);
                // Mail::send('mails.welcome-mail', $data, function($message) use($oldUser) {
                //     $message->to($oldUser->email, 'Gradding')->subject
                //     ('Welcome to Gradding');
                //     $message->from('contact@gradding.com','Gradding Team');
                // });

                $admins = Admin::all();
                foreach ($admins as $admin) {
                    $admin->notify(new NewUserRegisteredNotification($admin, $user));
                }
        }
            $lead = new Lead;
                $lead->name = $socialiteUserName;
                $lead->email = $socialiteUseremail;
                $lead->url =  'facebook';
                $lead->source =  'Facebook';
                if (auth('user')->check() && auth('user')->user()->role == 'candidate'){
                    $lead->user_id =  auth()->user()->id;
                }
                else{
                    $lead->user_id =  $user['id'];
                }
                $lead = $lead->save();
    
    
            Auth::guard('user')->login($user);
        }

        Auth::guard('user')->login($user);

        $this->forgetSocialSessions();
        return redirect()->route('user.dashboard');
        // } catch (\Exception $e) {
        //     return redirect()->route('login');
        // }
    }

}
