export type AuthRedirectOptions = {
	loginPath?: string
	registerPath?: string
	fallbackUrl?: string
}

function normalizePath(path: string): string {
	if (!path) return ''
	return path.startsWith('/') ? path : `/${path}`
}

function safeEncode(url: string): string {
	try {
		return encodeURIComponent(url)
	} catch (_) {
		return url
	}
}

export function getCurrentPageUrlWithQuery(): string {
	const pages = getCurrentPages() as any[]
	const currentPage = pages.length > 0 ? pages[pages.length - 1] : null
	if (!currentPage) return ''

	const route = currentPage.route as string | null
	const options = (currentPage.options ?? {}) as Record<string, any>
	if (!route) return ''

	const path = normalizePath(route)
	const keys = Object.keys(options)
	if (keys.length === 0) return path

	const query = keys
		.filter((k) => options[k] != null)
		.map((k) => `${k}=${encodeURIComponent(String(options[k]))}`)
		.join('&')
	return query.length > 0 ? `${path}?${query}` : path
}

export function toLoginWithRedirect(redirectUrl?: string, opts?: AuthRedirectOptions) {
	const loginPath = opts?.loginPath ?? '/pages/user/login'
	const fallback = opts?.fallbackUrl ?? '/pages/mall/consumer/index'
	const target = (redirectUrl != null && redirectUrl.length > 0)
		? redirectUrl
		: (getCurrentPageUrlWithQuery() || fallback)

	uni.navigateTo({
		url: `${loginPath}?redirect=${safeEncode(target)}`
	})
}

export function toRegisterWithRedirect(redirectUrl?: string, opts?: AuthRedirectOptions) {
	const registerPath = opts?.registerPath ?? '/pages/user/register'
	const fallback = opts?.fallbackUrl ?? '/pages/mall/consumer/index'
	const target = (redirectUrl != null && redirectUrl.length > 0)
		? redirectUrl
		: (getCurrentPageUrlWithQuery() || fallback)

	uni.navigateTo({
		url: `${registerPath}?redirect=${safeEncode(target)}`
	})
}
