// Copyright (c) 2017 Uber Technologies, Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal
// in the Software without restriction, including without limitation the rights
// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
// copies of the Software, and to permit persons to whom the Software is
// furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
// THE SOFTWARE.

// This function is needed in initialization stages,
// make sure it can be imported in isolation

import {isBrowser} from './is-browser';
import {isElectron} from './is-electron';
import {navigator} from './globals';

declare global {
  var chrome: boolean; // eslint-disable-line no-var
  var safari: boolean; // eslint-disable-line no-var
  var mozInnerScreenX: number; // eslint-disable-line no-var
}

export function isMobile(): boolean {
  return typeof globalThis.orientation !== 'undefined';
}

// Simple browser detection
// `mockUserAgent` parameter allows user agent to be overridden for testing
/* eslint-disable complexity */
export function getBrowser(
  mockUserAgent?: string
): 'Node' | 'Electron' | 'Chrome' | 'Firefox' | 'Safari' | 'Edge' | 'Unknown' {
  if (!mockUserAgent && !isBrowser()) {
    return 'Node';
  }
  if (isElectron(mockUserAgent)) {
    return 'Electron';
  }

  const userAgent = mockUserAgent || navigator.userAgent || '';

  // NOTE: Order of tests matter, as many agents list Chrome etc.
  if (userAgent.indexOf('Edge') > -1) {
    return 'Edge';
  }
  if (globalThis.chrome) {
    return 'Chrome';
  }
  if (globalThis.safari) {
    return 'Safari';
  }
  if (globalThis.mozInnerScreenX) {
    return 'Firefox';
  }
  return 'Unknown';
}
