import { describe, expect, it } from 'vitest';
import {
    buildCsv,
    csvEscape,
    neutralizeFormula,
} from '@kview/ui-data/js/table-export';

describe('table-export CSV formula neutralization', () => {
    it('prefixes formula-leading values so a spreadsheet renders them as text', () => {
        expect(neutralizeFormula('=1+1')).toBe("'=1+1");
        expect(neutralizeFormula('+1')).toBe("'+1");
        expect(neutralizeFormula('-1')).toBe("'-1");
        expect(neutralizeFormula('@SUM(A1)')).toBe("'@SUM(A1)");
        // A tab before a formula trigger is still caught...
        expect(neutralizeFormula('\t=1+1')).toBe("'\t=1+1");
        // ...and control characters are themselves CSV formula triggers.
        expect(neutralizeFormula('\tvalue')).toBe("'\tvalue");
        expect(neutralizeFormula('\nvalue')).toBe("'\nvalue");
        expect(neutralizeFormula('\rvalue')).toBe("'\rvalue");
    });

    it('catches formulas hidden behind leading whitespace or newlines', () => {
        expect(neutralizeFormula('\n=1+1')).toBe("'\n=1+1");
        expect(neutralizeFormula('   =1+1')).toBe("'   =1+1");
        expect(neutralizeFormula('\r\n@SUM(A1)')).toBe("'\r\n@SUM(A1)");
    });

    it('catches full-width formula look-alikes', () => {
        expect(neutralizeFormula('＝1+1')).toBe("'＝1+1");
        expect(neutralizeFormula('＋1')).toBe("'＋1");
        expect(neutralizeFormula('＠SUM')).toBe("'＠SUM");
    });

    it('leaves ordinary values untouched', () => {
        expect(neutralizeFormula('Alpha Capital')).toBe('Alpha Capital');
        expect(neutralizeFormula('3')).toBe('3');
        expect(neutralizeFormula(null)).toBe('');
        expect(neutralizeFormula(' value')).toBe(' value');
    });

    it('applies neutralization and quotes every field through csvEscape and buildCsv', () => {
        expect(csvEscape('=cmd|calc')).toBe('"\'=cmd|calc"');
        expect(csvEscape('Alpha')).toBe('"Alpha"');
        expect(csvEscape('safe;=still-one-cell')).toBe('"safe;=still-one-cell"');

        const csv = buildCsv({
            columns: ['Name', 'Note'],
            rows: [['Alpha', '=HYPERLINK("http://evil")']],
        });
        expect(csv).toContain('"Alpha","\'=HYPERLINK(""http://evil"")"');
    });
});
