
let chart1;
let chart2;
let dirUbic = "";

function esTimestampUnix(valor) {
    return typeof valor === 'number';
}

function esFechaFormateada(valor) {
    return typeof valor === 'string';
}

function devuelveFecha(uniqueNumber) {
    const fecha = new Date(uniqueNumber);

    const dia = String(fecha.getDate()).padStart(2, '0');
    const mes = String(fecha.getMonth() + 1).padStart(2, '0'); // Los meses empiezan en 0
    const año = fecha.getFullYear();

    const fechaFormateada = `${dia}/${mes}/${año}`;
    console.log(fechaFormateada);
    return fechaFormateada;
}

//let url = window.location.href;
async function fetchLogs() {
    let url = localStorage.getItem("nameEjercicios");
    console.info(url)
    ///////////////////
    let nomPdf = "";
    let userProf = "";
    let nom1 = []
    nom1 = url.split(",");
    let nom2 = [];
    nom2 = nom1[0].split("?");
    let nom3 = [];
    nom3 = nom2[1].split("#"); //imagenes.split("?");
    let formattedStartDate = null;
    let startDateStr = null;
    console.info(nomPdf);
    console.log(nom3);
    console.log(nom3.length);
    if (nom3.length > 1) {
        userProf = nom3[0];
        nomPdf = nom3[1];

        //////////////////////
        let dateTmpa = [];
        dateTmpa = nomPdf.split("_");
        console.info(dateTmpa)
        let codificado = dateTmpa[dateTmpa.length - 1]
        // --- Decodificación ---
        const timestamp = parseInt(codificado, 36); // base 36 -> número
        const fechaDecodificada = new Date(timestamp);

        // Formateo a dd/mm/yyyy
        const dd = String(fechaDecodificada.getDate()).padStart(2, "0");
        const mm = String(fechaDecodificada.getMonth() + 1).padStart(2, "0");
        const yyyy = fechaDecodificada.getFullYear();

        console.log(`${dd}/${mm}/${yyyy}`);
        formattedStartDate = `${dd}/${mm}/${yyyy}`
        ///////////////////

        /*let tmp = nomPdf.slice(nomPdf.length - 8, nomPdf.length);
        const timestamp = parseInt(tmp, 36);
        console.info(timestampDecoded)*/
        if (timestamp > 1672527600000) { //946684800000) 
            //const startDate = new Date(timestamp);
            //formattedStartDate = `${startDate.getDate().toString().padStart(2, '0')}/${(startDate.getMonth() + 1).toString().padStart(2, '0')}/${startDate.getFullYear()}`;
            console.info(formattedStartDate)
        }
        else {
            let dateTmp = [];
            dateTmp = nomPdf.split("_");
            let numLength = dateTmp.length;
            startDateStr = dateTmp[numLength - 2]
            console.info(startDateStr)
            // Convertir la fecha inicial del formato 20241018_140131 a DD/MM/YYYY
            const year = startDateStr.substring(0, 4);
            const month = startDateStr.substring(4, 6);
            const day = startDateStr.substring(6, 8);
            formattedStartDate = `${day}/${month}/${year}`;
            console.info(nomPdf)
            console.info(userProf)
        }
    }
    else {
        nomPdf = nom2[1];
        userProf = "";
        //const today = new Date();
        //formattedStartDate = `${today.getDate().toString().padStart(2, '0')}/${(today.getMonth() + 1).toString().padStart(2, '0')}/${today.getFullYear()}`;
        console.info(userProf)
        console.info(nomPdf)
    }

    //console.info(formattedStartDate);
    // Obtener la fecha actual y formatearla a DD/MM/YYYY
    const today = new Date();
    const formattedEndDate = `${today.getDate().toString().padStart(2, '0')}/${(today.getMonth() + 1).toString().padStart(2, '0')}/${today.getFullYear()}`;

    console.info(formattedStartDate);
    console.info(formattedEndDate);
    console.info(userProf)
    console.info(nomPdf)

    if (navigator.onLine) {
        console.log("Tienes conexión a Internet.");
        try {
            const response = await fetch(servidorURL + `/php/logs/php_read_logs_pdf_ejercicio.php?nomPdf=${encodeURIComponent(nomPdf)}&startDate=${encodeURIComponent(formattedStartDate)}&endDate=${encodeURIComponent(formattedEndDate)}&v=${new Date().getTime()}`);

            if (!response.ok) {
                throw new Error('Error fetching logs.');
            }
            const logs = await response.json();
            console.info(logs);

            processLogs(logs, formattedStartDate, formattedEndDate);
            procesarDatosYMostrarGrafico(logs, formattedStartDate, formattedEndDate, nomPdf)
            //await displayLogs(logs);
        } catch (error) {
            console.error('Error:', error);
        }
    } else {
        console.log("No tienes conexión a Internet.");
    }
}


function processLogs(logs, startDate, endDate) {
    if (logs.status === 'error') {
        //document.getElementById('logs').innerHTML = `<p>${logs.message}</p>`;
        return;
    }

    // Filtrar y analizar los datos para calcular la adherencia diaria
    const daysActive = new Set();
    const baseTime = [];
    //const exerciseCounts = [];
    let autor = "";
    let pdf_nom = "";
    let mesAnual = "";
    logs.forEach(log => {
        // Dividir la fecha y la hora
        const [datePart, timePart] = log.timestamp.split(', ');
        // Reorganizar la fecha al formato YYYY-MM-DD
        const [day, month, year] = datePart.split('/');
        const formattedDate = `${year}-${month}-${day}`;
        mesAnual = `${year}`;
        // Agregar la fecha formateada al conjunto daysActive
        daysActive.add(formattedDate);
        let bt = parseInt(log.diferenciaMinutos, 10)
        if (bt > 0) baseTime.push(parseInt(log.diferenciaMinutos, 10));
        else baseTime.push(1);

        autor = log.autor;
        pdf_nom = log.pdf_nom;
    });

    const uniqueExercises = new Set(logs.map(item => item.tec_nom));
    // El tamaño del conjunto representa el número de ejercicios únicos
    const totalExercises = uniqueExercises.size;
    const totalDaysActive = daysActive.size;
    console.info(totalDaysActive)
    const totalRegistros = logs.length; //  / totalDaysActive;
    const totalMinutes = baseTime.reduce((a, b) => a + b, 0);
    //const mediaMinDia = totalMinutes / totalDaysActive;
    let promedio = (totalMinutes / totalExercises).toFixed(2);
    renderChart(totalDaysActive, totalRegistros, totalMinutes, totalExercises, promedio, pdf_nom, mesAnual, startDate, endDate);
}

function renderChart(daysActive, totalRegistros, totalMinutes, totalExercises, promedio, pdfNom, mesAnual, startDate, endDate) {
    const ctx = document.getElementById('adherenceChart1').getContext('2d');
    if (chart1) {
        chart1.destroy(); // Si existe, lo destruimos
    }
    chart1 = new Chart(ctx, {
        type: 'bar',
        data: {
            labels: ['Días', 'Registros', 'Minutos', 'Ejercicios', 'Media' + "'"],
            datasets: [{
                label: pdfNom,
                data: [daysActive, totalRegistros, totalMinutes, totalExercises, promedio],
                backgroundColor: [
                    'rgba(75, 192, 192, 0.2)',
                    'rgba(54, 162, 235, 0.2)',
                    'rgba(255, 206, 86, 0.2)',
                    'rgba(153, 102, 255, 0.2)'
                ],
                borderColor: [
                    'rgba(75, 192, 192, 1)',
                    'rgba(54, 162, 235, 1)',
                    'rgba(255, 206, 86, 1)',
                    'rgba(153, 102, 255, 1)'
                ],
                borderWidth: 1
            }]
        },

        options: {
            responsive: false,
            maintainAspectRatio: false,
            plugins: {
                legend: {
                    position: 'top'
                },
                title: {
                    display: true,
                    text: 'Datos', // por PDF del ' + startDate + ' al ' + endDate,
                }
            },
            scales: {
                y: {
                    beginAtZero: true
                }
            }
        }
    });
}

function procesarDatosYMostrarGrafico(eventos, startDate, endDate, nomPdf) {
    // Agrupar los eventos por día y PDF
    const eventosPorDiaYPdf = eventos.reduce((acc, evento) => {
        const fecha = evento.timestamp.split(',')[0].trim(); // Extraer la fecha y eliminar espacios
        const pdfNom = evento.pdf_nom; // Nombre del PDF

        if (!acc[fecha]) {
            acc[fecha] = {};
        }
        if (!acc[fecha][pdfNom]) {
            acc[fecha][pdfNom] = [];
        }

        acc[fecha][pdfNom].push(evento);
        return acc;
    }, {});

    // Calcular la adherencia para cada combinación de día y PDF
    const tiempoRecomendado = 30; // 30 minutos como mínimo recomendado
    const pesos = { frecuencia: 0.5, duracion: 0.3, ejercicios: 0.2 };
    const adherenciaDiaria = [];
    for (const [fecha, pdfs] of Object.entries(eventosPorDiaYPdf)) {
        console.info(eventosPorDiaYPdf)
        for (const [pdfNom, eventos] of Object.entries(pdfs)) {
            const conectado = 1; // Si hay eventos, se considera que se conectó
            const duracionTotal = eventos.reduce((sum, evento) => sum + parseInt(evento.diferenciaMinutos, 10), 0);
            const duracion = Math.min(duracionTotal / tiempoRecomendado, 1); // Ratio entre tiempo total y recomendado
            const ejerciciosCompletados = Math.min(eventos.reduce((sum, evento) => sum + 1, 0) / (eventos.length * 10), 1);
            // Ratio entre ejercicios realizados y total posible (10 por sesión)
            // Calcular la adherencia ponderada
            const adherencia = (conectado * pesos.frecuencia) +
                (duracion * pesos.duracion) +
                (ejerciciosCompletados * pesos.ejercicios);
            adherenciaDiaria.push({ fecha, pdfNom, adherencia });
            console.info(eventos.length)
            console.info(conectado)
            console.info(duracionTotal)
            console.info(duracion)
            console.info(ejerciciosCompletados)
            console.info(conectado * pesos.frecuencia)
            console.info(duracion * pesos.duracion)
            console.info(ejerciciosCompletados * pesos.ejercicios)
            console.info(adherenciaDiaria)
        }
    }
    let mesAnual = "";
    // Crear etiquetas para los días y datos de adherencia
    //const etiquetasDias = adherenciaDiaria.map(d => `${d.fecha} (${d.pdfNom})`);
    //const etiquetasDias = adherenciaDiaria.map(d => `${d.fecha}`);
    const etiquetasDias = adherenciaDiaria.map(d => {
        const [day, month, year] = d.fecha.split('/'); // Separar día, mes y año
        const shortYear = year.slice(-2); // Tomar los últimos dos dígitos del año
        mesAnual = `${year}`;
        return `${day}/${month}`; //`${day}/${month}/${shortYear}`; // Formato reducido dd/mm/yy
    });
    const datosAdherencia = adherenciaDiaria.map(d => d.adherencia);

    // Configuración del gráfico

    const ctx = document.getElementById('adherenceChart2').getContext('2d');
    if (chart2) {
        chart2.destroy(); // Si existe, lo destruimos
    }
    chart2 = new Chart(ctx, {
        type: 'line',
        data: {
            labels: etiquetasDias,
            datasets: [{
                label: nomPdf,
                data: datosAdherencia,
                borderColor: 'rgba(75, 192, 192, 1)',
                backgroundColor: 'rgba(75, 192, 192, 0.2)',
                fill: true,
                tension: 0.1
            }]
        },
        options: {
            responsive: false,
            maintainAspectRatio: false,
            plugins: {
                legend: {
                    position: 'top'
                },
                title: {
                    display: true,
                    text: 'Adherencia', // por PDF del ' + startDate + ' al ' + endDate,
                }
            },
            scales: {
                y: {
                    beginAtZero: true,
                    max: 1
                }
            }
        }
    });
}