import { fail } from '@sveltejs/kit';
import type { PageServerLoad, Actions } from './$types';
import { getKcAccessToken } from '$lib/server/api';
import {
	listWorkspaceTenants,
	createWorkspaceTenant,
	type CreateTenantInput
} from '$lib/server/workspace-provision';
import { validateTenantForm } from '$lib/server/workspace-provision.shared';

export const load: PageServerLoad = async ({ cookies, fetch }) => {
	const accessToken = getKcAccessToken(cookies);
	if (!accessToken) {
		return { tenants: [], forbidden: true, loadError: null };
	}

	const res = await listWorkspaceTenants(accessToken, fetch);
	if (!res.ok) {
		// 401/403 → el usuario no es admin del workspace: se muestra estado informativo,
		// no un error. Otros status sí se reportan como error de carga.
		return { tenants: [], forbidden: res.forbidden, loadError: res.forbidden ? null : res.error };
	}

	return { tenants: res.data, forbidden: false, loadError: null };
};

export const actions: Actions = {
	create: async ({ request, cookies, fetch }) => {
		const accessToken = getKcAccessToken(cookies);
		if (!accessToken) return fail(401, { error: 'Tu sesión expiró. Vuelve a entrar al CRM.' });

		const data = await request.formData();
		const name = String(data.get('name') ?? '').trim();
		const slug = String(data.get('slug') ?? '')
			.trim()
			.toLowerCase();
		const contact_email = String(data.get('contact_email') ?? '').trim();
		const contact_name = String(data.get('contact_name') ?? '').trim();
		const contact_phone = String(data.get('contact_phone') ?? '').trim();
		const display_name = String(data.get('display_name') ?? '').trim();
		const app_url = String(data.get('app_url') ?? '').trim();
		const is_self_hosted = data.get('is_self_hosted') === 'on';

		// Valores para repoblar el formulario si algo falla.
		const values = {
			name,
			slug,
			contact_email,
			contact_name,
			contact_phone,
			display_name,
			app_url,
			is_self_hosted
		};

		const validationError = validateTenantForm({ name, slug, contact_email });
		if (validationError) return fail(422, { error: validationError, values });

		// Solo se envían los campos opcionales con valor, para no mandar strings vacíos.
		const payload: CreateTenantInput = {
			name,
			slug,
			contact_email,
			is_self_hosted,
			...(contact_name ? { contact_name } : {}),
			...(contact_phone ? { contact_phone } : {}),
			...(display_name ? { display_name } : {}),
			...(app_url ? { app_url } : {})
		};

		const res = await createWorkspaceTenant(accessToken, fetch, payload);
		if (!res.ok) {
			return fail(res.forbidden ? 403 : 422, { error: res.error, values });
		}

		return { success: true, tenantName: res.data.name, tenantSlug: res.data.slug };
	}
};
