package com.borjabolufer.elevate;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;

import com.borjabolufer.elevate.model.Altura;
import com.borjabolufer.elevate.model.DiasEntrenamiento;
import com.borjabolufer.elevate.model.Edad;
import com.borjabolufer.elevate.model.Intensidad;
import com.borjabolufer.elevate.model.Objetivo;
import com.borjabolufer.elevate.model.Peso;
import com.borjabolufer.elevate.model.Sexo;
import com.borjabolufer.elevate.model.Usuario;
import com.borjabolufer.elevate.ui.fragments.AlturaFragment;
import com.borjabolufer.elevate.ui.fragments.DiasEntrenamientoFragment;
import com.borjabolufer.elevate.ui.fragments.EdadFragment;
import com.borjabolufer.elevate.ui.fragments.IntensidadFragment;
import com.borjabolufer.elevate.ui.fragments.LoadingPlanFragment;
import com.borjabolufer.elevate.ui.fragments.ObjetivoFragment;
import com.borjabolufer.elevate.ui.fragments.PesoFragment;
import com.borjabolufer.elevate.ui.fragments.ResumenFragment;
import com.borjabolufer.elevate.ui.fragments.SexoFragment;

public class PreguntasActivity extends AppCompatActivity
        implements AlturaFragment.IOnAlturaListener,
        PesoFragment.IOnPesoListener,
        EdadFragment.IOnEdadListener,
        SexoFragment.IOnSexoListener,
        IntensidadFragment.IOnIntensidadListener,
        ObjetivoFragment.IOnObjetivoListener,
        DiasEntrenamientoFragment.IOnDiasEntrenamientoListener {

    private static final String TAG = "PreguntasActivity";

    private Usuario usuario = new Usuario();
    private String nombreCompleto;
    private String emailUsuario;
    private String passwordUsuario;

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

          
        if (!obtenerDatosDelIntent()) {
            return;   
        }

          
        if (savedInstanceState == null) {
            mostrarFragment(new SexoFragment());
        }
    }

    private boolean obtenerDatosDelIntent() {
        Intent intent = getIntent();
        if (intent == null) {
            Log.e(TAG, "Intent nulo");
            mostrarErrorYCerrar("Error: No se recibieron datos para configurar tu perfil.");
            return false;
        }

          
        nombreCompleto = intent.getStringExtra(RegisterActivity.EXTRA_NOMBRE);
        emailUsuario = intent.getStringExtra(RegisterActivity.EXTRA_EMAIL);
        passwordUsuario = intent.getStringExtra(RegisterActivity.EXTRA_PASSWORD);

          
        if (nombreCompleto == null || nombreCompleto.trim().isEmpty()) {
            Log.e(TAG, "Nombre completo no recibido");
            mostrarErrorYCerrar("Error: Falta el nombre completo.");
            return false;
        }

        if (emailUsuario == null || emailUsuario.trim().isEmpty()) {
            Log.e(TAG, "Email no recibido");
            mostrarErrorYCerrar("Error: Falta el email del usuario.");
            return false;
        }

        if (passwordUsuario == null || passwordUsuario.trim().isEmpty()) {
            Log.e(TAG, "Contraseña no recibida");
            mostrarErrorYCerrar("Error: Falta la contraseña del usuario.");
            return false;
        }

          
        Log.d(TAG, "Datos recibidos correctamente:");
        Log.d(TAG, "- Nombre: " + nombreCompleto);
        Log.d(TAG, "- Email: " + emailUsuario);
        Log.d(TAG, "- Password: " + (passwordUsuario != null ? "[PRESENTE]" : "[AUSENTE]"));

        return true;
    }

    private void mostrarErrorYCerrar(String mensaje) {
        Toast.makeText(this, mensaje, Toast.LENGTH_LONG).show();
        finish();
    }

    private void mostrarFragment(Fragment fragment) {
        getSupportFragmentManager()
                .beginTransaction()
                .replace(R.id.fragmentContainerViewPreguntas, fragment)
                .addToBackStack(null)
                .commit();
    }

    @Override
    public void onSexoSelected(Sexo sexo) {
        usuario.setSexo(sexo);
        Log.d(TAG, "Sexo seleccionado: " + sexo.getSexo());
        mostrarFragment(new EdadFragment());
    }

    @Override
    public void onEdadSelected(Edad edad) {
        usuario.setEdad(edad);
        Log.d(TAG, "Edad seleccionada: " + edad.getEdad());
        mostrarFragment(new PesoFragment());
    }

    @Override
    public void onPesoSelected(Peso peso) {
        usuario.setPeso(peso);
        Log.d(TAG, "Peso seleccionado: " + peso.getPeso());
        mostrarFragment(new AlturaFragment());
    }

    @Override
    public void onAlturaSelected(Altura altura) {
        usuario.setAltura(altura);
        Log.d(TAG, "Altura seleccionada: " + altura.getAltura());
        mostrarFragment(new IntensidadFragment());
    }

    @Override
    public void onIntensidadSelected(Intensidad intensidad) {
        usuario.setIntensidad(intensidad);
        Log.d(TAG, "Intensidad seleccionada: " + intensidad.getIntensidad());
        mostrarFragment(new ObjetivoFragment());
    }

    @Override
    public void onObjetivoSelected(Objetivo objetivo) {
        usuario.setObjetivo(objetivo);
        Log.d(TAG, "Objetivo seleccionado: " + objetivo.getObjetivo());
        mostrarFragment(new DiasEntrenamientoFragment());
    }

    @Override
    public void onDiasEntrenamientoSelected(DiasEntrenamiento diasEntrenamiento) {
        usuario.setDias(diasEntrenamiento);
        Log.d(TAG, "Días de entrenamiento seleccionados: " + diasEntrenamiento.getCantidad());

          
        if (!validarUsuarioCompleto()) {
            return;
        }

        Log.d(TAG, "Perfil de usuario completado. Mostrando resumen antes de generar plan.");
        mostrarResumen();
    }

    private boolean validarUsuarioCompleto() {
        StringBuilder errores = new StringBuilder();

        if (usuario.getSexo() == null) errores.append("- Sexo\n");
        if (usuario.getEdad() == null) errores.append("- Edad\n");
        if (usuario.getPeso() == null) errores.append("- Peso\n");
        if (usuario.getAltura() == null) errores.append("- Altura\n");
        if (usuario.getIntensidad() == null) errores.append("- Intensidad\n");
        if (usuario.getObjetivo() == null) errores.append("- Objetivo\n");
        if (usuario.getDias() == null) errores.append("- Días de entrenamiento\n");

        if (errores.length() > 0) {
            Log.e(TAG, "Datos faltantes en el usuario:\n" + errores.toString());
            Toast.makeText(this, "Error: Faltan datos del perfil:\n" + errores.toString(),
                    Toast.LENGTH_LONG).show();
            return false;
        }

        return true;
    }

    private void mostrarResumen() {
        try {
            Log.d(TAG, "=== INICIANDO MOSTRAR RESUMEN ===");

              
            ResumenFragment resumenFragment = ResumenFragment.newInstance(
                    usuario,           
                    emailUsuario,      
                    passwordUsuario    
            );

              
            Log.d(TAG, "Creando ResumenFragment con:");
            Log.d(TAG, "- Usuario completo: " + (usuario != null ? "✓" : "✗"));
            Log.d(TAG, "- Email: " + emailUsuario);
            Log.d(TAG, "- Nombre: " + nombreCompleto);
            Log.d(TAG, "- Datos del usuario:");
            Log.d(TAG, "  * Sexo: " + (usuario.getSexo() != null ? usuario.getSexo().getSexo() : "null"));
            Log.d(TAG, "  * Edad: " + (usuario.getEdad() != null ? usuario.getEdad().getEdad() : "null"));
            Log.d(TAG, "  * Peso: " + (usuario.getPeso() != null ? usuario.getPeso().getPeso() : "null"));
            Log.d(TAG, "  * Altura: " + (usuario.getAltura() != null ? usuario.getAltura().getAltura() : "null"));
            Log.d(TAG, "  * Objetivo: " + (usuario.getObjetivo() != null ? usuario.getObjetivo().getObjetivo() : "null"));
            Log.d(TAG, "  * Intensidad: " + (usuario.getIntensidad() != null ? usuario.getIntensidad().getIntensidad() : "null"));
            Log.d(TAG, "  * Días: " + (usuario.getDias() != null ? usuario.getDias().getCantidad() : "null"));

              
            Log.d(TAG, "Mostrando ResumenFragment...");
            mostrarFragment(resumenFragment);

            Toast.makeText(this, "¡Perfil completo! Revisa tu información antes de continuar.",
                    Toast.LENGTH_SHORT).show();

            Log.d(TAG, "=== RESUMEN MOSTRADO EXITOSAMENTE ===");

        } catch (Exception e) {
            Log.e(TAG, "Error al crear ResumenFragment", e);
            Toast.makeText(this, "Error al mostrar resumen. Inténtalo de nuevo.",
                    Toast.LENGTH_LONG).show();
        }
    }

      
    public void procederAGeneracionDePlan() {
        try {
            Log.d(TAG, "=== PROCEDIENDO A GENERACIÓN DE PLAN ===");
            Log.d(TAG, "Método llamado desde ResumenFragment");

              
            LoadingPlanFragment loadingFragment = LoadingPlanFragment.newInstance(
                    usuario,           
                    emailUsuario,      
                    passwordUsuario    
            );

            Log.d(TAG, "LoadingPlanFragment creado correctamente");

              
            getSupportFragmentManager()
                    .beginTransaction()
                    .replace(R.id.fragmentContainerViewPreguntas, loadingFragment)
                    .commit();   

            Toast.makeText(this, "Generando tu plan personalizado...",
                    Toast.LENGTH_SHORT).show();

            Log.d(TAG, "=== NAVEGACIÓN A LOADING COMPLETADA ===");

        } catch (Exception e) {
            Log.e(TAG, "Error al crear LoadingPlanFragment", e);
            Toast.makeText(this, "Error al generar el plan. Inténtalo de nuevo.",
                    Toast.LENGTH_LONG).show();
        }
    }

    @Override
    public void onBackPressed() {
        int backStackCount = getSupportFragmentManager().getBackStackEntryCount();

        if (backStackCount > 0) {
              
            super.onBackPressed();
        } else {
              
            Toast.makeText(this, "¿Seguro que quieres cancelar la configuración?",
                    Toast.LENGTH_SHORT).show();

              
            super.onBackPressed();
        }
    }

      
    public String getNombreCompleto() {
        return nombreCompleto;
    }

      
    public String getEmailUsuario() {
        return emailUsuario;
    }

      
    public Usuario getUsuario() {
        return usuario;
    }

      
    public String getPasswordUsuario() {
        return passwordUsuario;
    }
}