/**
 * Copyright (c) Meta Platforms, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 *
 * @flow
 */

import type {ConsolePatchSettings} from 'react-devtools-shared/src/backend/types';
import {writeConsolePatchSettingsToWindow} from 'react-devtools-shared/src/backend/console';
import {castBool, castBrowserTheme} from 'react-devtools-shared/src/utils';

// Note: all keys should be optional in this type, because users can use newer
// versions of React DevTools with older versions of React Native, and the object
// provided by React Native may not include all of this type's fields.
export type DevToolsSettingsManager = {
  getConsolePatchSettings: ?() => string,
  setConsolePatchSettings: ?(key: string) => void,
};

export function initializeUsingCachedSettings(
  devToolsSettingsManager: DevToolsSettingsManager,
) {
  initializeConsolePatchSettings(devToolsSettingsManager);
}

function initializeConsolePatchSettings(
  devToolsSettingsManager: DevToolsSettingsManager,
) {
  if (devToolsSettingsManager.getConsolePatchSettings == null) {
    return;
  }
  const consolePatchSettingsString =
    devToolsSettingsManager.getConsolePatchSettings();
  if (consolePatchSettingsString == null) {
    return;
  }
  const parsedConsolePatchSettings = parseConsolePatchSettings(
    consolePatchSettingsString,
  );
  if (parsedConsolePatchSettings == null) {
    return;
  }
  writeConsolePatchSettingsToWindow(parsedConsolePatchSettings);
}

function parseConsolePatchSettings(
  consolePatchSettingsString: string,
): ?ConsolePatchSettings {
  const parsedValue = JSON.parse(consolePatchSettingsString ?? '{}');
  const {
    appendComponentStack,
    breakOnConsoleErrors,
    showInlineWarningsAndErrors,
    hideConsoleLogsInStrictMode,
    browserTheme,
  } = parsedValue;
  return {
    appendComponentStack: castBool(appendComponentStack) ?? true,
    breakOnConsoleErrors: castBool(breakOnConsoleErrors) ?? false,
    showInlineWarningsAndErrors: castBool(showInlineWarningsAndErrors) ?? true,
    hideConsoleLogsInStrictMode: castBool(hideConsoleLogsInStrictMode) ?? false,
    browserTheme: castBrowserTheme(browserTheme) ?? 'dark',
  };
}

export function cacheConsolePatchSettings(
  devToolsSettingsManager: DevToolsSettingsManager,
  value: ConsolePatchSettings,
): void {
  if (devToolsSettingsManager.setConsolePatchSettings == null) {
    return;
  }
  devToolsSettingsManager.setConsolePatchSettings(JSON.stringify(value));
}