package com.borjabolufer.elevate;

import android.content.Intent;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Patterns;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;

import com.borjabolufer.elevate.model.UsuarioDbHelper;

public class RegisterActivity extends AppCompatActivity {

    private EditText editNombre, editEmail, editPassword, editConfirmPassword;
    private Button btnRegister;
    private TextView textIrLogin;

    private UsuarioDbHelper dbHelper;

    public static final String EXTRA_NOMBRE = "com.borjabolufer.elevate.EXTRA_NOMBRE";
    public static final String EXTRA_EMAIL = "com.borjabolufer.elevate.EXTRA_EMAIL";
    public static final String EXTRA_PASSWORD = "com.borjabolufer.elevate.EXTRA_PASSWORD";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_register);

        initializeViews();
        dbHelper = new UsuarioDbHelper(this);
        setupListeners();
    }

    private void initializeViews() {
        editNombre = findViewById(R.id.editNombre);
        editEmail = findViewById(R.id.editEmail);
        editPassword = findViewById(R.id.editPassword);
        editConfirmPassword = findViewById(R.id.editConfirmPassword);
        btnRegister = findViewById(R.id.btnCrearCuenta);
        textIrLogin = findViewById(R.id.textIrLogin);
    }

    private void setupListeners() {
        btnRegister.setOnClickListener(v -> attemptRegistration());

        textIrLogin.setOnClickListener(v -> {
            startActivity(new Intent(this, LoginActivity.class));
            finish();
        });
    }

    private void attemptRegistration() {
        clearErrors();

        String nombreCompleto = editNombre.getText().toString().trim();
        String email = editEmail.getText().toString().trim();
        String password = editPassword.getText().toString();
        String confirmPassword = editConfirmPassword.getText().toString();

        if (!validateInputs(nombreCompleto, email, password, confirmPassword)) {
            return;
        }

        Toast.makeText(this, "Datos correctos, configurando tu perfil...", Toast.LENGTH_SHORT).show();

        Intent intent = new Intent(this, PreguntasActivity.class);
        intent.putExtra(EXTRA_NOMBRE, nombreCompleto);
        intent.putExtra(EXTRA_EMAIL, email);
        intent.putExtra(EXTRA_PASSWORD, password);
        startActivity(intent);
        finish();
    }

    private void clearErrors() {
        editNombre.setError(null);
        editEmail.setError(null);
        editPassword.setError(null);
        editConfirmPassword.setError(null);
    }

    private boolean validateInputs(String nombre, String email, String password, String confirmPassword) {
        boolean isValid = true;
        EditText focusView = null;

        if (!password.equals(confirmPassword)) {
            editConfirmPassword.setError("Las contraseñas no coinciden");
            focusView = editConfirmPassword;
            isValid = false;
        }

        if (TextUtils.isEmpty(password)) {
            editPassword.setError("Este campo es requerido");
            focusView = editPassword;
            isValid = false;
        } else if (password.length() < 6) {
            editPassword.setError("La contraseña debe tener al menos 6 caracteres");
            focusView = editPassword;
            isValid = false;
        }

        if (TextUtils.isEmpty(email)) {
            editEmail.setError("Este campo es requerido");
            focusView = editEmail;
            isValid = false;
        } else if (!isValidEmail(email)) {
            editEmail.setError("Este email no es válido");
            focusView = editEmail;
            isValid = false;
        } else if (dbHelper.checkUserEmailExists(email)) {
            editEmail.setError("Este email ya está registrado");
            focusView = editEmail;
            isValid = false;
        }

        if (TextUtils.isEmpty(nombre)) {
            editNombre.setError("Este campo es requerido");
            focusView = editNombre;
            isValid = false;
        } else if (nombre.length() < 2) {
            editNombre.setError("El nombre debe tener al menos 2 caracteres");
            focusView = editNombre;
            isValid = false;
        } else if (!isValidName(nombre)) {
            editNombre.setError("El nombre solo puede contener letras y espacios");
            focusView = editNombre;
            isValid = false;
        }

        if (focusView != null) {
            focusView.requestFocus();
        }

        return isValid;
    }

    private boolean isValidEmail(CharSequence target) {
        return (!TextUtils.isEmpty(target) && Patterns.EMAIL_ADDRESS.matcher(target).matches());
    }

    private boolean isValidName(String name) {
        return name.matches("^[a-zA-ZáéíóúüñÁÉÍÓÚÜÑ\\s'-]+$");
    }

    @Override
    protected void onDestroy() {
        if (dbHelper != null) {
            dbHelper.close();
        }
        super.onDestroy();
    }
}