import { ConfigPlugin, createRunOncePlugin, withPlugins, withInfoPlist, withAndroidManifest, AndroidConfig } from '@expo/config-plugins';

const { addMetaDataItemToMainApplication, getMainApplicationOrThrow } = AndroidConfig.Manifest;
const pkg = require('../../package.json');

interface TikTokOpenSDKPluginProps {
  iosClientKey: string;
  androidClientKey: string;
  iosUniversalLink?: string;
  scheme?: string;
  redirectScheme?: string;
}

const withTikTokOpenSDKAndroid: ConfigPlugin<TikTokOpenSDKPluginProps> = (config, props) => {
  return withAndroidManifest(config, (config) => {
    const mainApplication = getMainApplicationOrThrow(config.modResults);

    // Add TikTok SDK activities
    addMetaDataItemToMainApplication(mainApplication, 'com.bytedance.sdk.appKey', props.androidClientKey);

    return config;
  });
};

const withTikTokOpenSDKIOS: ConfigPlugin<TikTokOpenSDKPluginProps> = (config, props) => {
  return withPlugins(config, [
    [
      withInfoPlist,
      (config) => {
        config.modResults.LSApplicationQueriesSchemes = config.modResults.LSApplicationQueriesSchemes || [];
        if (!config.modResults.LSApplicationQueriesSchemes.includes('tiktokopensdk')) {
          config.modResults.LSApplicationQueriesSchemes.push('tiktokopensdk');
        }
        if (!config.modResults.LSApplicationQueriesSchemes.includes('tiktoksharesdk')) {
          config.modResults.LSApplicationQueriesSchemes.push('tiktoksharesdk');
        }
        if (!config.modResults.LSApplicationQueriesSchemes.includes('snssdk1180')) {
          config.modResults.LSApplicationQueriesSchemes.push('snssdk1180');
        }
        if (!config.modResults.LSApplicationQueriesSchemes.includes('musically')) {
          config.modResults.LSApplicationQueriesSchemes.push('musically');
        }

        config.modResults.TikTokClientKey = props.iosClientKey;
        if (props.iosUniversalLink) {
          config.modResults.TikTokUniversalLink = props.iosUniversalLink;
        }
        if (props.scheme) {
          config.modResults.TikTokRedirectScheme = props.scheme;
        }
        if (props.redirectScheme) {
          config.modResults.TikTokRedirectScheme = props.redirectScheme;
        }

        return config;
      },
    ],
  ]);
};

const withTikTokOpenSDK: ConfigPlugin<TikTokOpenSDKPluginProps> = (config, props) => {
  return withPlugins(config, [
    [withTikTokOpenSDKAndroid, props],
    [withTikTokOpenSDKIOS, props],
  ]);
};

export = createRunOncePlugin(withTikTokOpenSDK, pkg.name, pkg.version);
