package com.borjabolufer.elevate.ui.fragments;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Toast;

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

import com.borjabolufer.elevate.R;
import com.borjabolufer.elevate.databinding.FragmentComidaDetalleBinding;
import com.borjabolufer.elevate.model.Comida;
import com.borjabolufer.elevate.model.ValorNutricional;
import com.google.android.material.floatingactionbutton.FloatingActionButton;

import java.util.List;

public class DetalleComidaFragment extends Fragment {

    private static final String TAG = "DetalleComidaFragment";
    private FragmentComidaDetalleBinding binding;
    private Comida comida;
    private String tipoComida;
    private String nombreComida;

    public static DetalleComidaFragment newInstance(Comida comida, String tipo, String nombre) {
        DetalleComidaFragment fragment = new DetalleComidaFragment();
        Bundle args = new Bundle();
        args.putSerializable("comida", comida);
        args.putString("tipo_comida", tipo);
        args.putString("nombre_comida", nombre);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            comida = (Comida) getArguments().getSerializable("comida");
            tipoComida = getArguments().getString("tipo_comida", "");
            nombreComida = getArguments().getString("nombre_comida", "");
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        binding = FragmentComidaDetalleBinding.inflate(inflater, container, false);
        return binding.getRoot();
    }

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

        if (comida != null) {
            configurarUI();
        } else {
            mostrarError();
        }
    }

    private void configurarUI() {
        String titulo = nombreComida != null && !nombreComida.isEmpty() ? nombreComida : comida.getNombre();
        binding.textComidaTitle.setText(titulo);

        configurarIconoComida();

          
        configurarInformacionNutricional();

          
        configurarIngredientes();

          
        configurarReceta();
    }

    private void configurarIconoComida() {
        int iconResource;
        int tintColor;

        switch (tipoComida.toLowerCase()) {
            case "desayuno":
                iconResource = R.drawable.ic_desayuno;
                tintColor = R.color.warning;
                break;
            case "almuerzo":
            case "comida":
                iconResource = R.drawable.ic_comida;
                tintColor = R.color.primary;
                break;
            case "cena":
                iconResource = R.drawable.ic_cena;
                tintColor = R.color.info;
                break;
            case "snack":
            case "snacks":
                iconResource = R.drawable.ic_snack;
                tintColor = R.color.success;
                break;
            default:
                iconResource = R.drawable.ic_restaurante;
                tintColor = R.color.primary;
                break;
        }

        binding.iconComidaDetalle.setImageResource(iconResource);
        binding.iconComidaDetalle.setColorFilter(requireContext().getColor(tintColor));
    }

    private void configurarInformacionNutricional() {
        ValorNutricional vn = comida.getValor_nutricional();

        if (vn != null) {
            binding.textCaloriesValue.setText(vn.getCalorías() + " kcal");
            binding.textProteinsValue.setText(vn.getProteínas() + "g");
            binding.textCarbsValue.setText(vn.getCarbohidratos() + "g");
            binding.textFatsValue.setText(vn.getGrasas() + "g");
        } else {
            binding.textCaloriesValue.setText("-- kcal");
            binding.textProteinsValue.setText("--g");
            binding.textCarbsValue.setText("--g");
            binding.textFatsValue.setText("--g");
        }
    }

    private void configurarIngredientes() {
        List<String> ingredientes = comida.getIngredientes();

        if (ingredientes != null && !ingredientes.isEmpty()) {
            StringBuilder ingredientesTexto = new StringBuilder();

            for (int i = 0; i < ingredientes.size(); i++) {
                ingredientesTexto.append("• ").append(ingredientes.get(i));
                if (i < ingredientes.size() - 1) {
                    ingredientesTexto.append("\n");
                }
            }

            binding.textIngredientsContent.setText(ingredientesTexto.toString());
        } else {
            binding.textIngredientsContent.setText("No se especificaron ingredientes");
        }
    }

    private void configurarReceta() {
        String receta = comida.getReceta();

        if (receta != null && !receta.trim().isEmpty()) {
              
            String recetaFormateada = formatearReceta(receta);
            binding.textRecipeContent.setText(recetaFormateada);
        } else {
            binding.textRecipeContent.setText("No se proporcionaron instrucciones de preparación");
        }
    }

    private String formatearReceta(String receta) {
          
        if (receta == null) return "";

        return receta
                .trim()
                .replaceAll("\\s*\\n\\s*", "\n")    
                .replaceAll("(\\d+\\.)\\s*", "\n$1 ");   
    }



    private void mostrarError() {
        Toast.makeText(getContext(), "Error al cargar la información de la comida", Toast.LENGTH_LONG).show();

          
        if (getParentFragmentManager().getBackStackEntryCount() > 0) {
            getParentFragmentManager().popBackStack();
        }
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }

      

    public Comida getComida() {
        return comida;
    }

    public String getTipoComida() {
        return tipoComida;
    }

    public String getNombreComida() {
        return nombreComida;
    }

      
    public int getCaloriasComida() {
        if (comida != null && comida.getValor_nutricional() != null) {
            return comida.getValor_nutricional().getCalorías();
        }
        return 0;
    }
}