// Util analitik pengunjung (modul cookie consent).
// Identitas pengunjung = UUID stabil per browser (localStorage).
// Kiriman ke /api/visitor/track bersifat fire-and-forget (tidak memblokir UI).

const VISITOR_ID_KEY = 'visitor_id';
const CONSENT_KEY = 'cookie_consent';
const LAST_TRACK_KEY = 'visitor_last_track';

export type ConsentChoice = 'accepted' | 'declined';

export function getVisitorId(): string {
    let id = localStorage.getItem(VISITOR_ID_KEY);

    if (!id) {
        id = crypto.randomUUID();
        localStorage.setItem(VISITOR_ID_KEY, id);
    }

    return id;
}

export function getStoredConsent(): ConsentChoice | null {
    const value = localStorage.getItem(CONSENT_KEY);

    return value === 'accepted' || value === 'declined' ? value : null;
}

export function storeConsent(choice: ConsentChoice): void {
    localStorage.setItem(CONSENT_KEY, choice);
}

function xsrfToken(): string {
    const match = document.cookie.match(/(?:^|; )XSRF-TOKEN=([^;]+)/);

    return match ? decodeURIComponent(match[1]) : '';
}

/**
 * Kirim data kunjungan/persetujuan ke server. Menangkap semua kegagalan
 * diam-diam (analitik tidak boleh merusak pengalaman browsing).
 */
export function sendTrack(payload: {
    consent?: ConsentChoice;
    page_url?: string;
    referrer?: string;
}): void {
    try {
        void fetch('/api/visitor/track', {
            method: 'POST',
            headers: {
                Accept: 'application/json',
                'Content-Type': 'application/json',
                'X-XSRF-TOKEN': xsrfToken(),
            },
            body: JSON.stringify({
                visitor_id: getVisitorId(),
                ...payload,
            }),
        }).catch(() => {
            // diam — analitik opsional
        });
    } catch {
        // localStorage/network error — abaikan
    }
}

/**
 * Catat kunjungan halaman bila cookie sudah diterima — throttle 30 detik
 * per pengunjung agar kunjungan SPA tidak membanjiri database.
 */
export function trackPageView(): void {
    const consent = getStoredConsent();

    if (consent !== 'accepted') {
        return;
    }

    const now = Date.now();
    const last = Number(localStorage.getItem(LAST_TRACK_KEY) ?? 0);

    if (now - last < 30_000) {
        return;
    }

    localStorage.setItem(LAST_TRACK_KEY, String(now));
    sendTrack({
        page_url: window.location.href,
        referrer: document.referrer || undefined,
    });
}
