package xdg

import (
	"path/filepath"

	"github.com/aserto-dev/topaz/internal/pkg/xdg/internal/pathutil"

	"golang.org/x/sys/windows"
)

func homeDir() string {
	return pathutil.KnownFolder(
		windows.FOLDERID_Profile,
		[]string{"USERPROFILE"},
		nil,
	)
}

func initDirs(home string) {
	kf := initKnownFolders(home)
	initBaseDirs(home, kf)
	initUserDirs(home, kf)
}

func initBaseDirs(home string, kf *knownFolders) {
	// Initialize standard directories.
	baseDirs.dataHome = xdgPath(envDataHome, kf.localAppData)
	baseDirs.data = xdgPaths(envDataDirs, kf.roamingAppData, kf.programData)
	baseDirs.configHome = xdgPath(envConfigHome, filepath.Join(home, ".config"))
	baseDirs.config = xdgPaths(envConfigDirs, kf.programData, kf.roamingAppData)
	baseDirs.stateHome = xdgPath(envStateHome, kf.localAppData)
	baseDirs.cacheHome = xdgPath(envCacheHome, filepath.Join(kf.localAppData, "cache"))
	baseDirs.runtime = xdgPath(envRuntimeDir, kf.localAppData)

	// Initialize non-standard directories.
	baseDirs.applications = []string{
		kf.programs,
		kf.commonPrograms,
	}
	baseDirs.fonts = []string{
		kf.fonts,
		filepath.Join(kf.localAppData, "Microsoft", "Windows", "Fonts"),
	}
}

func initUserDirs(home string, kf *knownFolders) {
	UserDirs.Desktop = xdgPath(envDesktopDir, kf.desktop)
	UserDirs.Download = xdgPath(envDownloadDir, kf.downloads)
	UserDirs.Documents = xdgPath(envDocumentsDir, kf.documents)
	UserDirs.Music = xdgPath(envMusicDir, kf.music)
	UserDirs.Pictures = xdgPath(envPicturesDir, kf.pictures)
	UserDirs.Videos = xdgPath(envVideosDir, kf.videos)
	UserDirs.Templates = xdgPath(envTemplatesDir, kf.templates)
	UserDirs.PublicShare = xdgPath(envPublicShareDir, kf.public)
}

type knownFolders struct {
	systemDrive    string
	systemRoot     string
	programData    string
	userProfile    string
	userProfiles   string
	roamingAppData string
	localAppData   string
	desktop        string
	downloads      string
	documents      string
	music          string
	pictures       string
	videos         string
	templates      string
	public         string
	fonts          string
	programs       string
	commonPrograms string
}

func initKnownFolders(home string) *knownFolders {
	kf := &knownFolders{
		userProfile: home,
	}
	kf.systemDrive = filepath.VolumeName(pathutil.KnownFolder(
		windows.FOLDERID_Windows,
		[]string{"SystemDrive", "SystemRoot", "windir"},
		[]string{home, `C:`},
	)) + string(filepath.Separator)
	kf.systemRoot = pathutil.KnownFolder(
		windows.FOLDERID_Windows,
		[]string{"SystemRoot", "windir"},
		[]string{filepath.Join(kf.systemDrive, "Windows")},
	)
	kf.programData = pathutil.KnownFolder(
		windows.FOLDERID_ProgramData,
		[]string{"ProgramData", "ALLUSERSPROFILE"},
		[]string{filepath.Join(kf.systemDrive, "ProgramData")},
	)
	kf.userProfiles = pathutil.KnownFolder(
		windows.FOLDERID_UserProfiles,
		nil,
		[]string{filepath.Join(kf.systemDrive, "Users")},
	)
	kf.roamingAppData = pathutil.KnownFolder(
		windows.FOLDERID_RoamingAppData,
		[]string{"APPDATA"},
		[]string{filepath.Join(home, "AppData", "Roaming")},
	)
	kf.localAppData = pathutil.KnownFolder(
		windows.FOLDERID_LocalAppData,
		[]string{"LOCALAPPDATA"},
		[]string{filepath.Join(home, "AppData", "Local")},
	)
	kf.desktop = pathutil.KnownFolder(
		windows.FOLDERID_Desktop,
		nil,
		[]string{filepath.Join(home, "Desktop")},
	)
	kf.downloads = pathutil.KnownFolder(
		windows.FOLDERID_Downloads,
		nil,
		[]string{filepath.Join(home, "Downloads")},
	)
	kf.documents = pathutil.KnownFolder(
		windows.FOLDERID_Documents,
		nil,
		[]string{filepath.Join(home, "Documents")},
	)
	kf.music = pathutil.KnownFolder(
		windows.FOLDERID_Music,
		nil,
		[]string{filepath.Join(home, "Music")},
	)
	kf.pictures = pathutil.KnownFolder(
		windows.FOLDERID_Pictures,
		nil,
		[]string{filepath.Join(home, "Pictures")},
	)
	kf.videos = pathutil.KnownFolder(
		windows.FOLDERID_Videos,
		nil,
		[]string{filepath.Join(home, "Videos")},
	)
	kf.templates = pathutil.KnownFolder(
		windows.FOLDERID_Templates,
		nil,
		[]string{filepath.Join(kf.roamingAppData, "Microsoft", "Windows", "Templates")},
	)
	kf.public = pathutil.KnownFolder(
		windows.FOLDERID_Public,
		[]string{"PUBLIC"},
		[]string{filepath.Join(kf.userProfiles, "Public")},
	)
	kf.fonts = pathutil.KnownFolder(
		windows.FOLDERID_Fonts,
		nil,
		[]string{filepath.Join(kf.systemRoot, "Fonts")},
	)
	kf.programs = pathutil.KnownFolder(
		windows.FOLDERID_Programs,
		nil,
		[]string{filepath.Join(kf.roamingAppData, "Microsoft", "Windows", "Start Menu", "Programs")},
	)
	kf.commonPrograms = pathutil.KnownFolder(
		windows.FOLDERID_CommonPrograms,
		nil,
		[]string{filepath.Join(kf.programData, "Microsoft", "Windows", "Start Menu", "Programs")},
	)

	return kf
}
