pragma Singleton

import ZShell
import Quickshell
import qs.Config
import qs.Helpers
import qs.Paths

Searcher {
	id: root

	readonly property list<string> command: Config.launcher.uwsm ? ["app2unit", "--"] : []

	function launch(entry: DesktopEntry): void {
		appDb.incrementFrequency(entry.id);

		if (entry.runInTerminal)
			Quickshell.execDetached({
				command: [...root.command, ...Config.general.apps.terminal, `${Quickshell.shellDir}/assets/wrap_term_launch.sh`, ...entry.command],
				workingDirectory: entry.workingDirectory
			});
		else
			Quickshell.execDetached({
				command: [...root.command, ...entry.command],
				workingDirectory: entry.workingDirectory
			});
	}

	function search(search: string): list<var> {
		const prefix = Config.launcher.specialPrefix;

		if (search.startsWith(`${prefix}i `)) {
			keys = ["id", "name"];
			weights = [0.9, 0.1];
		} else if (search.startsWith(`${prefix}c `)) {
			keys = ["categories", "name"];
			weights = [0.9, 0.1];
		} else if (search.startsWith(`${prefix}d `)) {
			keys = ["comment", "name"];
			weights = [0.9, 0.1];
		} else if (search.startsWith(`${prefix}e `)) {
			keys = ["execString", "name"];
			weights = [0.9, 0.1];
		} else if (search.startsWith(`${prefix}w `)) {
			keys = ["startupClass", "name"];
			weights = [0.9, 0.1];
		} else if (search.startsWith(`${prefix}g `)) {
			keys = ["genericName", "name"];
			weights = [0.9, 0.1];
		} else if (search.startsWith(`${prefix}k `)) {
			keys = ["keywords", "name"];
			weights = [0.9, 0.1];
		} else {
			keys = ["name"];
			weights = [1];

			if (!search.startsWith(`${prefix}t `))
				return query(search).map(e => e.entry);
		}

		const results = query(search.slice(prefix.length + 2)).map(e => e.entry);
		if (search.startsWith(`${prefix}t `))
			return results.filter(a => a.runInTerminal);
		return results;
	}

	function selector(item: var): string {
		return keys.map(k => item[k]).join(" ");
	}

	list: appDb.apps
	useFuzzy: Config.launcher.useFuzzy.apps

	AppDb {
		id: appDb

		entries: DesktopEntries.applications.values.filter(a => !Strings.testRegexList(Config.launcher.hiddenApps, a.id))
		favoriteApps: Config.launcher.favoriteApps
		path: `${Paths.state}/apps.sqlite`
	}
}
