export interface Task {
    id: string;
    title: string;
    notes: string;
    completed: boolean;
}
export const STORAGE_KEY = 'faye-ui.example.tasks.v1';
export const MAX_TASKS = 500;
export type StorageKind = 'new' | 'saved' | 'invalid' | 'read-error' | 'unavailable';
export function decodeTasks(raw: string): Task[] {
    if (raw.length > 1000000)
        throw Error('Stored task data is too large.');
    const data: unknown = JSON.parse(raw);
    if (!data || typeof data !== 'object' || !('version' in data) || data.version !== 1 || !('tasks' in data) || !Array.isArray(data.tasks) || data.tasks.length > MAX_TASKS)
        throw Error('Unsupported stored task data.');
    const ids = new Set<string>();
    return data.tasks.map((value: unknown) => {
        if (!value || typeof value !== 'object' || !('id' in value) || typeof value.id !== 'string' || !value.id || value.id.length > 64 || ids.has(value.id)
            || !('title' in value) || typeof value.title !== 'string' || !value.title.trim() || value.title.length > 120
            || !('notes' in value) || typeof value.notes !== 'string' || value.notes.length > 1000
            || !('completed' in value) || typeof value.completed !== 'boolean')
            throw Error('Invalid stored task.');
        ids.add(value.id);
        return { id: value.id, title: value.title, notes: value.notes, completed: value.completed };
    });
}
export function readTasks(): {
    tasks: Task[];
    kind: StorageKind;
} {
    let raw: string | null;
    try {
        raw = window.localStorage.getItem(STORAGE_KEY);
    }
    catch {
        return { tasks: [], kind: 'read-error' };
    }
    if (raw === null)
        return { tasks: [], kind: 'new' };
    try {
        return { tasks: decodeTasks(raw), kind: 'saved' };
    }
    catch {
        return { tasks: [], kind: 'invalid' };
    }
}
export function writeTasks(tasks: readonly Task[]): void {
    window.localStorage.setItem(STORAGE_KEY, JSON.stringify({ version: 1, tasks }));
}
