package com.etiennelawlor.loop.activities;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.View;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.FrameLayout;

import com.etiennelawlor.loop.R;
import com.etiennelawlor.loop.models.AccessToken;
import com.etiennelawlor.loop.network.ServiceGenerator;
import com.etiennelawlor.loop.network.VimeoService;
import com.etiennelawlor.loop.network.interceptors.UnauthorizedNetworkInterceptor;
import com.etiennelawlor.loop.network.models.response.AuthorizedUser;
import com.etiennelawlor.loop.network.models.response.OAuthResponse;
import com.etiennelawlor.loop.prefs.LoopPrefs;
import com.etiennelawlor.loop.utilities.NetworkLogUtility;
import com.etiennelawlor.loop.utilities.NetworkUtility;

import butterknife.BindView;
import butterknife.ButterKnife;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

/**
 * Created by etiennelawlor on 6/13/15.
 */
public class LoginActivity extends AppCompatActivity {

    // region Views
    @BindView(R.id.wv)
    WebView webView;
    @BindView(R.id.fl)
    FrameLayout frameLayout;
    // endregion

    // region Member Variables
    private VimeoService vimeoService;

    private WebViewClient webViewClient = new WebViewClient() {
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            Uri uri = Uri.parse(url);

            String code = uri.getQueryParameter("code");
            String state = uri.getQueryParameter("state");
            if(!TextUtils.isEmpty(code)
                && !TextUtils.isEmpty(state)
                && state.equals(getString(R.string.vimeo_state))) {

                frameLayout.setVisibility(View.VISIBLE);

                Call exchangeCodeCall = vimeoService.exchangeCode("authorization_code",
                        code,
                        getString(R.string.client_redirect_uri));
                exchangeCodeCall.enqueue(exchangeCodeCallback);
            }


            return super.shouldOverrideUrlLoading(view, url);
        }
    };
    // endregion

    // region Callbacks
    private Callback<OAuthResponse> exchangeCodeCallback = new Callback<OAuthResponse>() {
        @Override
        public void onResponse(Call<OAuthResponse> call, Response<OAuthResponse> response) {

            if (!response.isSuccessful()) {
                int responseCode = response.code();
                if(responseCode == 504) { // 504 Unsatisfiable Request (only-if-cached)
//                    errorTextView.setText("Can't load data.\nCheck your network connection.");
//                    errorLinearLayout.setVisibility(View.VISIBLE);
                }
                return;
            }

            OAuthResponse oAuthResponse = response.body();
            if (oAuthResponse != null) {
                String accessToken = oAuthResponse.getAccessToken();
                String tokenType = oAuthResponse.getTokenType();
                AuthorizedUser authorizedUser = oAuthResponse.getUser();

                AccessToken token = new AccessToken(tokenType, accessToken);
                LoopPrefs.saveAccessToken(getApplicationContext(), token);
                LoopPrefs.saveAuthorizedUser(getApplicationContext(), authorizedUser);

                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                startActivity(intent);
                finish();
            }
        }

        @Override
        public void onFailure(Call<OAuthResponse> call, Throwable t) {
            NetworkLogUtility.logFailure(call, t);

            if (!call.isCanceled()){
                if(NetworkUtility.isKnownException(t)){
//                errorTextView.setText("Can't load data.\nCheck your network connection.");
//                errorLinearLayout.setVisibility(View.VISIBLE);
                }
            }
        }
    };
    // endregion

    // region Lifecycle Methods
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        ButterKnife.bind(this);

        vimeoService = ServiceGenerator.createService(
                VimeoService.class,
                VimeoService.BASE_URL,
                new UnauthorizedNetworkInterceptor(this));

        WebSettings webSettings = webView.getSettings();
        webSettings.setJavaScriptEnabled(true);
        webSettings.setDomStorageEnabled(true);
        webSettings.setLoadWithOverviewMode(true);
        webSettings.setBuiltInZoomControls(true);
        webSettings.setSupportZoom(true);
        webSettings.setUseWideViewPort(true);

        webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
        webView.setWebViewClient(webViewClient);

        webView.loadUrl(setUpUrl());
    }
    // endregion

    // region Helper Methods
    private String setUpUrl() {
        String authroizeUrl = getString(R.string.authorize_url);
        String webLoginClientId = getString(R.string.client_id);
        String redirectUri = getString(R.string.client_redirect_uri);
        String scope = TextUtils.join(" ", getResources().getStringArray(R.array.scopes));
        String state = getString(R.string.vimeo_state);

        String url =
                String.format("%s?client_id=%s&response_type=code&redirect_uri=%s&state=%s&scope=%s",
                        authroizeUrl,
                        webLoginClientId,
                        redirectUri,
                        state,
                        scope);

        return url;
    }
    // endregion
}