frappe.ui.form.on('Land tax declaration', {
    refresh: function(frm) {
        recalculate_totals(frm);
    },
    
    il: function(frm) {
        if (frm.doc.il) {
            reload_assets_for_year(frm, frm.doc.il);
        }
    }
});

frappe.ui.form.on('Land tax declaration Elave 1', {
    vergiməbləğimanatla: function(frm, cdt, cdn) {
        recalculate_totals(frm);
    },
    
    bəyannaməsətrininkoduvəadı: function(frm, cdt, cdn) {
        recalculate_totals(frm);
    },
    
    əlavə_1_add: function(frm) {
        recalculate_totals(frm);
    },
    
    əlavə_1_remove: function(frm) {
        recalculate_totals(frm);
    }
});

function recalculate_totals(frm) {
    if (!frm.doc.əlavə_1 || !Array.isArray(frm.doc.əlavə_1)) {
        frm.set_value('601umumi', 0);
        frm.set_value('602umumi', 0);
        frm.set_value('601umumi_sahə', 0);
        frm.set_value('602umumi_sahə', 0);
        frm.set_value('601cəlb', 0);
        frm.set_value('602cəlb', 0);
        return;
    }

    let total_601 = 0;
    let total_602 = 0;
    let total_601_area = 0;
    let total_602_area = 0;
    let total_601_exempt = 0;
    let total_602_exempt = 0;

    frm.doc.əlavə_1.forEach(function(row) {
        let code = row.bəyannaməsətrininkoduvəadı || '';
        let tax = parseFloat(row.vergiməbləğimanatla) || 0;
        let total_area = parseFloat(row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarlaümumi) || 0;
        let exempt_area = parseFloat(row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarla) || 0;

        if (code.startsWith('600.1')) {
            total_601 += tax;
            total_601_area += total_area;
            total_601_exempt += exempt_area;
        } else if (code.startsWith('600.2')) {
            total_602 += tax;
            total_602_area += total_area;
            total_602_exempt += exempt_area;
        }
    });

    frm.set_value('601umumi', total_601);
    frm.set_value('602umumi', total_602);
    frm.set_value('601umumi_sahə', total_601_area);
    frm.set_value('602umumi_sahə', total_602_area);
    frm.set_value('601cəlb', total_601_exempt);
    frm.set_value('602cəlb', total_602_exempt);
}

function reload_assets_for_year(frm, year) {
    frm.clear_table('əlavə_1');
    frm.clear_table('əlavə_2');
    frm.refresh_fields();
    
    Promise.all([
        load_agricultural_assets_for_year(frm, 'əlavə_1', year),
        load_industrial_assets_for_year(frm, 'əlavə_2', year)
    ]).then(() => {
        frm.refresh_fields();
        recalculate_totals(frm);
    }).catch((error) => {
        console.error('Error loading assets:', error);
    });
}

function load_agricultural_assets_for_year(frm, table_fieldname, year) {
    return new Promise((resolve, reject) => {
        frappe.call({
            method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.get_assets_for_year',
            args: {
                asset_type: 'Kənd təsərrüfatı təyinatlı torpaq sahələri',
                year: year
            },
            callback: function(response) {
                if (response.message && response.message.length > 0) {
                    process_agricultural_assets_silent(frm, table_fieldname, response.message, resolve);
                } else {
                    resolve();
                }
            },
            error: function(error) {
                resolve();
            }
        });
    });
}

function process_agricultural_assets_silent(frm, table_fieldname, assets, resolve) {
    let agricultural_purposes = {};
    let processed_count = 0;
    let unique_purposes = get_unique_purposes(assets);
    
    if (unique_purposes.size > 0) {
        unique_purposes.forEach(purpose_id => {
            frappe.call({
                method: 'frappe.client.get',
                args: {
                    doctype: 'Agricultural Purpose Type',
                    name: purpose_id
                },
                callback: function(agri_response) {
                    if (agri_response.message) {
                        agricultural_purposes[purpose_id] = {
                            name: agri_response.message.name,
                            purpose_name: agri_response.message.purpose_name
                        };
                    }
                    
                    processed_count++;
                    
                    if (processed_count === unique_purposes.size) {
                        group_and_create_agricultural_rows_silent(frm, table_fieldname, assets, agricultural_purposes, resolve);
                    }
                },
                error: function(error) {
                    processed_count++;
                    if (processed_count === unique_purposes.size) {
                        group_and_create_agricultural_rows_silent(frm, table_fieldname, assets, agricultural_purposes, resolve);
                    }
                }
            });
        });
    } else {
        group_and_create_agricultural_rows_silent(frm, table_fieldname, assets, agricultural_purposes, resolve);
    }
}

function get_unique_purposes(assets) {
    let unique_purposes = new Set();
    
    assets.forEach(asset => {
        if (asset.agricultural_purpose) {
            unique_purposes.add(asset.agricultural_purpose);
        }
    });
    
    return unique_purposes;
}

function group_and_create_agricultural_rows_silent(frm, table_fieldname, assets, agricultural_purposes, resolve) {
    let grouped_assets = {};

    assets.forEach(function(asset) {
        let group_key = create_agricultural_group_key(asset, agricultural_purposes);

        if (!grouped_assets[group_key]) {
            grouped_assets[group_key] = {
                asset: asset,
                total_area: 0,
                total_tax_exempt_area: 0,
                count: 0,
                asset_names: []
            };
        }

        grouped_assets[group_key].total_area += (asset.area || 0);
        grouped_assets[group_key].total_tax_exempt_area += (asset.tax_exempt_area || 0);
        grouped_assets[group_key].count += 1;
        grouped_assets[group_key].asset_names.push(asset.name);
    });
    
    let total_groups = Object.keys(grouped_assets).length;
    let completed_calculations = 0;
    
    if (total_groups === 0) {
        resolve();
        return;
    }
    
    Object.entries(grouped_assets).forEach(function([group_key, group]) {
        create_agricultural_row_with_calculation_silent(frm, table_fieldname, group.asset, agricultural_purposes, group.total_area, group, function() {
            completed_calculations++;
            
            if (completed_calculations === total_groups) {
                resolve();
            }
        });
    });
}

function create_agricultural_group_key(asset, agricultural_purposes) {
    let purpose_name = '';
    if (asset.agricultural_purpose && agricultural_purposes[asset.agricultural_purpose]) {
        purpose_name = agricultural_purposes[asset.agricultural_purpose].purpose_name || '';
    }
    
    let key_parts = [
        get_select_option_value(purpose_name),
        asset.cadastral_district_code || '',
        asset.cadastral_district_name || '',
        asset.quality_groups || '',
        asset.agricultural_land_purpose || ''
    ];
    
    return key_parts.join('|');
}

function create_agricultural_row_with_calculation_silent(frm, table_fieldname, asset, agricultural_purposes, total_area, group_info, callback) {
    let row = frm.add_child(table_fieldname);
    
    fill_agricultural_row_fields(row, asset, agricultural_purposes, total_area, group_info);
    calculate_agricultural_tax_for_row_silent(row, asset, total_area, group_info, callback, agricultural_purposes);
}

function fill_agricultural_row_fields(row, asset, agricultural_purposes, total_area, group_info) {
    if (asset.agricultural_purpose && agricultural_purposes[asset.agricultural_purpose]) {
        let purpose_doc = agricultural_purposes[asset.agricultural_purpose];
        if (purpose_doc.purpose_name) {
            let mapped_value = get_select_option_value(purpose_doc.purpose_name);
            row.bəyannaməsətrininkoduvəadı = mapped_value;
        }
    }
    
    if (asset.cadastral_district_code) {
        row.torpaqsahəsininyerləşdiyikadastrqiymətrayonununkodu = asset.cadastral_district_code;
    }
    
    if (asset.cadastral_district_name) {
        row.torpaqsahəsininyerləşdiyikadastrqiymətrayonununadı = asset.cadastral_district_name;
    }
    
    if (asset.quality_groups) {
        row.keyfiyyətqrupu = asset.quality_groups;
    }
    
    if (asset.agricultural_land_purpose) {
        if (asset.agricultural_land_purpose === 'Əkin, dinc və çoxillik əkmələr') {
            row.torpaqsahəsinintəyinatıəkindincçoxillikəkmələr = 1;
            row.torpaqsahəsinintəyinatıbiçənəkörüşotlaqlar = 0;
        } else if (asset.agricultural_land_purpose === 'Biçənək, örüş və otlaqlar') {
            row.torpaqsahəsinintəyinatıəkindincçoxillikəkmələr = 0;
            row.torpaqsahəsinintəyinatıbiçənəkörüşotlaqlar = 1;
        }
    }
    
    if (total_area > 0) {
        row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarlaümumi = total_area;
    }

    if (group_info.total_tax_exempt_area > 0) {
        row.torpaqsahəsi6001kodlarüzrəkvmetrlə6002kodlarüzrəhektarla = group_info.total_tax_exempt_area;
    }
}

function calculate_agricultural_tax_for_row_silent(row, asset, total_area, group_info, callback, agricultural_purposes) {
    let agricultural_purpose_name = null;
    if (asset.agricultural_purpose && agricultural_purposes && agricultural_purposes[asset.agricultural_purpose]) {
        agricultural_purpose_name = agricultural_purposes[asset.agricultural_purpose].purpose_name;
    }
    
    if (agricultural_purpose_name !== 'Təyinatı üzrə istifadə edilməyən kənd təsərrüfatı torpaqları üzrə hesablanmış vergi məbləği') {
        if (!asset.cadastral_district_name || !asset.quality_groups || !asset.agricultural_land_purpose) {
            callback();
            return;
        }
    }
    
    frappe.call({
        method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_agricultural_tax',
        args: {
            area_value: total_area,
            cadastral_district_name: asset.cadastral_district_name,
            quality_groups: asset.quality_groups,
            agricultural_land_purpose: asset.agricultural_land_purpose,
            agricultural_purpose_name: agricultural_purpose_name,
            tax_exempt_area: group_info.total_tax_exempt_area || 0
        },
        callback: function(response) {
            if (response.message && 'tax_amount' in response.message) {
                row.vergiməbləğimanatla = response.message.tax_amount;
            }
            callback();
        },
        error: function(error) {
            callback();
        }
    });
}

function get_select_option_value(purpose_name) {
    if (purpose_name === 'Təyinatı üzrə istifadə edilməyən kənd təsərrüfatı torpaqları üzrə hesablanmış vergi məbləği') {
        return '600.1 Təyinatı üzrə istifadə edilməyən kənd təsərrüfatı torpaqları üzrə hesablanmış vergi məbləği';
    }
    
    if (purpose_name === 'Təyinatı üzrə istifadə edilən və ya irriqasiya, meliorasiya və digər aqrotexniki səbəblərdən təyinatı üzrə istifadə edilməsi mümkün olmayan kənd təsərrüfatı torpaqları üzrə verginin məbləği') {
        return '600.2 Təyinatı üzrə istifadə edilən və ya irriqasiya, meliorasiya və digər aqrotexniki səbəblərdən təyinatı üzrə istifadə edilməsi mümkün olmayan kənd təsərrüfatı torpaqları üzrə verginin məbləği';
    }
    
    return purpose_name;
}

function load_industrial_assets_for_year(frm, table_fieldname, year) {
    return new Promise((resolve, reject) => {
        frappe.call({
            method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.get_assets_for_year',
            args: {
                asset_type: 'Sənaye, tikinti, nəqliyyat, rabitə, ticarət-məişət xidməti və digər xüsusi təyinatlı torpaq sahələri',
                year: year
            },
            callback: function(response) {
                if (response.message && response.message.length > 0) {
                    group_and_create_industrial_rows_silent(frm, table_fieldname, response.message, resolve);
                } else {
                    resolve();
                }
            },
            error: function(error) {
                resolve();
            }
        });
    });
}

function group_and_create_industrial_rows_silent(frm, table_fieldname, assets, resolve) {
    let grouped_assets = {};
    
    assets.forEach(function(asset) {
        let group_key = create_industrial_group_key(asset);
        
        if (!grouped_assets[group_key]) {
            grouped_assets[group_key] = {
                asset: asset,
                total_area: 0,
                total_tax_exempt_area: 0,
                count: 0,
                asset_names: []
            };
        }
        
        grouped_assets[group_key].total_area += (asset.area || 0);
        grouped_assets[group_key].total_tax_exempt_area += (asset.tax_exempt_area || 0);
        grouped_assets[group_key].count += 1;
        grouped_assets[group_key].asset_names.push(asset.name);
    });
    
    let total_groups = Object.keys(grouped_assets).length;
    let completed_calculations = 0;
    
    if (total_groups === 0) {
        resolve();
        return;
    }
    
    Object.entries(grouped_assets).forEach(function([group_key, group]) {
        create_industrial_row_with_calculation_silent(frm, table_fieldname, group.asset, group.total_area, group, function() {
            completed_calculations++;
            
            if (completed_calculations === total_groups) {
                resolve();
            }
        });
    });
}

function create_industrial_group_key(asset) {
    let key_parts = [
        asset.territorial_unit_name || '',
        asset.territorial_unit_code || '',
        asset.industrial_land_purpose || '',
        asset.mining_note ? 'mining' : 'no_mining'
    ];
    
    return key_parts.join('|');
}

function create_industrial_row_with_calculation_silent(frm, table_fieldname, asset, total_area, group_info, callback) {
    let row = frm.add_child(table_fieldname);
    
    fill_industrial_row_fields(row, asset, total_area, group_info);
    calculate_industrial_tax_for_row_silent(row, asset, total_area, group_info, callback);
}

function fill_industrial_row_fields(row, asset, total_area, group_info) {
    if (asset.territorial_unit_code) {
        row.torpaqsahəsininyerləşdiyiəraziməntəqəsininkodu = parseFloat(asset.territorial_unit_code) || 0;
    }
    
    if (asset.territorial_unit_name) {
        row.torpaqsahəsininyerləşdiyiəraziməntəqəsininadı = asset.territorial_unit_name;
    }
    
    if (asset.industrial_land_purpose) {
        if (asset.industrial_land_purpose === 'Sənaye, tikinti, nəqliyyat, rabitə, ticarət-məişət xid-ti və dig. xüs. təy-tlı sahələr') {
            row.torpaqsahəsinintəyinatısənayətikinti = 1;
            row.torpaqsahəsinintəyinatıyaşayışfondları = 0;
        } else if (asset.industrial_land_purpose === 'Yaşayış fondları, həyətyanı və bağsahələri üzrə sahələr') {
            row.torpaqsahəsinintəyinatısənayətikinti = 0;
            row.torpaqsahəsinintəyinatıyaşayışfondları = 1;
        }
    }
    
    if (asset.mining_note !== undefined) {
        row.faydalıqazıntıçıxarılmasıbarədəqeyd = asset.mining_note ? 1 : 0;
    }
    
    if (total_area > 0) {
        row.torpaqsahəsikvmetrləümumisahə = total_area;
    }
    
    if (group_info.total_tax_exempt_area > 0) {
        row.torpaqsahəsikvmetrləocümlədənvergiyəcəlbolunmayansahə = group_info.total_tax_exempt_area;
    }
}

function calculate_industrial_tax_for_row_silent(row, asset, total_area, group_info, callback) {
    if (!asset.territorial_unit_name || !asset.industrial_land_purpose) {
        callback();
        return;
    }

    frappe.call({
        method: 'taxes_az.taxes_az.doctype.land_tax_declaration.land_tax_declaration.calculate_industrial_tax',
        args: {
            area_sqm: total_area,
            territorial_unit_name: asset.territorial_unit_name,
            industrial_land_purpose: asset.industrial_land_purpose,
            tax_exempt_area: group_info.total_tax_exempt_area || 0
        },
        callback: function(response) {
            if (response.message && 'tax_amount' in response.message) {
                row.vergiməbləğimanatla = response.message.tax_amount;
            }
            callback();
        },
        error: function(error) {
            callback();
        }
    });
}