const appJson = require('./app.json');
const { execSync } = require('child_process');

const isDevVariant = process.env.APP_VARIANT === 'dev';
const releaseApiBaseUrl = 'https://withyou.littlelan.cn/api/v1';
const releaseUpdatesBaseUrl = 'https://updates.littlelan.cn';
const devApiBaseUrl = process.env.EXPO_PUBLIC_API_BASE_URL || 'http://192.168.31.238:8080/api/v1';

function getGitShortHash() {
  try {
    return execSync('git rev-parse --short=4 HEAD', { encoding: 'utf-8' }).trim();
  } catch {
    return '0000';
  }
}

const gitBuildSuffix = getGitShortHash();

function toManifestUrl(baseUrl, portOverride) {
  const parsed = new URL(baseUrl);
  if (portOverride != null) {
    parsed.port = String(portOverride);
  }
  parsed.pathname = '/api/manifest';
  parsed.search = '';
  parsed.hash = '';
  return parsed.toString();
}

const releaseUpdatesUrl =
  process.env.EXPO_PUBLIC_UPDATES_URL || toManifestUrl(releaseUpdatesBaseUrl);
const devUpdatesUrl =
  process.env.EXPO_PUBLIC_DEV_UPDATES_URL || toManifestUrl(devApiBaseUrl, 3001);

const expo = appJson.expo;

// 检测是否为 Web 平台
const isWeb = process.env.EXPO_TARGET === 'web' || process.env.PLATFORM === 'web';

// 原生平台特有的插件（在 Web 端会报错）
const nativeOnlyPlugins = [
  'expo-camera',
  'expo-notifications',
  'expo-background-fetch',
  'expo-media-library',
  'expo-image-picker',
  'expo-video',
  'expo-sqlite',
  './plugins/withMainActivityConfigChange',
];

// 过滤插件：Web 端排除原生插件
const filteredPlugins = isWeb
  ? expo.plugins.filter((plugin) => {
      const pluginName = Array.isArray(plugin) ? plugin[0] : plugin;
      return !nativeOnlyPlugins.includes(pluginName);
    })
  : expo.plugins;

module.exports = {
  ...expo,
  name: isDevVariant ? `${expo.name} Dev` : expo.name,
  runtimeVersion: {
    policy: 'appVersion',
  },
  updates: {
    ...(expo.updates || {}),
    url: isDevVariant ? devUpdatesUrl : releaseUpdatesUrl,
    checkAutomatically: 'ON_LOAD',
    fallbackToCacheTimeout: 0,
  },
  ios: {
    ...expo.ios,
    buildNumber: gitBuildSuffix,
  },
  android: {
    ...expo.android,
    package: 'cn.qczlit.withyou',
    versionCode: parseInt(gitBuildSuffix, 16),
  },
  // Web 端使用过滤后的插件
  plugins: filteredPlugins,
  extra: {
    ...(expo.extra || {}),
    appVariant: isDevVariant ? 'dev' : 'release',
    apiBaseUrl: isDevVariant ? devApiBaseUrl : releaseApiBaseUrl,
    updatesUrl: isDevVariant ? devUpdatesUrl : releaseUpdatesUrl,
  },
  // Web 端配置
  ...(isWeb && {
    web: {
      ...expo.web,
      build: {
        ...expo.web?.build,
        // 配置 Web 端别名，避免加载原生模块
        babel: {
          dangerouslyAddModulePathsToTranspile: [
            'react-native-webrtc',
          ],
        },
      },
    },
  }),
};
