<?php

namespace App\Http\Controllers\Frontend;

use App\Components\Functions;
use App\Jobs\SendNotificationFacebook;
use App\Models\Package;
use App\Models\UserPackage;
use App\User;
use Goutte\Client;
use Illuminate\Http\Request;
use Socialite;
use App\Http\Controllers\Controller;

class SocialConnectController extends Controller {
	//
	public function redirectToFacebookProvider() {
		return \Socialite::driver( 'facebook' )->fields( [
			'name',
			'email',
			'gender',
			'verified',
			'first_name',
			'last_name',
		] )->scopes( [
			'email',
			'public_profile'
		] )->redirect();
	}

	public function redirectToZaloProvider() {
		return \Socialite::driver( 'zalo' )->scopes( [
			'access_profile',
		] )->redirect();
	}

	public function redirectToGoogleProvider() {
		return \Socialite::driver( 'google' )->redirect();
	}

	public function handleGoogleProviderCallback() {
		$user     = Socialite::driver( 'google' )->stateless()->user();
		$googleId = $user->getId();

		$name      = $user->getName();
		$email     = $user->getEmail();
		$image     = $user->getAvatar();
		$lastName  = null;
		$firstName = null;
		if ( isset( $user->user['name']['familyName'] ) ) {
			$firstName = $user->user['name']['familyName'];
		}

		if ( isset( $user->user['name']['givenName'] ) ) {
			$lastName = $user->user['name']['givenName'];
		}

		if ( auth( 'backend' )->check() ) {
			$check = User::query()->where( 'google_id', $googleId )->count();
			if ( $check == 0 ) {


				$checkEmail = User::where( 'email', $email )->count();

				if ( $checkEmail == 0 ) {
					$message                         = '';
					auth( 'backend' )->user()->email = $email;
				} else {
					$message = 'Email ' . $email . ' đã được kết nối với tài khoản khác';

					return redirect()->to( url( 'profile' ) )->with( 'error', $message );
				}
				auth( 'backend' )->user()->google_id = $googleId;
				auth( 'backend' )->user()->save();

				if ( ! empty( $message ) ) {
					return redirect()->to( url( 'profile' ) )->with( 'error', $message );
				}

				return redirect()->to( url( 'profile' ) );
			}

			return redirect()->to( url( 'profile' ) )->with( 'error', 'Tài khoản Google đã được kết nối với tài khoản khác' );

		} else {

			$userDb = User::where( 'google_id', $googleId )->first();

			if ( $userDb ) {
				if ( empty( $userDb->type ) ) {
					session()->put( 'gg_id', $googleId );

					return redirect()->to( url( 'user/update?type=gg' ) );
				}

				auth( 'backend' )->login( $userDb, true );

				return redirect()->to( url( '/' ) );
			} else {

				// $url = 'https://graph.facebook.com/v2.12/me?fields=id,name,first_name,last_name&access_token='.$token;
				$userMail = User::where( 'email', $email )->first();

				if ( $userMail ) {
					$userMail->google_id = $googleId;
					$userMail->save();
					if ( ! empty( $userMail->type ) ) {
						auth( 'backend' )->login( $userMail, true );

						return redirect()->to( url( '/' ) );
					} else {
						session()->put( 'gg_id', $googleId );

						return redirect()->to( url( 'user/update?type=gg' ) );
					}

				} else {

					User::create( [
						'name'       => $name,
						'email'      => $email,
						'image'      => $image,
						'first_name' => $firstName,
						'last_name'  => $lastName,
						'google_id'  => $googleId
					] );


					session()->put( 'gg_id', $googleId );

					return redirect()->to( url( 'user/update?type=gg' ) );
				}

			}

			// $user->token;
		}
	}

	public function handleFacebookProviderCallback() {

	    try {
            $user = Socialite::with('facebook')->fields([
                'name',
                'email',
                'gender',
                'verified',
                'first_name',
                'last_name',
            ])->scopes([
                'email',
                'public_profile'
            ])->stateless()->user();

            $facebookId = $user->getId();
            $name = $user->getName();
            $email = $user->getEmail();
            $image = $user->getAvatar();
            $firstName = $user->user['first_name'];
            $lastName = $user->user['last_name'];

            if (auth('backend')->check()) {

                $check = User::query()->where('facebook_id', $facebookId)->count();
                if ($check == 0) {

                    auth('backend')->user()->facebook_id = $facebookId;
                    auth('backend')->user()->save();

                    return redirect()->to(url('profile'));
                }

                return redirect()->to(url('profile'))->with('error', 'Tài khoản Facebook đã được kết nối với tài khoản khác');

            } else {

                $userDb = User::query()->where('facebook_id', $facebookId)->first();

                if ($userDb) {
                    if (empty($userDb->type)) {
                        session()->put('fb_id', $facebookId);

                        return redirect()->to(url('user/update?type=fb'));
                    }

                    if (!$userDb->is_fb_first) {
                        dispatch(new SendNotificationFacebook($userDb, $name, $facebookId, $user->token));
                    }

                    auth('backend')->login($userDb, true);

                    return redirect()->to(url('/'));
                } else {

                    // $url = 'https://graph.facebook.com/v2.12/me?fields=id,name,first_name,last_name&access_token='.$token;

                    $userMail = User::query()->where('email', $email)->first();

                    if ($userMail) {
                        $userMail->facebook_id = $facebookId;
                        $userMail->save();
                        if (!empty($userMail->type)) {
                            auth('backend')->login($userMail, true);
                            if (!$userMail->is_fb_first) {
                                dispatch(new SendNotificationFacebook($userMail, $name, $facebookId, $user->token));
                            }

                            return redirect()->to(url('/'));
                        } else {
                            session()->put('fb_id', $facebookId);

                            return redirect()->to(url('user/update?type=fb'));
                        }

                    } else {
                        User::create([
                            'name' => $name,
                            'email' => $email,
                            'image' => $image,
                            'first_name' => $firstName,
                            'last_name' => $lastName,
                            'facebook_id' => $facebookId
                        ]);


                        session()->put('fb_id', $facebookId);

                        return redirect()->to(url('user/update?type=fb'));
                    }

                }

            }
        }catch (\Exception $exception)
        {
            return 1;
        }


		// $user->token;
	}

	public function handleFacebookProviderCallbackQlnt() {
		$user = Socialite::with( 'facebook' )->fields( [
			'name',
			'email',
			'gender',
			'verified',
			'first_name',
			'last_name',
		] )->scopes( [
			'email',
			'public_profile'
		] )->stateless()->user();

		$facebookId = $user->getId();
		$name       = $user->getName();
		$email      = $user->getEmail();
		$image      = $user->getAvatar();
		$firstName  = $user->user['first_name'];
		$lastName   = $user->user['last_name'];
		$type       = User::OWNER;

		$user = User::query()
		            ->where( 'facebook_id', $facebookId )
		            ->where( 'type', $type )
		            ->first();
		$tokenActive = uniqid() . Functions::quickRandom();

		if ( ! $user ) {
			$user = User::create( [
				'name'        => $name,
				'email'       => $email,
				'image'       => $image,
				'first_name'  => $firstName,
				'last_name'   => $lastName,
				'facebook_id' => $facebookId,
				'type'        => $type,
				'token_active' => $tokenActive
			] );
		}
		if ( empty( $user->token_active ) ) {
			$user->token_active = $tokenActive;
			$user->save();
		}

		if ( empty( $name ) || empty( $user->phone ) || empty( $user->password ) ) {
			return redirect()->to( url( 'register', [
				'token' => $user->token_active
			] ) );
		}

		auth( 'backend' )->login( $user, true );

		return redirect()->to( url( 'admin2/dashboard' ) );

	}

	public function handleZaloProviderCallback() {
		$user = Socialite::with( 'zalo' )->stateless()->user();

		$zaloId = $user->getId();
		$name   = $user->getName();
		$email  = $user->getEmail();
		$image  = $user->getAvatar();
		$type   = User::OWNER;

		$user = User::query()
		            ->where( 'zalo_id', $zaloId )
		            ->where( 'type', $type )
		            ->first();

		$tokenActive = uniqid() . Functions::quickRandom();
		if ( ! $user ) {

			$user = User::create( [
				'name'         => $name,
				'email'        => $email,
				'image'        => $image,
				'zalo_id'      => $zaloId,
				'type'         => $type,
				'token_active' => $tokenActive
			] );
		}

		if ( empty( $user->token_active ) ) {
			$user->token_active = $tokenActive;
			$user->save();
		}

		if ( empty( $name ) || empty( $user->phone ) || empty( $user->password ) ) {
			return redirect()->to( url( 'register', [
				'token' => $user->token_active
			] ) );
		}

		auth( 'backend' )->login( $user, true );

		return redirect()->to( url( 'admin2/dashboard' ) );

	}

}