import { Injectable, signal } from '@angular/core'; export type StatusEntity = { id: string; label: string; bg: string; color: string; order: number; }; export const DEFAULT_STATUSES: StatusEntity[] = [ { id: 'draft', label: 'BROUILLON', bg: '#e2e8f0', color: '#475569', order: 0 }, { id: 'todo', label: 'À FAIRE', bg: '#dbeafe', color: '#1d4ed8', order: 1 }, { id: 'in-progress', label: 'EN COURS', bg: '#ffedd5', color: '#9a3412', order: 2 }, { id: 'done', label: 'TERMINÉ', bg: '#dcfce7', color: '#166534', order: 3 }, ]; const STORAGE_KEY = 'bonsai_statuses'; @Injectable({ providedIn: 'root' }) export class StatusesStore { private readonly data = signal(this.loadFromStorage()); readonly statuses = this.data.asReadonly(); getById(id: string): StatusEntity | undefined { return this.data().find((s) => s.id === id); } create(status: Omit): void { const maxOrder = this.data().reduce((max, s) => Math.max(max, s.order), -1); this.data.update((list) => [...list, { ...status, order: maxOrder + 1 }]); this.saveToStorage(); } update(id: string, changes: Partial>): void { this.data.update((list) => list.map((s) => (s.id === id ? { ...s, ...changes } : s)), ); this.saveToStorage(); } setOrder(ordered: StatusEntity[]): void { this.data.set(ordered.map((s, i) => ({ ...s, order: i }))); this.saveToStorage(); } private saveToStorage(): void { localStorage.setItem(STORAGE_KEY, JSON.stringify(this.data())); } private loadFromStorage(): StatusEntity[] { try { const raw = localStorage.getItem(STORAGE_KEY); if (raw) { const parsed = JSON.parse(raw) as StatusEntity[]; if (Array.isArray(parsed) && parsed.length > 0) { return [...parsed].sort((a, b) => a.order - b.order); } } } catch { // ignore parse errors } return [...DEFAULT_STATUSES]; } }