var DeviceDetector = function(){};

DeviceDetector.getUserAgent = function (request) {

    var operaUA = request.getHeader('X-OPERAMINI-PHONE-UA');
    if (operaUA) {
        return operaUA;
    }

    var skyfireUA = request.getHeader('X-SKYFIRE-PHONE');
    if (skyfireUA) {
        return skyfireUA;
    }

    var defaultUA = request.getHeader('USER-AGENT');
    if (defaultUA) {
        return defaultUA;
    }

    return null;
};

DeviceDetector.getNormalizedUserAgent = function (request) {
    if (DeviceDetector.isBot(request)) {
        if (DeviceDetector.isMobile(request)) {
            return DeviceDetector.NUA.MOBILE_BOT;
        }

        return DeviceDetector.NUA.BOT;
    }

    if (DeviceDetector.isTablet(request)) {
        return DeviceDetector.NUA.TABLET;
    }

    if (DeviceDetector.isMobile(request)) {
        return DeviceDetector.NUA.MOBILE;
    }

    return DeviceDetector.NUA.DESKTOP;
};

DeviceDetector.isDesktop = function (request) {
    var ua = DeviceDetector.getUserAgent(request);
    if (ua) {
        return !DeviceDetector.RegExp.RE_MOBILE.test(ua) &&
               !DeviceDetector.isTablet(request) &&
               (DeviceDetector.RegExp.RE_DESKTOP.test(ua) ||
                DeviceDetector.RegExp.RE_BOT.test(ua));
    }
    return true;
};

DeviceDetector.isBot = function (request) {
    var ua = DeviceDetector.getUserAgent(request);
    if (ua) {
        return DeviceDetector.RegExp.RE_BOT.test(ua);
    }
    return false;
};

DeviceDetector.isMobile = function (request) {
    var ua = DeviceDetector.getUserAgent(request);
    if (ua) {
        return DeviceDetector.RegExp.RE_MOBILE.test(ua);
    }
    return false;
};

DeviceDetector.isTablet = function (request) {
    var ua = DeviceDetector.getUserAgent(request);

    if (ua && DeviceDetector.RegExp.RE_TABLET.test(ua)) {

        // tutaj mamy wszystkie androidy i ipad-a
        if (DeviceDetector.RegExp.RE_MOBILE_ANDROID_EXCEPTIONS.test(ua)) {
            return false;
        }

        // tutaj mamy ipad-a i android tablet
        return true;
    }

    return false;
};

// wykrywanie urzadzen typu desktop
DeviceDetector.RegExp = {};
DeviceDetector.RegExp.RE_MOBILE = /(iphone|ipod|kindle|silk|blackberry|android.+mobi|palm|windows\s+(ce|phone)|googlebot-mobile|bb1[0-9].+mobile)/i;
DeviceDetector.RegExp.RE_MOBILE_ANDROID_EXCEPTIONS = /android.+mobi/i;
DeviceDetector.RegExp.RE_TABLET = /(ipad|android)/i;
DeviceDetector.RegExp.RE_DESKTOP = /(windows|linux|os\s+[x9]|solaris|bsd|cros)/i;
DeviceDetector.RegExp.RE_BOT = /(facebookplatform|facebookexternalhit|ovis|surealived|spider|crawl|slurp|bot|curl|google|libwww|linkchecker|xenu)/i;

DeviceDetector.NUA = {};
DeviceDetector.NUA.MOBILE = 'mobile';
DeviceDetector.NUA.MOBILE_BOT = 'mobile-bot';
DeviceDetector.NUA.TABLET = 'tablet';
DeviceDetector.NUA.DESKTOP = 'desktop';
DeviceDetector.NUA.BOT = 'bot';

exports.DeviceDetector = DeviceDetector;
