package com.nitsilchar.hp.passwordStorage.activity;

import android.content.Context;
import android.content.Intent;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.crashlytics.android.Crashlytics;
import com.google.android.gms.tasks.OnCompleteListener;
import com.google.android.gms.tasks.Task;
import com.google.firebase.FirebaseNetworkException;
import com.google.firebase.auth.AuthResult;
import com.google.firebase.auth.FirebaseAuth;
import com.google.firebase.auth.FirebaseAuthUserCollisionException;
import com.google.firebase.auth.FirebaseUser;
import com.nitsilchar.hp.passwordStorage.model.AppStatus;
import com.nitsilchar.hp.passwordStorage.R;

import io.fabric.sdk.android.Fabric;

public class RegistrationActivity extends AppCompatActivity implements View.OnClickListener {

    Button register;
    Button existinguser;
    String str_Password, str_RePassword, str_Email;
    EditText edt_Password, edt_RePassword, edt_Email;
    private ProgressBar progressBar;
    private FirebaseAuth auth;
    AppStatus appStatus;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Fabric.with(this, new Crashlytics());
        setContentView(R.layout.activity_registration);
        auth = FirebaseAuth.getInstance();
        appStatus=new AppStatus(getApplicationContext());
        register = (Button) findViewById(R.id.btn_register);
        existinguser = (Button) findViewById(R.id.existinguser);
        edt_Password = (EditText) findViewById(R.id.edt_Rpassword);
        edt_RePassword = (EditText) findViewById(R.id.edt_RRepassword);
        edt_Email = (EditText) findViewById(R.id.edt_email);
        progressBar=(ProgressBar)findViewById(R.id.progressBar);
        register.setOnClickListener(this);
        existinguser.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        if(v==existinguser) {

            Intent go = new Intent(RegistrationActivity.this, LoginActivity.class);

            startActivity(go);

        }

        if (appStatus.isOnline()) {
            str_Password = edt_Password.getText().toString();
            str_RePassword = edt_RePassword.getText().toString();
            str_Email = edt_Email.getText().toString();
            if (str_Email.length() == 0 & str_Password.length() == 0
                    & str_RePassword.length() == 0) {
                Toast.makeText(getApplicationContext(),
                        R.string.registration_all_fields_mandatory, Toast.LENGTH_LONG)
                        .show();
            } else if (str_Password.length() == 0) {
                Toast.makeText(getApplicationContext(),
                        R.string.registration_enterPass, Toast.LENGTH_LONG).show();
            } else if (str_RePassword.length() == 0) {
                Toast.makeText(getApplicationContext(),
                        R.string.registration_enterRePass, Toast.LENGTH_LONG).show();
            } else if (str_Email.length() == 0) {
                Toast.makeText(getApplicationContext(),
                        R.string.registration_enter_email, Toast.LENGTH_LONG).show();
            } else if (str_Password.contains(str_RePassword) != str_RePassword
                    .contains(str_Password)) {
                Toast.makeText(getApplicationContext(),
                        R.string.registration_pass_notmatch, Toast.LENGTH_LONG)
                        .show();
            }  else {
                progressBar.setVisibility(View.VISIBLE);
                SplashActivity.editor.putString("password", str_RePassword);
                SplashActivity.editor.putString("email", str_Email);
                SplashActivity.editor.commit();

                progressBar.setVisibility(View.VISIBLE);
                auth.createUserWithEmailAndPassword(str_Email, str_Password)
                        .addOnCompleteListener(RegistrationActivity.this, new OnCompleteListener<AuthResult>() {
                            @Override
                            public void onComplete(@NonNull Task<AuthResult> task) {
                                progressBar.setVisibility(View.GONE);
                                if (!task.isSuccessful()) {

                                    try {
                                        throw task.getException();
                                    } catch (FirebaseNetworkException e) {
                                        Toast.makeText(RegistrationActivity.this,
                                                R.string.registration_network_problem,Toast.LENGTH_SHORT).show();
                                    } catch (Exception e) {
                                        Toast.makeText(RegistrationActivity.this,
                                                R.string.registration_error+String.valueOf(task.getException()),Toast.LENGTH_SHORT).show();
                                    }
                                    Toast.makeText(RegistrationActivity.this,
                                            R.string.registration_error+String.valueOf(task.getException()),Toast.LENGTH_SHORT).show();


                                    if (task.getException() instanceof FirebaseAuthUserCollisionException){
                                        Toast.makeText(RegistrationActivity.this,
                                                R.string.registration_email_collision, Toast.LENGTH_LONG).show();
                                    }
                                } else {
                                    Toast.makeText(RegistrationActivity.this,
                                            R.string.registration_check_email_verify, Toast.LENGTH_LONG).show();
                                    sendVerificationEmail();
                                }
                            }
                        });
            }
        } else {
            Toast.makeText(getApplicationContext(),R.string.appstatus_no_connection,Toast.LENGTH_LONG).show();
        }
    }
   private void sendVerificationEmail(){
        FirebaseUser user=FirebaseAuth.getInstance().getCurrentUser();
        user.sendEmailVerification().addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()){
                    Intent sendtoLogin = new Intent(getApplicationContext(),
                            LoginRegistrationActivity.class);
                    startActivity(sendtoLogin);
                }
            }
        });
    }

    @Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (keyCode == KeyEvent.KEYCODE_BACK) {
            Intent intent = new Intent(RegistrationActivity.this, SplashActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
            intent.putExtra("EXIT", true);
            startActivity(intent);
        }
        return super.onKeyDown(keyCode, event);
    }
    @Override
    protected void onResume() {
        super.onResume();
        progressBar.setVisibility(View.GONE);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN) {
            View v = getCurrentFocus();
            if ( v instanceof EditText) {
                Rect outRect = new Rect();
                v.getGlobalVisibleRect(outRect);
                if (!outRect.contains((int)event.getRawX(), (int)event.getRawY())) {
                    v.clearFocus();
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), 0);
                }
            }
        }
        return super.dispatchTouchEvent( event );
    }
}