/*************************************************************
 *
 *  Copyright (c) 2024-2026 The MathJax Consortium
 *
 *  Licensed under the Apache License, Version 2.0 (the "License");
 *  you may not use this file except in compliance with the License.
 *  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 *  Unless required by applicable law or agreed to in writing, software
 *  distributed under the License is distributed on an "AS IS" BASIS,
 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *  See the License for the specific language governing permissions and
 *  limitations under the License.
 */

/**
 * @file  Provides the browser window and document values
 *
 * @author dpvc@mathjax.org (Davide Cervone)
 */

declare const process: { platform: string };

/**
 * True if there is a window object
 */
export const hasWindow = typeof window !== 'undefined';

/**
 * The browsers window and document objects, if any
 */
export const context = {
  window: hasWindow ? window : null,
  document: hasWindow ? window.document : null,
  os: (() => {
    if (hasWindow && window.navigator) {
      const app = window.navigator.appVersion;
      const osNames = [
        ['Win', 'Windows'],
        ['Mac', 'MacOS'],
        ['X11', 'Unix'],
        ['Linux', 'Unix'],
      ];
      for (const [key, os] of osNames) {
        if (app.includes(key)) {
          return os;
        }
      }
      if (window.navigator.userAgent.includes('Android')) {
        return 'Unix';
      }
    } else if (typeof process !== 'undefined') {
      return (
        {
          linux: 'Unix',
          android: 'Unix',
          aix: 'Unix',
          freebsd: 'Unix',
          netbsd: 'Unix',
          openbsd: 'Unix',
          sunos: 'Unix',
          darwin: 'MacOS',
          win32: 'Windows',
          cygwin: 'Windows',
        }[process.platform] || process.platform
      );
    }
    return 'unknown';
  })(),
  path: (file: string) => file,
};

if (context.os === 'Windows') {
  context.path = (file: string) =>
    file.match(/^[/\\]?[a-zA-Z]:[/\\]/)
      ? 'file://' + file.replace(/\\/g, '/').replace(/^\//, '')
      : file.replace(/^\//, 'file:///');
}
