package pods

import (
	"context"
	"log"
	"net"
	"time"

	"github.com/containers/podman/v4/pkg/bindings"
	"github.com/containers/podman/v4/pkg/bindings/containers"
	"github.com/containers/podman/v4/pkg/bindings/images"
	"github.com/containers/podman/v4/pkg/domain/entities"
	"github.com/spf13/viper"
)

var Socket context.Context
var rawSocket net.Conn

func socketConnection() context.Context {
	uri := "unix:///run/podman/podman.sock"
	conn, err := bindings.NewConnection(context.Background(), uri)
	if err != nil {
		log.Fatal(err)
	}
	return conn
}

func rawConnection() net.Conn {
	connection, err := net.Dial("unix", "unix:///run/podman/podman.sock")
	if err != nil {
		log.Println(
			"Could not establish raw UNIX socket connection, certain features will not work properly",
		)
	}
	return connection
}

func ConnectSocket() {
	Socket = socketConnection()
	rawSocket = rawConnection()
}

func PullImage() error {
	log.Println("Downloading Container image ", viper.GetString("image"))
	image := viper.GetString("image")
	conn := Socket
	_, err := images.Pull(conn, image, nil)
	if err != nil {
		log.Println(err)
		return err
	}
	return nil
}

// Cleanup deletes Containers older than the specified maximum Age (Equal to session cookie maximum age)
func Cleanup() error {
	log.Println("Starting cleanup function")
	containerList := containerList()

	for _, container := range containerList {
		now := time.Now()
		maxAge := time.Second * time.Duration(viper.GetInt("maxAge"))
		containerAge := now.Sub(container.Created)
		if containerAge > maxAge {

			err := containers.Kill(Socket, container.ID, nil)
			if err != nil {
				log.Println(err)
				return err
			}
			_, err = containers.Remove(Socket, container.ID, nil)
			if err != nil {
				log.Println(err)
				return err
			}
		}
	}
	return nil
}

func containerList() []entities.ListContainer {
	containerList, err := containers.List(Socket, nil)
	if err != nil {
		log.Println("Could not get Containers", err)
	}
	return containerList
}
