document.addEventListener('DOMContentLoaded', () => {
    try {
        const userStr = sessionStorage.getItem('currentUser');
        if (userStr) {
            const user = JSON.parse(userStr);
            const nameEl = document.getElementById('tb-user-name');
            if(nameEl) nameEl.innerText = 'مرحباً، ' + (user.fullname || user.name || user.username || '');
        }
    } catch(e) {}
});

// trial_balance.js

document.addEventListener('DOMContentLoaded', async () => {
    // تعيين تواريخ افتراضية (مثلاً من بداية العام الحالي إلى اليوم)
    const today = new Date();
    document.getElementById('start-date').value = `${today.getFullYear()}-01-01`;
    document.getElementById('end-date').value = today.toISOString().split('T')[0];

    // تعبئة قائمة المشاريع
    try {
        const projects = await window.DB.getAll('projects');
        const projSel = document.getElementById('project-filter');
        if (projSel && projects) {
            projSel.innerHTML = projects
                .filter(p => p.status !== 'مغلق' && p.status !== 'متوقف')
                .map(p => `<option value="${p.id}">${p.name}</option>`)
                .join('');
        }
    } catch (e) {
        console.error('Error loading projects', e);
    }

    // استدعاء التقرير مبدئياً عند التحميل
    fetchTrialBalance();

    // ربط زر التحديث بالدالة لسحب البيانات بناءً على التواريخ
    document.getElementById('btn-fetch').addEventListener('click', fetchTrialBalance);
    document.getElementById('chk-comparative').addEventListener('change', fetchTrialBalance);
});

/**
 * دالة سحب البيانات (Fetch) من الباك إند
 */
function fetchTrialBalance() {
    const startDate = document.getElementById('start-date').value;
    const endDate = document.getElementById('end-date').value;
    const isComparative = document.getElementById('chk-comparative').checked;
    
    // جلب المشاريع المحددة
    const projSel = document.getElementById('project-filter');
    const selectedProjects = Array.from(projSel.selectedOptions).map(opt => opt.value);
    const projectsParam = selectedProjects.length > 0 ? `&projects=${selectedProjects.join(',')}` : '';

    fetch(`get_trial_balance.php?start_date=${startDate}&end_date=${endDate}&comparative=${isComparative}${projectsParam}`)
        .then(response => response.json())
        .then(data => {
            if (data.status === 'success') {
                renderTable(data.data, isComparative);
            } else {
                alert('حدث خطأ أثناء جلب البيانات: ' + (data.message || ''));
            }
        })
        .catch(error => {
            console.error('Fetch error:', error);
        });
}

/**
 * دالة رسم الجدول ديناميكياً وحساب الصافي النهائي لكل سطر
 */
function renderTable(accounts, isComparative) {
    const tbody = document.getElementById('tb-body');
    const thead = document.getElementById('tb-head');
    tbody.innerHTML = '';

    // جمع السنوات المتاحة إذا كان العرض مقارناً
    let availableYears = [];
    if (isComparative) {
        let yearSet = new Set();
        accounts.forEach(acc => {
            if (acc.period_years) {
                Object.keys(acc.period_years).forEach(y => yearSet.add(y));
            }
        });
        availableYears = Array.from(yearSet).sort();
    }

    // بناء رأس الجدول ديناميكياً
    let topRow = `<tr>
        <th rowspan="2">اسم الحساب</th>
        <th colspan="2">الرصيد الافتتاحي (ديناميكي)</th>`;
    let bottomRow = `<tr>
        <th>مدين</th><th>دائن</th>`;

    if (isComparative && availableYears.length > 0) {
        availableYears.forEach(y => {
            topRow += `<th colspan="2">حركة ${y}</th>`;
            bottomRow += `<th>مدين</th><th>دائن</th>`;
        });
    } else {
        topRow += `<th colspan="2">حركة الفترة المحددة</th>`;
        bottomRow += `<th>مدين</th><th>دائن</th>`;
    }

    topRow += `<th colspan="2">الأرصدة النهائية</th></tr>`;
    bottomRow += `<th>مدين</th><th>دائن</th></tr>`;
    thead.innerHTML = topRow + bottomRow;

    // دالة مساعدة لتنسيق الأرقام
    const formatNum = (num) => num > 0 ? Number(num).toLocaleString('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}) : '-';

    let sumOpenDebit = 0, sumOpenCredit = 0;
    let sumPeriodDebit = 0, sumPeriodCredit = 0;
    let sumFinalDebit = 0, sumFinalCredit = 0;
    let sumYears = {};

    accounts.forEach(acc => {
        // اللوجيك المحاسبي لحساب الصافي النهائي في الواجهة
        // يتم جمع الافتتاحي الديناميكي + حركات المدة
        const totalDebit = acc.dyn_open_debit + acc.period_debit;
        const totalCredit = acc.dyn_open_credit + acc.period_credit;
        
        let finalDebit = 0;
        let finalCredit = 0;

        // ترصيد الحساب: وضع الصافي في الخانة الأكبر (الطرف الطبيعي للرصيد) والخانة الأخرى صفر
        if (totalDebit > totalCredit) {
            finalDebit = totalDebit - totalCredit;
        } else if (totalCredit > totalDebit) {
            finalCredit = totalCredit - totalDebit;
        }

        // إخفاء الحسابات الصفرية بالكامل
        let isZero = (acc.dyn_open_debit === 0 && acc.dyn_open_credit === 0 && 
                      acc.period_debit === 0 && acc.period_credit === 0 && 
                      finalDebit === 0 && finalCredit === 0);
        
        if (isComparative && availableYears.length > 0) {
            let hasYearData = false;
            availableYears.forEach(y => {
                if (acc.period_years && acc.period_years[y]) {
                    if (acc.period_years[y].debit > 0 || acc.period_years[y].credit > 0) {
                        hasYearData = true;
                    }
                }
            });
            if (hasYearData) isZero = false;
        }

        if (isZero) return; // تخطي الحساب وعدم رسمه

        // إنشاء السطر (Tr)
        const tr = document.createElement('tr');
        
        // تجميع الإجماليات للحسابات الرئيسية الجذور (مستوى 0) فقط
        // حيث أنها تحتوي بالفعل على مجاميع الحسابات الفرعية بداخلها
        if (acc.level === 0) {
            sumOpenDebit += acc.dyn_open_debit;
            sumOpenCredit += acc.dyn_open_credit;
            sumPeriodDebit += acc.period_debit;
            sumPeriodCredit += acc.period_credit;
            sumFinalDebit += finalDebit;
            sumFinalCredit += finalCredit;
            
            if (isComparative && availableYears.length > 0) {
                availableYears.forEach(y => {
                    if (!sumYears[y]) sumYears[y] = { debit: 0, credit: 0 };
                    let yData = (acc.period_years && acc.period_years[y]) ? acc.period_years[y] : {debit:0, credit:0};
                    sumYears[y].debit += yData.debit;
                    sumYears[y].credit += yData.credit;
                });
            }
        }
        
        // تطبيق كلاس عريض للحسابات الرئيسية
        if (acc.is_parent) {
            tr.classList.add('parent-row'); 
        }

        // حساب الإزاحة التباعدية (Indentation) لبيان التدرج الشجري
        const indentation = acc.level * 25; // 25 بكسل لكل مستوى متفرع
        
        let trHtml = `
            <td style="padding-right: ${indentation + 10}px;">
                ${acc.is_parent ? '▼' : '▪'} ${acc.code ? acc.code + ' - ' : ''}${acc.name}
            </td>
            <td class="debit">${formatNum(acc.dyn_open_debit)}</td>
            <td class="credit">${formatNum(acc.dyn_open_credit)}</td>
        `;

        // العواميد الديناميكية للسنوات
        if (isComparative && availableYears.length > 0) {
            availableYears.forEach(y => {
                let yData = (acc.period_years && acc.period_years[y]) ? acc.period_years[y] : {debit:0, credit:0};
                trHtml += `<td class="debit">${formatNum(yData.debit)}</td><td class="credit">${formatNum(yData.credit)}</td>`;
            });
        } else {
            trHtml += `<td class="debit">${formatNum(acc.period_debit)}</td><td class="credit">${formatNum(acc.period_credit)}</td>`;
        }

        trHtml += `
            <td class="debit" style="font-weight: bold;">${formatNum(finalDebit)}</td>
            <td class="credit" style="font-weight: bold;">${formatNum(finalCredit)}</td>
        `;
        tr.innerHTML = trHtml;

        tbody.appendChild(tr);
    });

    // طباعة الإجماليات في أسفل الجدول (tfoot)
    const tfoot = document.getElementById('tb-foot');
    if (tfoot) {
        let footHtml = `<tr>
            <th style="text-align: left; font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">الإجماليات الكلية</th>
            <th class="debit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(sumOpenDebit)}</th>
            <th class="credit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(sumOpenCredit)}</th>
        `;

        if (isComparative && availableYears.length > 0) {
            availableYears.forEach(y => {
                let yData = sumYears[y] || {debit: 0, credit: 0};
                footHtml += `<th class="debit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(yData.debit)}</th>
                             <th class="credit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(yData.credit)}</th>`;
            });
        } else {
            footHtml += `<th class="debit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(sumPeriodDebit)}</th>
                         <th class="credit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(sumPeriodCredit)}</th>`;
        }

        footHtml += `
            <th class="debit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(sumFinalDebit)}</th>
            <th class="credit" style="font-weight: bold; background: #ecf0f1; border-top: 2px solid #bdc3c7;">${formatNum(sumFinalCredit)}</th>
        </tr>`;
        tfoot.innerHTML = footHtml;
    }
}
