const { withAppDelegate } = require("@expo/config-plugins");

function withRNBackgroundDownloader(expoConfig) {
  return withAppDelegate(expoConfig, async (appDelegateConfig) => {
    const { modResults: appDelegate } = appDelegateConfig;
    const appDelegateLines = appDelegate.contents.split("\n");

    // Define the code to be added to AppDelegate.mm
    const backgroundDownloaderImport =
      "#import <RNBackgroundDownloader.h> // Required by react-native-background-downloader. Generated by expoPlugins/withRNBackgroundDownloader.js";
    const backgroundDownloaderDelegate = `\n// Delegate method required by react-native-background-downloader. Generated by expoPlugins/withRNBackgroundDownloader.js
- (void)application:(UIApplication *)application handleEventsForBackgroundURLSession:(NSString *)identifier completionHandler:(void (^)(void))completionHandler
{
  [RNBackgroundDownloader setCompletionHandlerWithIdentifier:identifier completionHandler:completionHandler];
}`;

    // Find the index of the AppDelegate import statement
    const importIndex = appDelegateLines.findIndex((line) =>
      /^#import "AppDelegate.h"/.test(line)
    );

    // Find the index of the last line before the @end statement
    const endStatementIndex = appDelegateLines.findIndex((line) =>
      /@end/.test(line)
    );

    // Insert the import statement if it's not already present
    if (!appDelegate.contents.includes(backgroundDownloaderImport)) {
      appDelegateLines.splice(importIndex + 1, 0, backgroundDownloaderImport);
    }

    // Insert the delegate method above the @end statement
    if (!appDelegate.contents.includes(backgroundDownloaderDelegate)) {
      appDelegateLines.splice(
        endStatementIndex,
        0,
        backgroundDownloaderDelegate
      );
    }

    // Update the contents of the AppDelegate file
    appDelegate.contents = appDelegateLines.join("\n");

    return appDelegateConfig;
  });
}

module.exports = withRNBackgroundDownloader;
