CREATE TABLE IF NOT EXISTS users ( id TEXT PRIMARY KEY, email TEXT UNIQUE NOT NULL, password_hash TEXT NOT NULL, name TEXT NOT NULL, avatar_emoji TEXT NOT NULL DEFAULT '🙂', email_notifications INTEGER NOT NULL DEFAULT 1, language TEXT NOT NULL DEFAULT 'pl', created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS password_resets ( id TEXT PRIMARY KEY, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, token TEXT UNIQUE NOT NULL, expires_at TEXT NOT NULL, used_at TEXT, created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS households ( id TEXT PRIMARY KEY, name TEXT NOT NULL, currency TEXT NOT NULL DEFAULT 'PLN', created_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS household_members ( household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE, user_id TEXT NOT NULL REFERENCES users(id) ON DELETE CASCADE, joined_at TEXT NOT NULL DEFAULT (datetime('now')), PRIMARY KEY (household_id, user_id) ); CREATE TABLE IF NOT EXISTS invites ( id TEXT PRIMARY KEY, household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE, code TEXT UNIQUE NOT NULL, created_by TEXT NOT NULL REFERENCES users(id), expires_at TEXT NOT NULL, used_at TEXT ); CREATE TABLE IF NOT EXISTS categories ( id TEXT PRIMARY KEY, household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE, name TEXT NOT NULL, icon TEXT NOT NULL DEFAULT '🛒', color TEXT NOT NULL DEFAULT '#6b7280' ); CREATE TABLE IF NOT EXISTS expenses ( id TEXT PRIMARY KEY, household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE, payer_id TEXT NOT NULL REFERENCES users(id), amount REAL NOT NULL, title TEXT NOT NULL, category_id TEXT REFERENCES categories(id) ON DELETE SET NULL, expense_date TEXT NOT NULL, split_type TEXT NOT NULL CHECK (split_type IN ('equal', 'exact', 'full')), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS expense_shares ( expense_id TEXT NOT NULL REFERENCES expenses(id) ON DELETE CASCADE, user_id TEXT NOT NULL REFERENCES users(id), share_amount REAL NOT NULL, PRIMARY KEY (expense_id, user_id) ); CREATE TABLE IF NOT EXISTS settlements ( id TEXT PRIMARY KEY, household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE, from_user_id TEXT NOT NULL REFERENCES users(id), to_user_id TEXT NOT NULL REFERENCES users(id), amount REAL NOT NULL, settled_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS events ( id TEXT PRIMARY KEY, household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE, created_by TEXT NOT NULL REFERENCES users(id), title TEXT NOT NULL, notes TEXT, location TEXT, all_day INTEGER NOT NULL DEFAULT 0, start_at TEXT NOT NULL, end_at TEXT NOT NULL, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS event_attendees ( id TEXT PRIMARY KEY, event_id TEXT NOT NULL REFERENCES events(id) ON DELETE CASCADE, user_id TEXT REFERENCES users(id) ON DELETE CASCADE, guest_name TEXT ); CREATE TABLE IF NOT EXISTS shopping_lists ( id TEXT PRIMARY KEY, household_id TEXT NOT NULL REFERENCES households(id) ON DELETE CASCADE, name TEXT NOT NULL, created_by TEXT NOT NULL REFERENCES users(id), created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE TABLE IF NOT EXISTS shopping_list_items ( id TEXT PRIMARY KEY, list_id TEXT NOT NULL REFERENCES shopping_lists(id) ON DELETE CASCADE, name TEXT NOT NULL, quantity TEXT, checked INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT (datetime('now')), updated_at TEXT NOT NULL DEFAULT (datetime('now')) ); CREATE INDEX IF NOT EXISTS idx_expenses_household ON expenses(household_id); CREATE INDEX IF NOT EXISTS idx_expense_shares_expense ON expense_shares(expense_id); CREATE INDEX IF NOT EXISTS idx_settlements_household ON settlements(household_id); CREATE INDEX IF NOT EXISTS idx_events_household ON events(household_id); CREATE INDEX IF NOT EXISTS idx_event_attendees_event ON event_attendees(event_id); CREATE INDEX IF NOT EXISTS idx_shopping_lists_household ON shopping_lists(household_id); CREATE INDEX IF NOT EXISTS idx_shopping_list_items_list ON shopping_list_items(list_id);