package dkms

import (
	"context"
	"cos.googlesource.com/cos/tools.git/src/pkg/utils"
	"fmt"
	"os"
	"path"
	"testing"
)

func TestInstallCompilerToolchain(t *testing.T) {
	downloader := fakeDownloader{}
	ctx := context.Background()
	targetDir := t.TempDir()
	defer os.RemoveAll(targetDir)

	err := InstallCompilerToolchain(ctx, &downloader, targetDir)
	if err != nil {
		t.Errorf("failed to install compiler toolchain: %v", err)
	}
	if !CompilerToolchainInstalled(targetDir) {
		t.Errorf("expected toolchain to be installed")
	}
}

func TestInstallKernelHeaders(t *testing.T) {
	downloader := fakeDownloader{}
	ctx := context.Background()
	targetDir := t.TempDir()
	defer os.RemoveAll(targetDir)

	err := InstallKernelHeaders(ctx, &downloader, targetDir)
	if err != nil {
		t.Errorf("failed to install kernel headers: %v", err)
	}
	if !KernelHeadersInstalled(targetDir) {
		t.Errorf("expected headers to be installed")
	}
}

type fakeDownloader struct {
}

func (*fakeDownloader) DownloadKernelSrc(ctx context.Context, destDir string) error {
	var archive = map[string][]byte{
		"kernel-source": []byte("foo"),
	}
	if err := utils.CreateTarFile(path.Join(destDir, "kernel-src.tar.gz"), archive); err != nil {
		return fmt.Errorf("Failed to download kernel source: %v", err)
	}
	return nil
}

func (*fakeDownloader) DownloadToolchainEnv(ctx context.Context, destDir string) error {
	toolchainEnvStr := `
	CC=x86_64-cros-linux-gnu-clang
	CXX=x86_64-cros-linux-gnu-clang++
	`
	if err := os.WriteFile(path.Join(destDir, "toolchain_env"), []byte(toolchainEnvStr), 0644); err != nil {
		return fmt.Errorf("Failed to download toolchain env file: %v", err)
	}
	return nil
}

func (*fakeDownloader) DownloadToolchain(ctx context.Context, destDir string) error {
	var archive = map[string][]byte{
		"x86_64-cros-linux-gnu-clang": []byte("foo"),
	}
	if err := utils.CreateTarFile(path.Join(destDir, "toolchain.tar.xz"), archive); err != nil {
		return fmt.Errorf("Failed to download toolchain archive: %v", err)
	}
	return nil
}

func (*fakeDownloader) DownloadKernelHeaders(ctx context.Context, destDir string) error {
	var archive = map[string][]byte{
		"kernel-header": []byte("bar"),
	}
	if err := utils.CreateTarFile(path.Join(destDir, "kernel-headers.tgz"), archive); err != nil {
		return fmt.Errorf("Failed to download kernel headers: %v", err)
	}
	return nil
}

func (*fakeDownloader) DownloadArtifact(context.Context, string, string) error { return nil }

func (*fakeDownloader) GetArtifact(context.Context, string) ([]byte, error) { return nil, nil }

func (*fakeDownloader) ArtifactExists(context.Context, string) (bool, error) { return false, nil }

func (*fakeDownloader) ListArtifacts(ctx context.Context, prefix string) ([]string, error) {
	return nil, nil
}

func (*fakeDownloader) DownloadGenericNvidiaDriver(context.Context, string, string) (string, error) {
	return "", nil
}
