-- Database Performance Indexes
-- Adds indexes to frequently queried columns for improved performance
--
-- Run with: sqlite3 /opt/media-downloader/database/downloads.db < scripts/add-database-indexes.sql

-- ============================================================================
-- Downloads Table Indexes
-- ============================================================================

-- Index on platform for filtering downloads by platform
CREATE INDEX IF NOT EXISTS idx_downloads_platform
ON downloads(platform);

-- Index on source for filtering downloads by source/username
CREATE INDEX IF NOT EXISTS idx_downloads_source
ON downloads(source);

-- Index on download_date for time-based queries (DESC for most recent first)
CREATE INDEX IF NOT EXISTS idx_downloads_download_date
ON downloads(download_date DESC);

-- Index on status for filtering by download status
CREATE INDEX IF NOT EXISTS idx_downloads_status
ON downloads(status);

-- Compound index for platform + source queries (common filter combination)
CREATE INDEX IF NOT EXISTS idx_downloads_platform_source
ON downloads(platform, source);

-- Compound index for platform + download_date (common for analytics)
CREATE INDEX IF NOT EXISTS idx_downloads_platform_date
ON downloads(platform, download_date DESC);

-- Index on filename for search queries
CREATE INDEX IF NOT EXISTS idx_downloads_filename
ON downloads(filename);

-- Index on media_id for duplicate detection
CREATE INDEX IF NOT EXISTS idx_downloads_media_id
ON downloads(media_id)
WHERE media_id IS NOT NULL;

-- Index on file_hash for duplicate detection
CREATE INDEX IF NOT EXISTS idx_downloads_file_hash
ON downloads(file_hash)
WHERE file_hash IS NOT NULL;

-- ============================================================================
-- Notifications Table Indexes
-- ============================================================================

-- Index on sent_at for time-based queries
CREATE INDEX IF NOT EXISTS idx_notifications_sent_at
ON notifications(sent_at DESC);

-- Index on platform for filtering notifications
CREATE INDEX IF NOT EXISTS idx_notifications_platform
ON notifications(platform);

-- Index on status for filtering by notification status
CREATE INDEX IF NOT EXISTS idx_notifications_status
ON notifications(status);

-- Compound index for platform + sent_at (common query)
CREATE INDEX IF NOT EXISTS idx_notifications_platform_sent_at
ON notifications(platform, sent_at DESC);

-- ============================================================================
-- Scheduler State Table Indexes
-- ============================================================================

-- Index on status for active task queries
CREATE INDEX IF NOT EXISTS idx_scheduler_state_status
ON scheduler_state(status);

-- Index on next_run for finding next scheduled tasks
CREATE INDEX IF NOT EXISTS idx_scheduler_state_next_run
ON scheduler_state(next_run ASC);

-- Index on platform for platform-specific queries
CREATE INDEX IF NOT EXISTS idx_scheduler_state_platform
ON scheduler_state(platform);

-- ============================================================================
-- Users Table Indexes
-- ============================================================================

-- Index on username for login queries
CREATE INDEX IF NOT EXISTS idx_users_username
ON users(username);

-- Index on email for lookup queries (if email is used)
CREATE INDEX IF NOT EXISTS idx_users_email
ON users(email)
WHERE email IS NOT NULL;

-- ============================================================================
-- Performance Analysis
-- ============================================================================

-- Run ANALYZE to update query planner statistics
ANALYZE;

-- Display index information
SELECT
    'Index Information' as info,
    name as index_name,
    tbl_name as table_name
FROM sqlite_master
WHERE type = 'index'
AND name LIKE 'idx_%'
ORDER BY tbl_name, name;
