package main

import (
	"flag"
	"fmt"
	"os"
	"time"

	"github.com/optimyze-interviews/OezguerKesim/GetRuntimeAddresses/ebpf"
	"github.com/optimyze-interviews/OezguerKesim/GetRuntimeAddresses/symbolyze"
)

var (
	symbol = flag.String("symbol", "_PyRuntime", "Symbol to search for")
	glob   = flag.String("glob", "*python3*", "pattern an ELF-file must match (see filepath.Match)")
	debug  = flag.Bool("debug", false, "run in debug mode")
)

func main() {
	flag.Parse()

	mapFD, err := ebpf.CreateMap()
	if err != nil {
		fmt.Printf("Failed to create eBPF map: %s\n", err)
		os.Exit(1)
	}

	fmt.Printf("Created eBPF map (FD: %d)\n", mapFD)

	scanner := symbolyze.NewScanner(*symbol, *glob)
	scanner.OnFound(mapFD.Set)
	scanner.Debug(*debug)

	go scanner.RunEvery(time.Second)

	time.Sleep(10 * time.Second)
	scanner.Stop()

	err = scanner.Run()
	if err != nil {
		fmt.Printf("Failed to run the symbolyze scanner: %s", err)
		os.Exit(1)
	}

	mapContents, err := mapFD.GetMap()
	if err != nil {
		fmt.Printf("Failed to get the map contents: %s", err)
		os.Exit(1)
	}

	fmt.Printf("Printing contents of map %d\n", mapFD)
	for k, v := range mapContents {
		fmt.Printf("\t%d -> 0x%x\n", k, v)
	}
	os.Exit(0)
}