frappe.ui.form.on('Asset', {
    refresh: function(frm) {
        setup_asset_fields(frm);
        update_area_field_label(frm);
        
        if (should_show_calculation_button(frm)) {
            add_calculation_button(frm);
        }
    },
    
    land: function(frm) {
        handle_category_checkboxes(frm, 'land');
    },
    
    property: function(frm) {
        handle_category_checkboxes(frm, 'property');
    },
    
    custom_asset_type: function(frm) {
        setup_asset_fields(frm);
        update_area_field_label(frm);
        clear_dependent_fields(frm);
        
        if (should_show_calculation_button(frm)) {
            add_calculation_button(frm);
        } else {
            if (frm.custom_buttons && frm.custom_buttons['Calculate Gross Amount']) {
                frm.remove_custom_button('Calculate Gross Amount');
            }
        }
    },
    
    agricultural_purpose: function(frm) {
        update_area_field_label(frm);
        toggle_calculation_button(frm);
    },
    
    cadastral_district_name: function(frm) {
        if (frm.doc.cadastral_district_name) {
            frappe.call({
                method: 'frappe.client.get',
                args: {
                    doctype: 'Cadastral Valuation District',
                    name: frm.doc.cadastral_district_name
                },
                callback: function(r) {
                    if (r.message && r.message.district_code) {
                        frm.set_value('cadastral_district_code', r.message.district_code);
                    }
                }
            });
        } else {
            frm.set_value('cadastral_district_code', '');
        }
        
        toggle_calculation_button(frm);
    },
    
    area: function(frm) {
        toggle_calculation_button(frm);
    },

    quality_groups: function(frm) {
        toggle_calculation_button(frm);
    },

    agricultural_land_purpose: function(frm) {
        toggle_calculation_button(frm);
    },
    
    territorial_unit_name: function(frm) {
        toggle_calculation_button(frm);
    },

    industrial_land_purpose: function(frm) {
        toggle_calculation_button(frm);
    },
    
    validate: function(frm) {
        if (!frm.doc.land && !frm.doc.property) {
            frappe.msgprint('Please select either Land or Property');
            frappe.validated = false;
            return;
        }
        
        if (!frm.doc.custom_asset_type) {
            frappe.msgprint('Please select an Asset Type');
            frappe.validated = false;
            return;
        }
        
        if (frm.doc.custom_asset_type === "Kənd təsərrüfatı təyinatlı torpaq sahələri") {
            const required_fields = [
                ['agricultural_purpose', 'Purpose'],
                ['cadastral_district_name', 'Name of the Cadastral Valuation District'],
                ['quality_groups', 'Quality Groups'],
                ['agricultural_land_purpose', 'Purpose of the Land Plot']
            ];
            
            for (let [field, label] of required_fields) {
                if (!frm.doc[field]) {
                    frappe.msgprint(`${label} is required for Agricultural Land`);
                    frappe.validated = false;
                    return;
                }
            }
        }
        
        if (frm.doc.custom_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") {
            const required_fields = [
                ['territorial_unit_name', 'Name of the Territorial Unit'],
                ['industrial_land_purpose', 'Purpose of the Land Plot']
            ];
            
            for (let [field, label] of required_fields) {
                if (!frm.doc[field]) {
                    frappe.msgprint(`${label} is required for Industrial/Commercial Land`);
                    frappe.validated = false;
                    return;
                }
            }
        }
        
        if (frm.doc.custom_asset_type === "Vergidən azad olunan əsas vəsaitlər") {
            const required_fields = [
                ['tax_exempt_tax_article', 'Tax Article'],
                ['tax_exempt_settlements', 'Settlements']
            ];
            
            for (let [field, label] of required_fields) {
                if (!frm.doc[field]) {
                    frappe.msgprint(`${label} is required for Tax Exempt Assets`);
                    frappe.validated = false;
                    return;
                }
            }
        }
        
        if (frm.doc.custom_asset_type === "Vergiyə cəlb olunan əsas vəsaitlər") {
            const required_fields = [
                ['taxable_settlements', 'Settlements'],
                ['taxable_asset_type', 'Taxable Asset Type']
            ];
            
            for (let [field, label] of required_fields) {
                if (!frm.doc[field]) {
                    frappe.msgprint(`${label} is required for Taxable Assets`);
                    frappe.validated = false;
                    return;
                }
            }
        }
    }
});

function update_area_field_label(frm) {
    let asset_type = frm.doc.custom_asset_type;
    
    if (!asset_type) {
        frm.set_df_property('area', 'label', 'Area');
        frm.set_df_property('area', 'description', 'Select asset type first');
        frm.set_df_property('area', 'hidden', 1);
        frm.refresh_field('area');
        return;
    }
    
    if (asset_type === 'Kənd təsərrüfatı təyinatlı torpaq sahələri') {
        frm.set_df_property('area', 'hidden', 0);
        
        let agricultural_purpose_id = frm.doc.agricultural_purpose;
        
        if (!agricultural_purpose_id) {
            frm.set_df_property('area', 'label', 'Area');
            frm.set_df_property('area', 'description', 'Select agricultural purpose to determine unit (Sq.m or hectares)');
        } else {
            frappe.db.get_value('Agricultural Purpose Type', agricultural_purpose_id, 'purpose_name', function(r) {
                if (r && r.purpose_name) {
                    let purpose_name = r.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') {
                        frm.set_df_property('area', 'label', 'Hectare');
                        frm.set_df_property('area', 'description', 'Enter area in hectares for used agricultural land');
                    } else 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') {
                        frm.set_df_property('area', 'label', 'Hectare');
                        frm.set_df_property('area', 'description', 'Enter area in hectares for used agricultural land');
                    } else {
                        frm.set_df_property('area', 'label', 'Area');
                        frm.set_df_property('area', 'description', purpose_name);
                    }
                    
                    frm.refresh_field('area');
                } else {
                    frm.set_df_property('area', 'label', 'Area');
                    frm.set_df_property('area', 'description', 'Unit could not be determined');
                    frm.refresh_field('area');
                }
            });
        }
        
    } else if (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') {
        frm.set_df_property('area', 'hidden', 0);
        frm.set_df_property('area', 'label', 'Sq.m');
        frm.set_df_property('area', 'description', 'Enter area in square meters for industrial land');
        frm.refresh_field('area');
        
    } else {
        frm.set_df_property('area', 'hidden', 1);
        frm.set_df_property('area', 'label', 'Area');
        frm.set_df_property('area', 'description', '');
        frm.refresh_field('area');
    }
}

function handle_category_checkboxes(frm, current_field) {
    if (frm.doc[current_field]) {
        const other_field = current_field === 'land' ? 'property' : 'land';
        if (frm.doc[other_field]) {
            frm.set_value(other_field, 0);
        }
    }
    
    setup_asset_type_options(frm);
    setup_asset_fields(frm);
}

function setup_asset_type_options(frm) {
    let options = '\n';
    
    if (frm.doc.land) {
        options += 'Kənd təsərrüfatı təyinatlı torpaq sahələri\nSənaye, tikinti, nəqliyyat, rabitə, ticarət-məişət xidməti və digər xüsusi təyinatlı torpaq sahələri';
    } else if (frm.doc.property) {
        options += 'Vergidən azad olunan əsas vəsaitlər\nVergiyə cəlb olunan əsas vəsaitlər';
    }
    
    frm.set_df_property('custom_asset_type', 'options', options);
    
    if (frm.doc.land || frm.doc.property) {
        frm.set_df_property('custom_asset_type', 'hidden', 0);
        frm.set_df_property('custom_asset_type', 'reqd', 1);
    } else {
        frm.set_df_property('custom_asset_type', 'hidden', 1);
        frm.set_df_property('custom_asset_type', 'reqd', 0);
        frm.set_value('custom_asset_type', '');
    }
}

function show_common_fields(frm) {
    frm.set_df_property('common_land_section', 'hidden', 0);
    frm.set_df_property('tax_exempt_area', 'hidden', 0);
    frm.set_df_property('tax_exempt_area', 'description', 
        'Enter the tax-exempt area in square meters');
}

function hide_all_conditional_fields(frm) {
    const agricultural_fields = [
        'agricultural_land_section',
        'agricultural_purpose',
        'cadastral_district_name',
        'cadastral_district_code',
        'quality_groups',
        'agricultural_land_purpose',
        'agricultural_column_break',
        'agricultural_tax_article'
    ];
    
    const industrial_fields = [
        'industrial_land_section',
        'territorial_unit_name',
        'territorial_unit_code',
        'industrial_land_purpose',
        'mining_note',
        'industrial_column_break',
        'industrial_tax_article'
    ];
    
    const tax_exempt_fields = [
        'tax_exempt_assets_section',
        'tax_exempt_tax_article',
        'tax_exempt_settlements'
    ];
    
    const taxable_fields = [
        'taxable_assets_section',
        'taxable_settlements',
        'taxable_asset_type'
    ];
    
    [...agricultural_fields, ...industrial_fields, ...tax_exempt_fields, ...taxable_fields].forEach(fieldname => {
        frm.set_df_property(fieldname, 'hidden', 1);
        frm.set_df_property(fieldname, 'reqd', 0);
    });
}

function setup_asset_fields(frm) {
    const asset_type = frm.doc.custom_asset_type;
    
    setup_asset_type_options(frm);
    hide_all_conditional_fields(frm);
    show_common_fields(frm);
    
    if (!asset_type) {
        frm.refresh_fields();
        return;
    }
    
    if (asset_type === "Kənd təsərrüfatı təyinatlı torpaq sahələri") {
        setup_agricultural_fields(frm);
    } else if (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") {
        setup_industrial_fields(frm);
    } else if (asset_type === "Vergidən azad olunan əsas vəsaitlər") {
        setup_tax_exempt_fields(frm);
    } else if (asset_type === "Vergiyə cəlb olunan əsas vəsaitlər") {
        setup_taxable_fields(frm);
    }
    
    frm.refresh_fields();
}

function setup_agricultural_fields(frm) {
    const agricultural_fields = [
        'agricultural_land_section',
        'agricultural_purpose',
        'cadastral_district_name',
        'cadastral_district_code',
        'quality_groups',
        'agricultural_land_purpose',
        'agricultural_column_break',
        'agricultural_tax_article'
    ];
    
    agricultural_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'hidden', 0);
    });
    
    const required_agricultural_fields = [
        'agricultural_purpose',
        'cadastral_district_name',
        'quality_groups',
        'agricultural_land_purpose'
    ];
    
    required_agricultural_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'reqd', 1);
    });
    
    frm.set_query('agricultural_tax_article', function() {
        return {
            query: "jey_erp.asset.get_land_tax_articles"  
        };
    });
    
    frm.set_df_property('agricultural_purpose', 'description', 
        'Select the purpose for agricultural land taxation');
    frm.set_df_property('cadastral_district_name', 'description', 
        'Select the cadastral valuation district');
    frm.set_df_property('agricultural_tax_article', 'description', 
        'Select the applicable tax article for land');
}

function setup_industrial_fields(frm) {
    const industrial_fields = [
        'industrial_land_section',
        'territorial_unit_name',
        'territorial_unit_code',
        'industrial_land_purpose',
        'mining_note',
        'industrial_column_break',
        'industrial_tax_article'
    ];
    
    industrial_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'hidden', 0);
    });
    
    const required_industrial_fields = [
        'territorial_unit_name',
        'industrial_land_purpose'
    ];
    
    required_industrial_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'reqd', 1);
    });
    
    frm.set_query('industrial_tax_article', function() {
        return {
            query: "jey_erp.asset.get_land_tax_articles"  
        };
    });
    
    frm.set_df_property('territorial_unit_name', 'description', 
        'Select the appropriate territorial unit');
    frm.set_df_property('industrial_land_purpose', 'description', 
        'Specify the purpose of the industrial/commercial land plot');
    frm.set_df_property('mining_note', 'description', 
        'Check if this relates to mining operations');
    frm.set_df_property('industrial_tax_article', 'description', 
        'Select the applicable tax article for land');
}

function setup_tax_exempt_fields(frm) {
    const tax_exempt_fields = [
        'tax_exempt_assets_section',
        'tax_exempt_tax_article',
        'tax_exempt_settlements'
    ];
    
    tax_exempt_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'hidden', 0);
    });
    
    const required_tax_exempt_fields = [
        'tax_exempt_tax_article',
        'tax_exempt_settlements'
    ];
    
    required_tax_exempt_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'reqd', 1);
    });
    
    frm.set_query('tax_exempt_tax_article', function() {
        return {
            query: "jey_erp.asset.get_tax_exempt_articles"  
        };
    });
    
    frm.set_df_property('tax_exempt_tax_article', 'description', 
        'Select the applicable tax article for tax exempt assets');
    frm.set_df_property('tax_exempt_settlements', 'description', 
        'Select the settlement type');
}

function setup_taxable_fields(frm) {
    const taxable_fields = [
        'taxable_assets_section',
        'taxable_settlements',
        'taxable_asset_type'
    ];
    
    taxable_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'hidden', 0);
    });
    
    const required_taxable_fields = [
        'taxable_settlements',
        'taxable_asset_type'
    ];
    
    required_taxable_fields.forEach(fieldname => {
        frm.set_df_property(fieldname, 'reqd', 1);
    });
    
    frm.set_df_property('taxable_settlements', 'description', 
        'Select the settlement type');
    frm.set_df_property('taxable_asset_type', 'description', 
        'Select the type of taxable asset');
}

function clear_dependent_fields(frm) {
    const conditional_fields = [
        'agricultural_purpose',
        'cadastral_district_name',
        'cadastral_district_code',
        'quality_groups',
        'agricultural_land_purpose',
        'agricultural_tax_article',
        'territorial_unit_name',
        'territorial_unit_code',
        'industrial_land_purpose',
        'mining_note',
        'industrial_tax_article',
        'tax_exempt_tax_article',
        'tax_exempt_settlements',
        'taxable_settlements',
        'taxable_asset_type'
    ];
    
    conditional_fields.forEach(fieldname => {
        frm.set_value(fieldname, '');
    });
}

function should_show_calculation_button(frm) {
    return frm.doc.custom_asset_type === "Kənd təsərrüfatı təyinatlı torpaq sahələri" ||
           frm.doc.custom_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";
}

function can_calculate_agricultural_amount(frm) {
    return frm.doc.custom_asset_type === "Kənd təsərrüfatı təyinatlı torpaq sahələri" &&
           frm.doc.area &&
           frm.doc.cadastral_district_name && 
           frm.doc.quality_groups && 
           frm.doc.agricultural_land_purpose;
}

function can_calculate_industrial_amount(frm) {
    return frm.doc.custom_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" &&
           frm.doc.area &&
           frm.doc.territorial_unit_name && 
           frm.doc.industrial_land_purpose;
}

function can_calculate_amount(frm) {
    return can_calculate_agricultural_amount(frm) || can_calculate_industrial_amount(frm);
}

function add_calculation_button(frm) {
    if (frm.custom_buttons && frm.custom_buttons['Calculate Gross Amount']) {
        return;
    }
    
    frm.add_custom_button('Calculate Gross Amount', function() {
        if (can_calculate_agricultural_amount(frm)) {
            calculate_agricultural_gross_purchase_amount(frm);
        } else if (can_calculate_industrial_amount(frm)) {
            calculate_industrial_gross_purchase_amount(frm);
        }
    }, 'Actions');
    
    update_calculation_button_state(frm);
}

function update_calculation_button_state(frm) {
    const button = frm.custom_buttons && frm.custom_buttons['Calculate Gross Amount'];
    if (button) {
        if (can_calculate_amount(frm)) {
            button.removeClass('btn-default').addClass('btn-primary');
            button.prop('disabled', false);
        } else {
            button.removeClass('btn-primary').addClass('btn-default');
            button.prop('disabled', true);
        }
    }
}

function toggle_calculation_button(frm) {
    if (should_show_calculation_button(frm)) {
        if (!frm.custom_buttons || !frm.custom_buttons['Calculate Gross Amount']) {
            add_calculation_button(frm);
        } else {
            update_calculation_button_state(frm);
        }
    } else {
        if (frm.custom_buttons && frm.custom_buttons['Calculate Gross Amount']) {
            frm.remove_custom_button('Calculate Gross Amount');
        }
    }
}

function calculate_agricultural_gross_purchase_amount(frm) {
    if (!can_calculate_agricultural_amount(frm)) {
        frappe.msgprint('Please fill in all required fields: Area, Cadastral District, Quality Groups, and Purpose of Land Plot');
        return;
    }
    
    frappe.show_alert({
        message: 'Calculating...',
        indicator: 'blue'
    });
    
    frappe.call({
        method: 'jey_erp.asset.calculate_gross_purchase_amount',
        args: {
            area_value: frm.doc.area,
            cadastral_district_name: frm.doc.cadastral_district_name,
            quality_groups: frm.doc.quality_groups,
            agricultural_land_purpose: frm.doc.agricultural_land_purpose,
            agricultural_purpose_name: frm.doc.agricultural_purpose
        },
        callback: function(r) {
            if (r.message) {
                frm.set_value('gross_purchase_amount', r.message.gross_purchase_amount);
                
                const details = r.message.calculation_details;
                let unit_text = details.original_unit || 'units';
                
                frappe.msgprint({
                    title: 'Agricultural Land Calculation Completed',
                    message: `
                        <p><strong>Formula:</strong> ${details.formula}</p>
                        <p><strong>Result:</strong> ${r.message.gross_purchase_amount.toFixed(2)}</p>
                        <hr>
                        <p><strong>Calculation Details:</strong></p>
                        <ul>
                            <li>Original Area: ${details.original_value} ${unit_text}</li>
                            <li>Converted to Hectares: ${details.hectare}</li>
                            <li>Score: ${details.score}</li>
                            <li>Markup: ${details.markup}</li>
                        </ul>
                    `,
                    indicator: 'green'
                });
                
                frm.refresh_field('gross_purchase_amount');
            }
        },
        error: function(r) {
            frappe.msgprint({
                title: 'Calculation Error',
                message: r.message || 'An error occurred during calculation',
                indicator: 'red'
            });
        }
    });
}

function calculate_industrial_gross_purchase_amount(frm) {
    if (!can_calculate_industrial_amount(frm)) {
        frappe.msgprint('Please fill in all required fields: Area, Territorial Unit, and Purpose of Land Plot');
        return;
    }
    
    frappe.show_alert({
        message: 'Calculating...',
        indicator: 'blue'
    });
    
    frappe.call({
        method: 'jey_erp.asset.calculate_industrial_gross_purchase_amount',
        args: {
            area_sqm: frm.doc.area,
            territorial_unit_name: frm.doc.territorial_unit_name,
            industrial_land_purpose: frm.doc.industrial_land_purpose
        },
        callback: function(r) {
            if (r.message) {
                frm.set_value('gross_purchase_amount', r.message.gross_purchase_amount);
                
                const details = r.message.calculation_details;
                let calculation_parts_html = '';
                
                details.calculation_parts.forEach((part, index) => {
                    calculation_parts_html += `<li>Part ${index + 1}: ${part.formula}</li>`;
                });
                
                frappe.msgprint({
                    title: 'Industrial Land Calculation Completed',
                    message: `
                        <p><strong>Formula:</strong> ${details.formula}</p>
                        <p><strong>Result:</strong> ${r.message.gross_purchase_amount.toFixed(2)}</p>
                        <hr>
                        <p><strong>Calculation Details:</strong></p>
                        <ul>
                            <li>Area: ${frm.doc.area} Sq.m</li>
                            <li>Score up to 10,000 Sq.m: ${details.scores_used.up_to_10000}</li>
                            <li>Score above 10,000 Sq.m: ${details.scores_used.above_10000}</li>
                        </ul>
                        <p><strong>Calculation Parts:</strong></p>
                        <ul>
                            ${calculation_parts_html}
                        </ul>
                    `,
                    indicator: 'green'
                });
                
                frm.refresh_field('gross_purchase_amount');
            }
        },
        error: function(r) {
            frappe.msgprint({
                title: 'Calculation Error',
                message: r.message || 'An error occurred during calculation',
                indicator: 'red'
            });
        }
    });
}