package com.borjabolufer.elevate.utils;

import static android.content.ContentValues.TAG;

import android.content.Context;
import android.os.Build;
import android.util.Log;

import com.borjabolufer.elevate.model.Ejercicio;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.ArrayList;
import java.util.List;

public class JsonUtils {

    public static List<Ejercicio> parseEjercicios(JSONArray jsonArray) throws JSONException {
        List<Ejercicio> lista = new ArrayList<>();

        if (jsonArray == null) return lista;

        for (int i = 0; i < jsonArray.length(); i++) {
            Object element = jsonArray.get(i);

            if (element instanceof JSONObject) {
                JSONObject obj = (JSONObject) element;

                String nombre = obj.optString("nombre", "Ejercicio sin nombre");
                String descripcion = obj.optString("descripcion", "");
                String videoUrl = obj.optString("video_url", "");
                String duracion = obj.optString("descanso", "");
                int series = obj.optInt("series");
                int repeticiones = obj.optInt("repeticiones");

                lista.add(new Ejercicio(nombre, descripcion, series, repeticiones, duracion, videoUrl));

            } else if (element instanceof String) {
                String nombre = (String) element;
                lista.add(new Ejercicio(nombre, "", 0, 0, "", ""));
            }
        }

        return lista;
    }

    public static List<Ejercicio> parseEjerciciosPrincipales(JSONArray jsonArray) throws JSONException {
        List<Ejercicio> lista = new ArrayList<>();

        if (jsonArray == null) return lista;

        for (int i = 0; i < jsonArray.length(); i++) {
            JSONObject obj = jsonArray.getJSONObject(i);

            String nombre = obj.optString("nombre", "Ejercicio sin nombre");
            String descripcion = obj.optString("descripcion", "");
            String videoUrl = obj.optString("video_url", "");

            int series = obj.optInt("series", 0);
            int repeticiones = obj.optInt("repeticiones", 0);
            String descanso = obj.optString("descanso", "");

            StringBuilder descripcionCompleta = new StringBuilder(descripcion);

            lista.add(new Ejercicio(nombre, descripcionCompleta.toString(), series, repeticiones, descanso, videoUrl));
        }

        return lista;
    }

    public static File obtenerArchivoPlan(Context context, String emailUsuario) {
        emailUsuario = normalizarEmail(emailUsuario);
        File archivo = new File(context.getFilesDir(), "plan_"+ emailUsuario + ".json");
        Log.d(TAG, "Buscando archivo: " + archivo.getAbsolutePath());
        return archivo;
    }

    public static String normalizarEmail(String email) {
        return email.replace("@", "_").replace(".", "_");
    }

    public static String cargarPlanDelUsuario(Context context, String emailUsuario) {
        try {
            File archivo = obtenerArchivoPlan(context, emailUsuario);
            if (archivo.exists()) {
                Log.d(TAG, "Archivo encontrado. Leyendo contenido...");

                  
                return leerArchivoCompatible(archivo);
            } else {
                Log.w(TAG, "Archivo no encontrado para el usuario: " + emailUsuario);
            }
        } catch (IOException e) {
            Log.e(TAG, "Error leyendo el archivo JSON del usuario", e);
        }
        return null;
    }

      
    private static String leerArchivoCompatible(File archivo) throws IOException {
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
              
            return new String(Files.readAllBytes(archivo.toPath()));
        } else {
              
            return leerArchivoTradicional(archivo);
        }
    }

      
    private static String leerArchivoTradicional(File archivo) throws IOException {
        FileInputStream fis = null;
        try {
            fis = new FileInputStream(archivo);
            byte[] buffer = new byte[(int) archivo.length()];
            int bytesRead = fis.read(buffer);

            if (bytesRead > 0) {
                return new String(buffer, 0, bytesRead, "UTF-8");
            } else {
                throw new IOException("No se pudieron leer datos del archivo");
            }
        } finally {
            if (fis != null) {
                try {
                    fis.close();
                } catch (IOException e) {
                    Log.w(TAG, "Error al cerrar FileInputStream: " + e.getMessage());
                }
            }
        }
    }

      
    public static boolean existeArchivoPlan(Context context, String emailUsuario) {
        File archivo = obtenerArchivoPlan(context, emailUsuario);
        boolean existe = archivo.exists();
        Log.d(TAG, "Archivo de plan para " + emailUsuario + " existe: " + existe);
        return existe;
    }

      
    public static boolean eliminarArchivoPlan(Context context, String emailUsuario) {
        try {
            File archivo = obtenerArchivoPlan(context, emailUsuario);
            if (archivo.exists()) {
                boolean eliminado = archivo.delete();
                Log.d(TAG, "Archivo de plan eliminado para " + emailUsuario + ": " + eliminado);
                return eliminado;
            }
            return true;   
        } catch (Exception e) {
            Log.e(TAG, "Error al eliminar archivo de plan: " + e.getMessage());
            return false;
        }
    }

      
    public static boolean guardarPlanEnArchivo(Context context, String emailUsuario, String contenidoJson) {
        try {
            File archivo = obtenerArchivoPlan(context, emailUsuario);

            FileOutputStream fos = new FileOutputStream(archivo);
            fos.write(contenidoJson.getBytes("UTF-8"));
            fos.flush();
            fos.close();

            Log.d(TAG, "Plan guardado en archivo para usuario: " + emailUsuario);
            return true;

        } catch (IOException e) {
            Log.e(TAG, "Error al guardar plan en archivo: " + e.getMessage());
            return false;
        }
    }
}