package repo

import (
	"os"
	"path/filepath"
	"runtime"
	"sync"
)

var (
	RootPath                string
	TypeScriptSubmodulePath string
	TestDataPath            string
)

func init() {
	_, filename, _, ok := runtime.Caller(0)
	if !ok {
		panic("could not get current filename")
	}
	filename = filepath.FromSlash(filename) // runtime.Caller always returns forward slashes; https://go.dev/issues/3335, https://go.dev/cl/603275
	RootPath = findGoMod(filepath.Dir(filename))
	TypeScriptSubmodulePath = filepath.Join(RootPath, "_submodules", "TypeScript")
	TestDataPath = filepath.Join(RootPath, "testdata")
}

func findGoMod(dir string) string {
	root := filepath.VolumeName(dir)
	for dir != root {
		if _, err := os.Stat(filepath.Join(dir, "go.mod")); err == nil {
			return dir
		}
		dir = filepath.Dir(dir)
	}
	panic("could not find go.mod")
}

var typeScriptSubmoduleExists = sync.OnceValue(func() bool {
	p := filepath.Join(TypeScriptSubmodulePath, "package.json")
	if _, err := os.Stat(p); err != nil {
		if os.IsNotExist(err) {
			return false
		}
		panic(err)
	}
	return true
})

func TypeScriptSubmoduleExists() bool {
	return typeScriptSubmoduleExists()
}

type skippable interface {
	Helper()
	Skipf(format string, args ...any)
}

func SkipIfNoTypeScriptSubmodule(t skippable) {
	t.Helper()
	if !typeScriptSubmoduleExists() {
		t.Skipf("TypeScript submodule does not exist")
	}
}
