package com.borjabolufer.elevate.ui.fragments;

import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentTransaction;

import com.borjabolufer.elevate.R;
import com.borjabolufer.elevate.model.Usuario;

import java.io.Serializable;

public class ResumenFragment extends Fragment {
    private static final String ARG_USUARIO = "usuario";
    private static final String ARG_NOMBRE_USUARIO = "nombre_usuario";
    private static final String ARG_CONTRASENA_USUARIO = "contrasena_usuario";
    private static final String TAG = "ResumenFragment";

    private Usuario usuario;
    private String nombreUsuario;
    private String contrasenaUsuario;

    private TextView tvResumen;
    private Button btnGuardarPerfil;

    public ResumenFragment() {
          
    }

    public static ResumenFragment newInstance(Usuario usuario, String nombreUsuario, String contrasenaUsuario) {
        ResumenFragment fragment = new ResumenFragment();
        Bundle args = new Bundle();
        args.putSerializable(ARG_USUARIO, (Serializable) usuario);
        args.putString(ARG_NOMBRE_USUARIO, nombreUsuario);
        args.putString(ARG_CONTRASENA_USUARIO, contrasenaUsuario);
        fragment.setArguments(args);
        Log.d("ResumenFragment_newInstance", "newInstance llamado con usuario: " + (usuario == null ? "null" : "OK") +
                ", nombreUsuario: " + nombreUsuario +
                ", contrasenaUsuario: " + (contrasenaUsuario == null ? "null" : "Presente"));
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            Log.d(TAG, "onCreate: Cargando argumentos del Bundle.");
            if (getArguments().containsKey(ARG_USUARIO)) {
                usuario = (Usuario) getArguments().getSerializable(ARG_USUARIO);
                Log.d(TAG, "onCreate: usuario cargado: " + (usuario == null ? "null" : "OK"));
            } else {
                Log.w(TAG, "onCreate: No se encontró la clave ARG_USUARIO en los argumentos.");
            }

            if (getArguments().containsKey(ARG_NOMBRE_USUARIO)) {
                nombreUsuario = getArguments().getString(ARG_NOMBRE_USUARIO);
                Log.d(TAG, "onCreate: nombreUsuario cargado: " + nombreUsuario);
            } else {
                Log.w(TAG, "onCreate: No se encontró la clave ARG_NOMBRE_USUARIO en los argumentos.");
            }

            if (getArguments().containsKey(ARG_CONTRASENA_USUARIO)) {
                contrasenaUsuario = getArguments().getString(ARG_CONTRASENA_USUARIO);
                Log.d(TAG, "onCreate: contrasenaUsuario cargada: " + (contrasenaUsuario == null ? "null" : "Presente"));
            } else {
                Log.w(TAG, "onCreate: No se encontró la clave ARG_CONTRASENA_USUARIO en los argumentos.");
            }
        } else {
            Log.e(TAG, "onCreate: ¡getArguments() es null! No se pasaron argumentos al fragmento.");
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_resumen, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        tvResumen = view.findViewById(R.id.tvResumen);
        btnGuardarPerfil = view.findViewById(R.id.btnGuardarPerfil);

        mostrarDatosUsuario(view);

          
        btnGuardarPerfil.setOnClickListener(v -> {
            if (validarDatos()) {
                navegarALoadingPlan();
            } else {
                Toast.makeText(getContext(), "Faltan datos esenciales para generar el plan.", Toast.LENGTH_LONG).show();
            }
        });
    }

    private boolean validarDatos() {
        return usuario != null &&
                nombreUsuario != null && !nombreUsuario.isEmpty() &&
                contrasenaUsuario != null && !contrasenaUsuario.isEmpty();
    }

    private void navegarALoadingPlan() {
        try {
              
            LoadingPlanFragment loadingFragment = LoadingPlanFragment.newInstance(
                    usuario,
                    nombreUsuario,
                    contrasenaUsuario
            );

              
            FragmentTransaction transaction = getParentFragmentManager().beginTransaction();

              
            transaction.setCustomAnimations(
                    R.anim.slide_in_right,    
                    R.anim.slide_out_left,    
                    R.anim.slide_in_left,     
                    R.anim.slide_out_right    
            );

            transaction.replace(R.id.fragmentContainerViewPreguntas, loadingFragment);
            transaction.addToBackStack(null);
            transaction.commit();

            Log.d(TAG, "Navegando al LoadingPlanFragment");

        } catch (Exception e) {
            Log.e(TAG, "Error al navegar al LoadingPlanFragment", e);
            Toast.makeText(getContext(), "Error al iniciar la generación del plan", Toast.LENGTH_SHORT).show();
        }
    }

    private void mostrarDatosUsuario(View view) {
        if (usuario != null) {
              
            String alturaStr = (usuario.getAltura() != null)
                    ? String.valueOf((int)usuario.getAltura().getAltura()) : "N/A";
            String pesoStr = (usuario.getPeso() != null)
                    ? String.valueOf((int)usuario.getPeso().getPeso()) : "N/A";
            String edadStr = (usuario.getEdad() != null)
                    ? String.valueOf(usuario.getEdad().getEdad()) : "N/A";
            String sexoStr = (usuario.getSexo() != null && usuario.getSexo().getSexo() != null)
                    ? usuario.getSexo().getSexo() : "N/A";
            String intensidadStr = (usuario.getIntensidad() != null && usuario.getIntensidad().getIntensidad() != null)
                    ? usuario.getIntensidad().getIntensidad() : "N/A";
            String objetivoStr = (usuario.getObjetivo() != null && usuario.getObjetivo().getObjetivo() != null)
                    ? usuario.getObjetivo().getObjetivo() : "N/A";
            String diasStr = (usuario.getDias() != null)
                    ? String.valueOf(usuario.getDias().getCantidad()) : "N/A";

              
            TextView tvAlturaValue = view.findViewById(R.id.tvAlturaValue);
            TextView tvPesoValue = view.findViewById(R.id.tvPesoValue);
            TextView tvEdadValue = view.findViewById(R.id.tvEdadValue);
            TextView tvSexoValue = view.findViewById(R.id.tvSexoValue);
            TextView tvObjetivoValue = view.findViewById(R.id.tvObjetivoValue);
            TextView tvIntensidadValue = view.findViewById(R.id.tvIntensidadValue);
            TextView tvDiasValue = view.findViewById(R.id.tvDiasValue);

            if (tvAlturaValue != null) tvAlturaValue.setText(alturaStr + " cm");
            if (tvPesoValue != null) tvPesoValue.setText(pesoStr + " kg");
            if (tvEdadValue != null) tvEdadValue.setText(edadStr + " años");
            if (tvSexoValue != null) tvSexoValue.setText(sexoStr);
            if (tvObjetivoValue != null) tvObjetivoValue.setText(objetivoStr);
            if (tvIntensidadValue != null) tvIntensidadValue.setText(intensidadStr);
            if (tvDiasValue != null) tvDiasValue.setText(diasStr + " días/semana");

              
            String resumenText = "📊 Resumen de tu perfil:\n\n" +
                    "• Altura: " + alturaStr + " cm\n" +
                    "• Peso: " + pesoStr + " kg\n" +
                    "• Edad: " + edadStr + " años\n" +
                    "• Sexo: " + sexoStr + "\n" +
                    "• Objetivo: " + objetivoStr + "\n" +
                    "• Intensidad: " + intensidadStr + "\n" +
                    "• Días de Entrenamiento: " + diasStr + " días/semana\n\n" +
                    "🚀 Tu plan será generado basado en estos datos.";

            if (tvResumen != null) {
                tvResumen.setText(resumenText);
            }

            Log.d(TAG, "Datos del usuario mostrados correctamente");
        } else {
            if (tvResumen != null) {
                tvResumen.setText("❌ No se han proporcionado datos del usuario.");
            }
            Log.w(TAG, "No hay datos de usuario para mostrar");
        }
    }

      

    public Usuario getUsuario() {
        return usuario;
    }

    public String getNombreUsuario() {
        return nombreUsuario;
    }

    public boolean tieneInformacionCompleta() {
        return validarDatos() &&
                usuario.getAltura() != null &&
                usuario.getPeso() != null &&
                usuario.getEdad() != null &&
                usuario.getSexo() != null &&
                usuario.getObjetivo() != null &&
                usuario.getIntensidad() != null &&
                usuario.getDias() != null;
    }

    public String obtenerResumenTexto() {
        if (!tieneInformacionCompleta()) {
            return "Información incompleta";
        }

        return String.format(
                "Perfil: %s, %d años, %.0f cm, %.0f kg | Objetivo: %s | Intensidad: %s | %d días/semana",
                usuario.getSexo().getSexo(),
                usuario.getEdad().getEdad(),
                usuario.getAltura().getAltura(),
                usuario.getPeso().getPeso(),
                usuario.getObjetivo().getObjetivo(),
                usuario.getIntensidad().getIntensidad(),
                usuario.getDias().getCantidad()
        );
    }
}