<?php

use Support\Exceptions\UserExistsException;
use AdamWathan\EloquentOAuth\Exceptions\ApplicationRejectedException;
use AdamWathan\EloquentOAuth\Exceptions\InvalidAuthorizationCodeException;

class OAuthController extends \BaseController {

    public function __construct()
    {
        $this->beforeFilter('@checkProvider');
    }

    public function checkProvider($route)
    {
        $edition = Contest::getEdition();

        $available_providers = array_keys(Config::get("eloquent-oauth-l4::providers"));

        if (!in_array($route->getParameter('provider'), $available_providers)) {
            return App::abort(404);
        }
    }

    public function originalUrl()
    {
        return Session::get('oauth.pre-auth-url', URL::to('/'));
    }

    public function authorize($provider)
    {
        Session::put('oauth.pre-auth-url', URL::previous());

        return Social::authorize($provider);
    }

    public function login($provider)
    {
        try
        {
            Social::login($provider, function(&$user, $details) use($provider)
            {
                $id_slug = "{$provider}_id";

                $exists = Voter::where($id_slug, $details->id)
                               ->orderBy($id_slug, 'desc') // Prefer those with provider set
                               ->first();

                if ($exists)
                {
                    $user = $exists;
                }

                $user->email = $details->email;
                $user->$id_slug = $details->id;

                $user->name = $details->full_name;

                $user->save();
            });
        }
        catch (ApplicationRejectedException $e)
        {
            return Redirect::to($this->originalUrl())->withErrors(array(
                'login' => trans("validation.custom-errors.oauth.rejected-$provider"),
            ));
        }
        catch (InvalidAuthorizationCodeException $e)
        {
            return Redirect::to($this->originalUrl())->withErrors(array(
                'login' => trans("validation.custom-errors.oauth.invalid"),
            ));
        }
        catch (UserExistsException $e)
        {
            return Redirect::to($this->originalUrl())->withErrors(array(
                'login' => trans("validation.custom-errors.oauth.exists"),
            ));
        }

        return Redirect::to($this->originalUrl());
    }
}
