package com.example.massa.luxvilla.Actividades;

import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.design.widget.TextInputLayout;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.app.AppCompatDelegate;
import android.support.v7.widget.AppCompatButton;
import android.text.TextUtils;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.example.massa.luxvilla.R;
import com.example.massa.luxvilla.utils.mailcheck;
import com.google.android.gms.auth.api.Auth;
import com.google.android.gms.auth.api.signin.GoogleSignInAccount;
import com.google.android.gms.auth.api.signin.GoogleSignInOptions;
import com.google.android.gms.auth.api.signin.GoogleSignInResult;
import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.SignInButton;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.auth.AuthCredential;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthException;
import com.google.firebase.auth.FirebaseUser;
import com.google.firebase.auth.GoogleAuthProvider;

public class Loginactivity extends AppCompatActivity {

    SharedPreferences sharedPreferencesapp;
    LinearLayout linearLayout;
    TextInputLayout textInputLayoutmail, textInputLayoutpassword;
    EditText email, password;
    AppCompatButton btnsigin,btnsugup;
    LinearLayout layoutprogressbar;
    SignInButton signInButton;

    FirebaseAuth firebaseAuth;
    FirebaseUser user;

    private GoogleApiClient mGoogleApiClient;
    private static final int RC_SIGN_IN = 9001;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        setTheme(R.style.login);
        sharedPreferencesapp= PreferenceManager.getDefaultSharedPreferences(Loginactivity.this);
        boolean nightmode=sharedPreferencesapp.getBoolean(getResources().getString(R.string.night_mode),false);
        if (nightmode){
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_YES);
        }else{
            AppCompatDelegate.setDefaultNightMode(AppCompatDelegate.MODE_NIGHT_NO);
        }
        super.onCreate(savedInstanceState);

        user=FirebaseAuth.getInstance().getCurrentUser();
        if (user !=null){
            startActivity(new Intent(Loginactivity.this,MainActivity.class));
            finish();
            return;
        }
        setContentView(R.layout.activity_loginactivity);

        firebaseAuth=FirebaseAuth.getInstance();

        linearLayout= findViewById(R.id.linearLayoutsignin);
        textInputLayoutmail= findViewById(R.id.text_input_mail);
        textInputLayoutpassword= findViewById(R.id.text_input_password);
        email= findViewById(R.id.edittextmail);
        password= findViewById(R.id.edittextpassword);
        btnsigin= findViewById(R.id.loginbutton);
        btnsugup= findViewById(R.id.signupbutton);
        signInButton= findViewById(R.id.googlesignin);

        layoutprogressbar= findViewById(R.id.linearLayoutprogressbar);

        btnsigin.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if (TextUtils.isEmpty(email.getText().toString().trim())){
                    textInputLayoutmail.setError("Introduza um email.");
                    return;
                }

                if (!mailcheck.isEmailValid(email.getText().toString().trim())){
                    textInputLayoutmail.setError("Indereço de email inválido.");
                    return;
                }else {
                    textInputLayoutmail.setError("");
                }

                if (TextUtils.isEmpty(password.getText().toString().trim())){
                    textInputLayoutpassword.setError("Introduza uma password.");
                    return;
                }


                linearLayout.setVisibility(View.GONE);
                layoutprogressbar.setVisibility(View.VISIBLE);

                firebaseAuth.signInWithEmailAndPassword(email.getText().toString().trim(),
                        password.getText().toString().trim()).addOnSuccessListener(new OnSuccessListener<AuthResult>() {
                    @Override
                    public void onSuccess(AuthResult authResult) {
                        startActivity(new Intent(Loginactivity.this,MainActivity.class));
                        finish();
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {

                        linearLayout.setVisibility(View.VISIBLE);
                        layoutprogressbar.setVisibility(View.GONE);

                        if (e instanceof FirebaseAuthException) {
                            String errorcode=((FirebaseAuthException) e).getErrorCode();

                            if (errorcode.equals("ERROR_WRONG_PASSWORD")){
                                textInputLayoutpassword.setError("Password incorreta.");
                            }

                            if (errorcode.equals("ERROR_USER_NOT_FOUND")){
                                Snackbar.make(linearLayout,"Utilizador não encontrado.", Snackbar.LENGTH_LONG).show();
                            }
                        }
                    }
                });
            }
        });

        btnsugup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                startActivity(new Intent(Loginactivity.this,Signupactivity.class));
            }
        });

        TextView signinbuttontext=(TextView)signInButton.getChildAt(0);
        signinbuttontext.setText("Login com Google");

        GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestIdToken(getString(R.string.default_web_client_id))
                .requestEmail()
                .build();

        mGoogleApiClient = new GoogleApiClient.Builder(this)
                .enableAutoManage(this, new GoogleApiClient.OnConnectionFailedListener() {
                    @Override
                    public void onConnectionFailed(@NonNull ConnectionResult connectionResult) {
                        Snackbar.make(linearLayout,"Ocorreu um erro ao conectar", Snackbar.LENGTH_LONG).show();
                    }
                })
                .addApi(Auth.GOOGLE_SIGN_IN_API, gso)
                .build();
        mGoogleApiClient.connect();

        signInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                linearLayout.setVisibility(View.GONE);
                layoutprogressbar.setVisibility(View.VISIBLE);

                Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
                startActivityForResult(signInIntent, RC_SIGN_IN);
            }
        });
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
        if (requestCode == RC_SIGN_IN) {
            GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
            if (result.isSuccess()) {
                // Google Sign In was successful, authenticate with Firebase
                GoogleSignInAccount account = result.getSignInAccount();
                firebaseAuthWithGoogle(account);
            } else {
                linearLayout.setVisibility(View.VISIBLE);
                layoutprogressbar.setVisibility(View.GONE);
                Snackbar.make(linearLayout,"Ocorreu um erro ao conectar", Snackbar.LENGTH_LONG).show();
            }
        }
    }

    private void firebaseAuthWithGoogle(GoogleSignInAccount acct) {
        AuthCredential credential = GoogleAuthProvider.getCredential(acct.getIdToken(), null);
        firebaseAuth.signInWithCredential(credential)
                .addOnCompleteListener(this, new OnCompleteListener<AuthResult>() {
                    @Override
                    public void onComplete(@NonNull Task<AuthResult> task) {
                        // If sign in fails, display a message to the user. If sign in succeeds
                        // the auth state listener will be notified and logic to handle the
                        // signed in user can be handled in the listener.
                        if (!task.isSuccessful()) {
                            Snackbar.make(linearLayout,"Ocorreu um erro ao conectar", Snackbar.LENGTH_LONG).show();
                        } else {
                            startActivity(new Intent(Loginactivity.this, MainActivity.class));
                            finish();
                        }
                    }
                });
    }
}