import {
    DateRange,
    StatsPreset,
    detectPresetFromRange,
    getDefaultStatsDateRange,
    getPresetRange,
    getPreviousPeriodRange,
    isValidDateRange,
} from '@/lib/abandoned-cart-stats-date';
import type { JourneyCountMode } from '@/lib/journey-count-mode';

export const ANALYTICS_STATS_PREFS_KEYS = {
    journey: 'aurumlab.analytics.user-journey.stats',
    birthday: 'aurumlab.analytics.birthday.stats',
    abandonedCart: 'aurumlab.analytics.abandoned-cart.stats',
} as const;

export type SimpleStatsPrefs = {
    range: DateRange;
    preset: StatsPreset;
    compareEnabled: boolean;
};

export type JourneyStatsPrefs = {
    range: DateRange;
    preset: StatsPreset;
    compareRange: DateRange | null;
    compareBySection: Record<string, boolean>;
    countMode: JourneyCountMode;
    prefsVersion?: number;
};

const JOURNEY_PREFS_VERSION = 2;

function readJson<T>(key: string): T | null {
    if (typeof window === 'undefined') return null;
    try {
        const raw = localStorage.getItem(key);
        if (!raw) return null;
        return JSON.parse(raw) as T;
    } catch {
        return null;
    }
}

function writeJson(key: string, value: unknown) {
    if (typeof window === 'undefined') return;
    try {
        localStorage.setItem(key, JSON.stringify(value));
    } catch {
        /* ignore quota / private mode */
    }
}

function resolveStoredRange(preset: StatsPreset | undefined, range?: DateRange | null): DateRange {
    if (preset && preset !== 'custom') {
        return getPresetRange(preset);
    }
    if (range && isValidDateRange(range)) return range;
    return getDefaultStatsDateRange();
}

export function defaultSimpleStatsPrefs(compareEnabled = true): SimpleStatsPrefs {
    return {
        range: getDefaultStatsDateRange(),
        preset: 'last7',
        compareEnabled,
    };
}

export function loadSimpleStatsPrefs(key: string, defaultCompare = true): SimpleStatsPrefs {
    const defaults = defaultSimpleStatsPrefs(defaultCompare);
    const saved = readJson<Partial<SimpleStatsPrefs>>(key);
    if (!saved) return defaults;
    const preset = saved.preset || 'last7';
    const range = resolveStoredRange(preset, saved.range);
    return {
        range,
        preset: preset === 'custom' ? detectPresetFromRange(range) : preset,
        compareEnabled: typeof saved.compareEnabled === 'boolean' ? saved.compareEnabled : defaultCompare,
    };
}

export function saveSimpleStatsPrefs(key: string, prefs: SimpleStatsPrefs) {
    writeJson(key, prefs);
}

export function defaultJourneyStatsPrefs(): JourneyStatsPrefs {
    const range = getDefaultStatsDateRange();
    return {
        range,
        preset: 'last7',
        compareRange: getPreviousPeriodRange(range),
        compareBySection: { dashboard: true },
        countMode: 'users',
        prefsVersion: JOURNEY_PREFS_VERSION,
    };
}

export function loadJourneyStatsPrefs(): JourneyStatsPrefs {
    const defaults = defaultJourneyStatsPrefs();
    const saved = readJson<Partial<JourneyStatsPrefs>>(ANALYTICS_STATS_PREFS_KEYS.journey);
    if (!saved) return defaults;

    const preset = saved.preset || 'last7';
    const range = resolveStoredRange(preset, saved.range);
    const autoPrev = getPreviousPeriodRange(range);
    let compareRange = autoPrev;
    if (saved.compareRange && isValidDateRange(saved.compareRange)) {
        const savedAuto = saved.range ? getPreviousPeriodRange(saved.range) : autoPrev;
        const wasCustomCompare =
            saved.compareRange.from !== savedAuto.from || saved.compareRange.to !== savedAuto.to;
        compareRange = wasCustomCompare ? saved.compareRange : autoPrev;
    }

    const savedSections = saved.compareBySection || {};
    const savedVersion = saved.prefsVersion || 1;
    const compareBySection: Record<string, boolean> = {
        ...savedSections,
        dashboard: savedSections.dashboard ?? true,
    };
    // Migrasi: overview dashboard default compare periode sebelumnya
    if (savedVersion < JOURNEY_PREFS_VERSION) {
        compareBySection.dashboard = true;
    }

    return {
        range,
        preset: preset === 'custom' ? detectPresetFromRange(range) : preset,
        compareRange,
        compareBySection,
        countMode: saved.countMode === 'sessions' ? 'sessions' : 'users',
        prefsVersion: JOURNEY_PREFS_VERSION,
    };
}

export function saveJourneyStatsPrefs(prefs: JourneyStatsPrefs) {
    writeJson(ANALYTICS_STATS_PREFS_KEYS.journey, {
        ...prefs,
        prefsVersion: JOURNEY_PREFS_VERSION,
    });
}
