// https://nuxt.com/docs/api/configuration/nuxt-config
import { IUser } from "@models/user";
import { fileURLToPath } from "url";
// import speedkitHydrate from "nuxt-speedkit/dist/runtime/hydrate.mjs";

export type SessionData = IUser;
const cac = {
	isr: true,
	headersOnly: true,
	cache: {
		headersOnly: true,
		// integrity: "",
		varies: ["Content-Length", "Cookie"],
		maxAge: 60,
	},
	swr: false,
};
const ct =
	<T>() =>
	<U extends T>(u: U) =>
		u;
export default defineNuxtConfig({
	experimental: {
		watcher: "chokidar-granular",
		// noScripts: true,
		treeshakeClientOnly: true,
	},
	devtools: { enabled: true },
	modules: [
		"vue-recaptcha/nuxt",
		"@ant-design-vue/nuxt",
		"@sidebase/nuxt-auth",
		"@pinia/nuxt",
		"@vueuse/nuxt",
		"nuxt-speedkit",
		// "@nuxtjs/i18n",
		// "./modules/09.loaded",
	],
	// i18n: {
	// 	vueI18n: `./i18n.config.ts`,
	// },
	speedkit: {
		disableNuxtFontaine: true,
		lazyOffset: {
			component: "0%",
			asset: "0%",
		},
	},
	css: ["~/public/fonts.css", "~/public/css/all.css"],
	auth: {
		baseURL: "/api/auth",
		provider: {
			type: "local",
			pages: {
				login: "/auth/login",
			},
			token: {
				signInResponseTokenPointer: "/token",
				type: "Bearer",
				headerName: "Authorization",
				maxAgeInSeconds: 14 * 24 * 60 * 60,
				// sameSiteAttribute: ,
			},
			// @ts-ignore
			sessionDataType: {} as IUser,
			endpoints: {
				signUp: { path: "/register", method: "post" },
				signOut: { path: "/logout", method: "post" },
				getSession: {
					path: "/session",
					method: "get",
				},
			},
		},
		globalAppMiddleware: false,

		//@ts-ignore
		session: {
			enableRefreshPeriodically: 60 * 60 * 2 * 1000,
			enableRefreshOnWindowFocus: false,
		},
	},
	nitro: {
		esbuild: {
			options: {
				minify: true,
				sourceMap: "inline",
			},
		},
		preset: "node-server",
	},
	routeRules: {
		"/": cac,
		"/api/**": { cors: true },
		"/band/**": cac,
		"/authors": cac,
		"/story/**": {
			swr: true,
			isr: true,
			cache: {
				maxAge: 1800,
				headersOnly: true,
				varies: ["Cookie", "Set-Cookie"],
			},
		},
		// "/authors": { swr: 0 },
		// "/bands": { swr: 0 },
	},
	// routeRules: {
	// "/**": {
	// 	cache: {
	// 		maxAge: 60,
	// 		headersOnly: true,
	// 	},
	// 	// swr: 60 * 60,
	// },
	// },
	// ssr: false,
	alias: {
		"@models": fileURLToPath(new URL("./models", import.meta.url)),
		"@client": fileURLToPath(new URL("./lib/client", import.meta.url)),
		"@server": fileURLToPath(new URL("./lib/server", import.meta.url)),
		"@functions": fileURLToPath(new URL("./lib/functions.ts", import.meta.url)),
		"@dbconfig": fileURLToPath(new URL("./lib/dbconfig.ts", import.meta.url)),
	},
	sourcemap: {
		server: true,
		client: true,
	},
	runtimeConfig: {
		captcha: {
			secret: process.env.CAPTCHASECRET,
			key: process.env.CAPTCHAKEY,
		},
		database: {
			user: process.env.DBUSER,
			password: process.env.DBPASS,
			uri: `mongodb://${process.env.DB}`,
		},
		jwt: process.env.JWT,
		public: {
			recaptcha: {
				v2SiteKey: process.env.CAPTCHAKEY,
			},
			auth: {
				computed: {
					origin: "127.0.0.1",
				},
			},
			// apiBase: "/api"
		},
		nodebb: {
			masterToken: process.env.nbb_bearer,
		},
	},
	// components: {
	// 	transform: (str) =>
	// },
	typescript: {
		tsConfig: {
			exclude: ["./.nuxt/types/auth.d.ts"],
		},
	},
});
