import {
  ConfigPlugin,
  withAndroidManifest,
  withAppBuildGradle,
} from '@expo/config-plugins';

export interface PngmePluginProps {
  pngmeSdkVersion?: string;
  pngmeMavenUrl?: string;
}

/**
 * Add Pngme SDK repository and dependencies to Android project
 */
const withPngmeAndroid: ConfigPlugin<PngmePluginProps> = (config, props = {}) => {
  const PNGME_MAVEN_URL = props.pngmeMavenUrl || 'https://jitpack.io';
  const PNGME_SDK_VERSION = props.pngmeSdkVersion || '7.0.6';

  // Add permissions to AndroidManifest.xml
  config = withAndroidManifest(config, async (config) => {
    const manifest = config.modResults;
    
    // Ensure permissions array exists
    if (!manifest.manifest.permission) {
      manifest.manifest.permission = [];
    }
    
    const requiredPermissions = [
      'android.permission.READ_SMS',
      'android.permission.INTERNET',
      'android.permission.ACCESS_NETWORK_STATE',
    ];
    
    requiredPermissions.forEach((permission) => {
      const exists = manifest.manifest.permission?.some(
        (p: any) => p.$?.['android:name'] === permission
      );
      
      if (!exists) {
        manifest.manifest.permission?.push({
          $: {
            'android:name': permission,
          },
        });
      }
    });
    
    return config;
  });

  // Add repository and dependencies to app/build.gradle
  config = withAppBuildGradle(config, (config) => {
    let buildGradle = config.modResults.contents;
    
    // Add repository if not exists
    if (!buildGradle.includes(PNGME_MAVEN_URL)) {
      const repoPattern = /repositories\s*\{/;
      const repoReplacement = `repositories {
        maven { url '${PNGME_MAVEN_URL}' }`;
      
      buildGradle = buildGradle.replace(repoPattern, repoReplacement);
    }
    
    // Add Pngme SDK dependency if not exists
    if (!buildGradle.includes('com.pngme:pngme-sdk')) {
      const depPattern = /dependencies\s*\{/;
      const depReplacement = `dependencies {
    implementation 'com.pngme:pngme-sdk:${PNGME_SDK_VERSION}'`;
      
      buildGradle = buildGradle.replace(depPattern, depReplacement);
    }
    
    config.modResults.contents = buildGradle;
    return config;
  });

  return config;
};

/**
 * Expo config plugin for Pngme SDK
 * Automatically configures Android permissions and dependencies
 */
const withPngme: ConfigPlugin<PngmePluginProps | void> = (config, props) => {
  return withPngmeAndroid(config, props || {});
};

export default withPngme;