#include args.js

const MamiWindowTitle = function(options) {
    options = MamiArguments.verify(options, [
        MamiArguments.type('getName', 'function', () => ''),
        MamiArguments.type('setTitle', 'function', text => document.title = text),
        MamiArguments.check('strobeInterval', 500, val => {
            const valType = typeof val;
            return val === 'number' || val === 'function';
        }),
        MamiArguments.check('strobeRepeat', 5, val => {
            const valType = typeof val;
            return val === 'number' || val === 'function';
        }),
    ]);

    const getName = options.getName;

    const setTitleImpl = options.setTitle;
    const setTitle = text => {
        if(text === undefined || text === null)
            text = '';
        else if(typeof text !== 'string')
            text = text.toString();

        setTitleImpl(text);
    };

    const defaultStrobeInterval = typeof options.strobeInterval === 'function' ? options.strobeInterval : () => options.strobeInterval;
    const defaultStrobeRepeat = typeof options.strobeRepeat === 'function' ? options.strobeRepeat : () => options.strobeRepeat;

    let activeStrobe;

    const clearTitle = () => {
        if(activeStrobe === undefined)
            return;

        clearInterval(activeStrobe);
        activeStrobe = undefined;

        setTitle(getName());
    };

    const strobeTitle = (titles, interval, repeat) => {
        if(!Array.isArray(titles))
            throw 'titles must be an array of strings';
        if(titles.length < 1)
            throw 'titles must contain at least one item';
        if(typeof interval !== 'number')
            interval = defaultStrobeInterval();
        if(typeof repeat !== 'number')
            repeat = defaultStrobeRepeat();

        const target = titles.length * repeat;
        let round = 0;

        clearTitle();
        setTitle(titles[0]);

        activeStrobe = setInterval(() => {
            if(round >= target) {
                clearTitle();
                setTitle(getName());
                return;
            }

            ++round;
            setTitle(titles[round % titles.length]);
        }, interval);
    };

    return {
        set: setTitle,
        clear: clearTitle,
        strobe: strobeTitle,
    };
};
