CREATE TABLE IF NOT EXISTS routes ( id INTEGER PRIMARY KEY AUTOINCREMENT, slug TEXT NOT NULL UNIQUE, name TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', school_name TEXT NOT NULL DEFAULT '', status TEXT NOT NULL DEFAULT 'active' CHECK (status IN ('active', 'deleted')), gpx_path TEXT NOT NULL, start_lat REAL, start_lon REAL, center_lat REAL, center_lon REAL, min_lat REAL, min_lon REAL, max_lat REAL, max_lon REAL, distance_m REAL NOT NULL DEFAULT 0, elevation_gain_m REAL NOT NULL DEFAULT 0, point_count INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, deleted_at TEXT, trash_path TEXT ) STRICT; CREATE TABLE IF NOT EXISTS route_points ( id INTEGER PRIMARY KEY AUTOINCREMENT, route_id INTEGER NOT NULL REFERENCES routes(id), sequence INTEGER NOT NULL, lat REAL NOT NULL, lon REAL NOT NULL, elevation REAL, recorded_at TEXT, UNIQUE(route_id, sequence) ) STRICT; CREATE TABLE IF NOT EXISTS pois ( id INTEGER PRIMARY KEY AUTOINCREMENT, route_id INTEGER NOT NULL REFERENCES routes(id), title TEXT NOT NULL, description TEXT NOT NULL DEFAULT '', lat REAL NOT NULL, lon REAL NOT NULL, trigger_radius_m REAL NOT NULL DEFAULT 80, sequence INTEGER NOT NULL DEFAULT 0, audio_path TEXT, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP, updated_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ) STRICT; CREATE TABLE IF NOT EXISTS poi_images ( id INTEGER PRIMARY KEY AUTOINCREMENT, poi_id INTEGER NOT NULL REFERENCES pois(id), path TEXT NOT NULL, caption TEXT NOT NULL DEFAULT '', sequence INTEGER NOT NULL DEFAULT 0, created_at TEXT NOT NULL DEFAULT CURRENT_TIMESTAMP ) STRICT; CREATE INDEX IF NOT EXISTS idx_routes_status ON routes(status); CREATE INDEX IF NOT EXISTS idx_route_points_route ON route_points(route_id, sequence); CREATE INDEX IF NOT EXISTS idx_pois_route ON pois(route_id, sequence); CREATE INDEX IF NOT EXISTS idx_poi_images_poi ON poi_images(poi_id, sequence);