import { describe, it, expect, beforeEach } from 'vitest'
import { initCommissionCalculator } from '../../assets/modules/commission-calculator.js'

describe('initCommissionCalculator', () => {
    beforeEach(() => {
        document.body.innerHTML = ''
    })

    it('does nothing without calculator element', () => {
        expect(() => initCommissionCalculator()).not.toThrow()
    })

    it('does nothing without price input', () => {
        document.body.innerHTML = '<div id="commission-calculator" data-eticket-rate="5" data-stripe-rate="1.5" data-stripe-fixed="0.25"></div>'
        expect(() => initCommissionCalculator()).not.toThrow()
    })

    it('uses default stripe rate and fixed when not provided', () => {
        document.body.innerHTML = `
            <input type="number" id="billet_price" value="10">
            <div id="commission-calculator" data-eticket-rate="0">
                <span id="calc-price"></span>
                <span id="calc-eticket"></span>
                <span id="calc-stripe"></span>
                <span id="calc-total"></span>
                <span id="calc-net"></span>
            </div>
        `
        initCommissionCalculator()

        // Default stripe: 10 * 1.5% + 0.25 = 0.40
        expect(document.getElementById('calc-stripe').textContent).toBe('- 0,40 \u20AC')
    })

    function setupCalculator(eticketRate = '5', price = '') {
        document.body.innerHTML = `
            <input type="number" id="billet_price" value="${price}">
            <div id="commission-calculator" data-eticket-rate="${eticketRate}" data-stripe-rate="1.5" data-stripe-fixed="0.25">
                <span id="calc-price"></span>
                <span id="calc-eticket"></span>
                <span id="calc-stripe"></span>
                <span id="calc-total"></span>
                <span id="calc-net"></span>
            </div>
        `
        initCommissionCalculator()
    }

    it('shows zero values when price is empty', () => {
        setupCalculator('5', '')

        expect(document.getElementById('calc-price').textContent).toBe('0,00 \u20AC')
        expect(document.getElementById('calc-net').textContent).toBe('0,00 \u20AC')
    })

    it('calculates commissions for 10 EUR with 5% eticket rate', () => {
        setupCalculator('5', '10')

        // E-Ticket: 10 * 5% = 0.50
        // Stripe: 10 * 1.5% + 0.25 = 0.40
        // Total: 0.90
        // Net: 9.10
        expect(document.getElementById('calc-price').textContent).toBe('10,00 \u20AC')
        expect(document.getElementById('calc-eticket').textContent).toBe('- 0,50 \u20AC')
        expect(document.getElementById('calc-stripe').textContent).toBe('- 0,40 \u20AC')
        expect(document.getElementById('calc-total').textContent).toBe('- 0,90 \u20AC')
        expect(document.getElementById('calc-net').textContent).toBe('9,10 \u20AC')
    })

    it('calculates with 0% eticket rate', () => {
        setupCalculator('0', '20')

        // E-Ticket: 0
        // Stripe: 20 * 1.5% + 0.25 = 0.55
        // Net: 19.45
        expect(document.getElementById('calc-eticket').textContent).toBe('- 0,00 \u20AC')
        expect(document.getElementById('calc-stripe').textContent).toBe('- 0,55 \u20AC')
        expect(document.getElementById('calc-net').textContent).toBe('19,45 \u20AC')
    })

    it('updates on input event', () => {
        setupCalculator('5', '0')

        const input = document.getElementById('billet_price')
        input.value = '15'
        input.dispatchEvent(new Event('input', { bubbles: true }))

        // E-Ticket: 15 * 5% = 0.75
        // Stripe: 15 * 1.5% + 0.25 = 0.475 → 0.48
        // Total: 1.225 → 1.23 (but floating point...)
        expect(document.getElementById('calc-price').textContent).toBe('15,00 \u20AC')
        expect(document.getElementById('calc-eticket').textContent).toBe('- 0,75 \u20AC')

        const net = document.getElementById('calc-net').textContent
        expect(net).toContain('\u20AC')
    })

    it('net is never negative', () => {
        setupCalculator('99', '0.01')

        // With 99% commission the net would be very low or negative after stripe
        const net = document.getElementById('calc-net').textContent
        expect(net).toBe('0,00 \u20AC')
    })
})
