/* global __db, VM, __aud, nil, vm, $audio, _audio */

var Audio = function () {
    var T = this, A = arguments;
    T.api = _audio;

    T.rate = A[0] || 44100;
    T.id = T.api.init(T.rate);
    T.samples = [];
    var virgin = true;
    var events = [];
    var reinit = function () {
        T.api.kill(T.id);
        T.id = T.api.init(T.rate);
    };

    T.release = function () {
        T.api.kill(T.id);
    };

    T.loadSample = function (file, cb) {
        if (typeof cb === "undefined") {
            cb = nil;
        }
        var tag = file.toString().lastDelimiter("/").toString().ignorelastDelimiter(".");
        if (this.api.sload(T.id, file, tag) > 0) {
            T.samples.push(tag);
            cb(tag);
        }
    };

    T.play = function (path) {
        return T.api.stream(T.id, path);
    };

    T.playSample = function (tag) {
        if (T.samples.indexOf(tag) > -1) {
            return T.api.splay(T.id, tag);
        } else {
            return -1;
        }
    };
    T.playDSP = function (f) {
        return T.api.playd(T.id, f);
    };
    T.on = function (e, cb) {
        events.push({E: e, C: cb});
    };

    var callback = function (e, p) {
        events.forEach(function (o) {
            if (e === o.E) {
                o.C(p);
            }
        });
    };
    T.muted = false;

    T.api.monitor(function (e) {
        switch (e) {
            case 0:
                callback("activity", false);
                break;
            case 1:
                callback("activity", true);
                break;
            case 2:
                if (virgin === false) {
                    console.log("reinitializing Audio output..");
                    reinit();
                    virgin = true;
                    setTimeout(function () {
                        callback("reinit");
                    }, 3000);
                }
                callback("device", "change");
                T.muted = false;
                callback("mute", false);
                break;
            case 3:
                T.muted = true;
                callback("mute", true);
                break;
            case 4:
                T.muted = true;
                virgin = false;
                callback("mute", true);
                callback("device", "disconnect");
                break;
            case 5:
                if (virgin === false) {
                    console.log("reinitializing Audio output..");
                    virgin = true;
                    reinit();
                    setTimeout(function () {
                        callback("reinit");
                    }, 3000);
                }
                callback("device", "connect");
                T.muted = false;
                callback("mute", false);
                break;
            case 6:
                T.muted = true;
                virgin = false;
                callback("device", "stall");
                callback("mute", true);
                break;
            case 7:
                T.muted = false;
                callback("mute", false);
                break;
            default:
                if (e >= 1000) {
                    var volume = e - 1000;
                    if (T.muted === true && volume > 0) {
                        T.muted = false;
                        callback("mute", false);
                    }
                    if (volume === 0) {
                        T.muted === true;
                        callback("mute", true);
                    } else {
                        T.muted = false;
                        callback("mute", false);
                    }
                    callback("volume", e - 1000);
                }
                break;
        }
    });
    vm.release(function () {
        T.release();
    });
    return T;
};