package com.borjabolufer.elevate.ui.fragments;

import android.content.Context;
import android.content.SharedPreferences;
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.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;

import com.borjabolufer.elevate.adapters.ComidaAdapter;
import com.borjabolufer.elevate.databinding.FragmentDietBinding;
import com.borjabolufer.elevate.model.DiasEntrenamiento;
import com.borjabolufer.elevate.model.Dieta;
import com.borjabolufer.elevate.model.Comida;
import com.borjabolufer.elevate.model.ValorNutricional;
import com.borjabolufer.elevate.model.Semana;
import com.borjabolufer.elevate.utils.JsonParser;
import com.borjabolufer.elevate.utils.JsonUtils;
import com.google.android.material.chip.Chip;

import org.json.JSONObject;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

public class DietFragment extends Fragment {

    private FragmentDietBinding binding;
    private JsonParser jsonParser;
    private Semana semanaActual;
    private ComidaAdapter comidaAdapter;
    private List<ComidaItem> comidasList;
    private String diaSeleccionado = obtenerDiaActual();

    public View onCreateView(@NonNull LayoutInflater inflater,
                             ViewGroup container, Bundle savedInstanceState) {
        binding = FragmentDietBinding.inflate(inflater, container, false);
        View root = binding.getRoot();

        inicializarComponentes();
        configurarRecyclerView();
        cargarDatos();
        configurarChipsDias();

        return root;
    }

    private String obtenerDiaActual() {
        String[] diasSemana = {"Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"};
        Calendar calendar = Calendar.getInstance();
        int dia = calendar.get(Calendar.DAY_OF_WEEK);
        return diasSemana[dia - 1];
    }

    private void inicializarComponentes() {
        jsonParser = new JsonParser(getContext());
        comidasList = new ArrayList<>();
    }

    private void cargarDatos() {
        String email = obtenerEmailUsuarioActual();
        if (email == null) {
            Toast.makeText(getContext(), "Usuario no identificado", Toast.LENGTH_SHORT).show();
            return;
        }

        String contenidoJson = JsonUtils.cargarPlanDelUsuario(getContext(), email);
        if (contenidoJson == null) {
            Toast.makeText(getContext(), "No se encontró el plan del usuario", Toast.LENGTH_SHORT).show();
            return;
        }

        JSONObject rawJson;
        try {
            rawJson = new JSONObject(contenidoJson);
        } catch (Exception e) {
            Toast.makeText(getContext(), "Error al procesar el JSON", Toast.LENGTH_SHORT).show();
            return;
        }

        semanaActual = jsonParser.convertirJsonASemana(rawJson);

        if (jsonParser.validarSemana(semanaActual)) {
            cargarDietaDelDia(diaSeleccionado);
        } else {
            Toast.makeText(getContext(), "Error al cargar los datos", Toast.LENGTH_SHORT).show();
        }
    }


    private void configurarRecyclerView() {
          
        comidaAdapter = new ComidaAdapter(comidasList, this);
        binding.recyclerComidas.setLayoutManager(new LinearLayoutManager(getContext()));
        binding.recyclerComidas.setAdapter(comidaAdapter);
    }

    private void configurarChipsDias() {
        String[] diasSemana = {"Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado", "Domingo"};

        for (String dia : diasSemana) {
            Chip chip = new Chip(getContext());
            chip.setText(dia);
            chip.setCheckable(true);
            chip.setChecked(dia.equals(diaSeleccionado));

            chip.setOnCheckedChangeListener((compoundButton, isChecked) -> {
                if (isChecked) {
                    diaSeleccionado = dia;
                    cargarDietaDelDia(dia);
                      
                    for (int i = 0; i < binding.chipGroupDiasDieta.getChildCount(); i++) {
                        Chip otherChip = (Chip) binding.chipGroupDiasDieta.getChildAt(i);
                        if (!otherChip.getText().equals(dia)) {
                            otherChip.setChecked(false);
                        }
                    }
                }
            });

            binding.chipGroupDiasDieta.addView(chip);
        }
    }

    private void cargarDietaDelDia(String dia) {
        DiasEntrenamiento diaEntrenamiento = jsonParser.obtenerDia(semanaActual, dia);

        if (diaEntrenamiento == null || diaEntrenamiento.getDieta() == null) {
            mostrarSinDieta();
            return;
        }

        Dieta dieta = diaEntrenamiento.getDieta();
        comidasList.clear();

          
        int totalCalorias = jsonParser.calcularCaloriasTotales(diaEntrenamiento);
        actualizarResumenNutricional(dieta, totalCalorias);

          
        if (dieta.getDesayuno() != null) {
            comidasList.add(new ComidaItem("Desayuno", dieta.getDesayuno(), "desayuno"));
        }
        if (dieta.getComida() != null) {
            comidasList.add(new ComidaItem("Comida", dieta.getComida(), "comida"));
        }
        if (dieta.getCena() != null) {
            comidasList.add(new ComidaItem("Cena", dieta.getCena(), "cena"));
        }
        if (dieta.getSnacks() != null) {
            comidasList.add(new ComidaItem("Snacks", dieta.getSnacks(), "snacks"));
        }

        comidaAdapter.notifyDataSetChanged();
    }

    private void mostrarSinDieta() {
        binding.textCaloriasTotales.setText("0");
        binding.textProteinas.setText("0g");
        binding.textCarbohidratos.setText("0g");
        binding.textGrasas.setText("0g");

        comidasList.clear();
        comidaAdapter.notifyDataSetChanged();
    }

    private void actualizarResumenNutricional(Dieta dieta, int totalCalorias) {
        int totalProteinas = 0, totalCarbohidratos = 0, totalGrasas = 0;

        ValorNutricional[] valores = {
                dieta.getDesayuno() != null ? dieta.getDesayuno().getValor_nutricional() : null,
                dieta.getComida() != null ? dieta.getComida().getValor_nutricional() : null,
                dieta.getCena() != null ? dieta.getCena().getValor_nutricional() : null,
                dieta.getSnacks() != null ? dieta.getSnacks().getValor_nutricional() : null
        };

        for (ValorNutricional valor : valores) {
            if (valor != null) {
                totalProteinas += valor.getProteínas();
                totalCarbohidratos += valor.getCarbohidratos();
                totalGrasas += valor.getGrasas();
            }
        }

          
        binding.textCaloriasTotales.setText(String.valueOf(totalCalorias));
        binding.textProteinas.setText(totalProteinas + "g");
        binding.textCarbohidratos.setText(totalCarbohidratos + "g");
        binding.textGrasas.setText(totalGrasas + "g");

          
        actualizarBarrasProgreso(totalProteinas, totalCarbohidratos, totalGrasas);
    }

    private void actualizarBarrasProgreso(int proteinas, int carbos, int grasas) {
          
        int objetivoProteinas = 150;   
        int objetivoCarbos = 200;
        int objetivoGrasas = 80;

        binding.progressProteinas.setProgress((proteinas * 100) / objetivoProteinas);
        binding.progressCarbohidratos.setProgress((carbos * 100) / objetivoCarbos);
        binding.progressGrasas.setProgress((grasas * 100) / objetivoGrasas);
    }

    private String obtenerEmailUsuarioActual() {
        SharedPreferences prefs = getActivity().getSharedPreferences("ElevatePrefs", Context.MODE_PRIVATE);
        String email = prefs.getString("user_email", null);
        Log.d("UsuarioActual", "Email cargado: " + email);
        return email;
    }


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

      
    public static class ComidaItem {
        private String nombre;
        private Comida comida;
        private String tipo;

        public ComidaItem(String nombre, Comida comida, String tipo) {
            this.nombre = nombre;
            this.comida = comida;
            this.tipo = tipo;
        }

        public String getNombre() { return nombre; }
        public Comida getComida() { return comida; }
        public String getTipo() { return tipo; }
    }
}