import { type } from "arktype";

export const BACKEND_TYPES = {
	nfs: "nfs",
	smb: "smb",
	directory: "directory",
	webdav: "webdav",
} as const;

export type BackendType = keyof typeof BACKEND_TYPES;

export const nfsConfigSchema = type({
	backend: "'nfs'",
	server: "string",
	exportPath: "string",
	port: type("string.integer").or(type("number")).to("1 <= number <= 65536").default(2049),
	version: "'3' | '4' | '4.1'",
	readOnly: "boolean?",
});

export const smbConfigSchema = type({
	backend: "'smb'",
	server: "string",
	share: "string",
	username: "string",
	password: "string",
	vers: type("'1.0' | '2.0' | '2.1' | '3.0'").default("3.0"),
	domain: "string?",
	port: type("string.integer").or(type("number")).to("1 <= number <= 65535").default(445),
	readOnly: "boolean?",
});

export const directoryConfigSchema = type({
	backend: "'directory'",
	path: "string",
	readOnly: "false?",
});

export const webdavConfigSchema = type({
	backend: "'webdav'",
	server: "string",
	path: "string",
	username: "string?",
	password: "string?",
	port: type("string.integer").or(type("number")).to("1 <= number <= 65536").default(80),
	readOnly: "boolean?",
	ssl: "boolean?",
});

export const volumeConfigSchema = nfsConfigSchema.or(smbConfigSchema).or(webdavConfigSchema).or(directoryConfigSchema);

export type BackendConfig = typeof volumeConfigSchema.infer;

export const BACKEND_STATUS = {
	mounted: "mounted",
	unmounted: "unmounted",
	error: "error",
} as const;

export type BackendStatus = keyof typeof BACKEND_STATUS;
