import 'dart:ui';

import 'dart:js_interop'; 

import 'package:pshared/config/common.dart';


/// Bind to the global JS `appConfig` (if it exists).
@JS()
external AppConfig? get appConfig;

/// A staticInterop class for the JS object returned by `appConfig`.
@JS()
@staticInterop
class AppConfig {}

/// Extension methods to expose each property on `AppConfig`.
extension AppConfigExtension on AppConfig {
  external String? get apiProto;
  external String? get apiHost;
  external String? get apiEndpoint;
  external String? get amplitudeSecret;
  external String? get amplitudeServerZone;
  external String? get posthogApiKey;
  external String? get posthogHost;
  external String? get defaultLocale;
  external String? get wsProto;
  external String? get wsEndpoint;
  external int? get defaultDimensionLength;
  external String? get themeColor;
  external String? get clientId;
}

class Constants extends CommonConstants {
  static const String _clientIdWeb = 'net.sendico.web-3f9a2c6e-7b4d-4e8a-9c2a-1d5f6b8e0a11';

  // Just re-expose these from CommonConstants:
  static Locale get defaultLocale => CommonConstants.defaultLocale;
  static String get clientId => _clientIdWeb;
  static String get accessTokenStorageKey => CommonConstants.accessTokenStorageKey;
  static String get refreshTokenStorageKey => CommonConstants.refreshTokenStorageKey;
  static String get currentOrgKey => CommonConstants.currentOrgKey;
  static String get apiUrl => CommonConstants.apiUrl;
  static String get serviceUrl => CommonConstants.serviceUrl;
  static String get posthogApiKey => CommonConstants.posthogApiKey;
  static String get posthogHost => CommonConstants.posthogHost;
  static int get defaultDimensionLength => CommonConstants.defaultDimensionLength;
  static String get deviceIdStorageKey => CommonConstants.deviceIdStorageKey;
  static String get nilObjectRef => CommonConstants.nilObjectRef;
  static Color get themeColor => CommonConstants.themeColor;

  static Future<void> initialize() async {
    // Try to grab the JS `appConfig` if it exists:
    final config = appConfig;

    if (config != null) {
      // Build a Dart Map from the JS object’s properties:
      final configJson = <String, dynamic>{
        'apiProto': config.apiProto,
        'apiHost': config.apiHost,
        'apiEndpoint': config.apiEndpoint,
        'amplitudeSecret': config.amplitudeSecret,
        'amplitudeServerZone': config.amplitudeServerZone,
        'posthogApiKey': config.posthogApiKey,
        'posthogHost': config.posthogHost,
        'defaultLocale': config.defaultLocale,
        'wsProto': config.wsProto,
        'wsEndpoint': config.wsEndpoint,
        'defaultDimensionLength': config.defaultDimensionLength,
        'themeColor': config.themeColor,
        // If the JS side didn’t supply a clientId, fall back to our Dart constant
        'clientId': config.clientId ?? _clientIdWeb,
      };

      CommonConstants.applyConfiguration(configJson);
    } else {
      // No appConfig on JS side → just use the default Dart client ID.
      CommonConstants.clientId = _clientIdWeb;
    }
  }
}
