<?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 Illuminate\Support\Facades\Session;
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)->first();
           
            if(isset($is_exists_email->phone) && isset($is_exists_email->country)){
                Auth::guard('user')->login($is_exists_email);
                return redirect()->route('candidate.setting');

        //     // 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();
    
    
        return redirect('register');

        // 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 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('email', $socialiteUseremail)->first();
           
            if(isset($is_exists_email->phone) && isset($is_exists_email->country)){
                Auth::guard('user')->login($is_exists_email);
                return redirect()->route('candidate.setting');

        //     // 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();
    
    
        return redirect('register');

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

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

}
