-- Performance indexes for optimal query performance
-- Run this migration to achieve 10/10 database performance

-- Articles table indexes
CREATE INDEX IF NOT EXISTS idx_articles_published_date ON articles(published, published_at DESC) WHERE published = true;
CREATE INDEX IF NOT EXISTS idx_articles_slug ON articles(slug) WHERE slug IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_articles_category ON articles(category_id) WHERE category_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_articles_author ON articles(author_id);
CREATE INDEX IF NOT EXISTS idx_articles_featured ON articles(featured, published_at DESC) WHERE featured = true AND published = true;
CREATE INDEX IF NOT EXISTS idx_articles_search ON articles USING gin(to_tsvector('english', title || ' ' || COALESCE(content, '')));

-- Players table indexes
CREATE INDEX IF NOT EXISTS idx_players_team ON players(team_id) WHERE team_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_players_position ON players(position) WHERE position IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_players_active ON players(is_active) WHERE is_active = true;
CREATE INDEX IF NOT EXISTS idx_players_name ON players(name);

-- Users table indexes
CREATE INDEX IF NOT EXISTS idx_users_email ON users(email);
CREATE INDEX IF NOT EXISTS idx_users_role ON users(role);
CREATE INDEX IF NOT EXISTS idx_users_created ON users(created_at DESC);

-- Categories table indexes
CREATE INDEX IF NOT EXISTS idx_categories_name ON categories(name);

-- Newsletter subscriptions indexes
CREATE INDEX IF NOT EXISTS idx_newsletter_email ON newsletter_subscriptions(email);
CREATE INDEX IF NOT EXISTS idx_newsletter_active ON newsletter_subscriptions(is_active) WHERE is_active = true;

-- Contact messages indexes
CREATE INDEX IF NOT EXISTS idx_contact_messages_created ON contact_messages(created_at DESC);
CREATE INDEX IF NOT EXISTS idx_contact_messages_read ON contact_messages(is_read) WHERE is_read = false;

-- Polls indexes
CREATE INDEX IF NOT EXISTS idx_polls_active ON polls(is_active, end_date) WHERE is_active = true;
CREATE INDEX IF NOT EXISTS idx_poll_votes_poll ON poll_votes(poll_id);
CREATE INDEX IF NOT EXISTS idx_poll_votes_user ON poll_votes(user_identifier);

-- Match overrides indexes
CREATE INDEX IF NOT EXISTS idx_match_overrides_external ON match_overrides(external_match_id);

-- Team logo overrides indexes
CREATE INDEX IF NOT EXISTS idx_team_logo_external ON team_logo_overrides(external_team_id);

-- Uploaded files indexes
CREATE INDEX IF NOT EXISTS idx_uploaded_files_user ON uploaded_files(uploaded_by_id) WHERE uploaded_by_id IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_uploaded_files_created ON uploaded_files(created_at DESC);

-- Settings table (only one row, no index needed)

-- Competition aliases indexes
CREATE INDEX IF NOT EXISTS idx_competition_aliases_code ON competition_aliases(code);
CREATE INDEX IF NOT EXISTS idx_competition_aliases_order ON competition_aliases(display_order) WHERE display_order > 0;

-- Clothing items indexes
CREATE INDEX IF NOT EXISTS idx_clothing_category ON clothing(category) WHERE category IS NOT NULL;
CREATE INDEX IF NOT EXISTS idx_clothing_available ON clothing(is_available) WHERE is_available = true;

-- Composite indexes for common queries
CREATE INDEX IF NOT EXISTS idx_articles_category_published ON articles(category_id, published, published_at DESC) WHERE published = true;
CREATE INDEX IF NOT EXISTS idx_articles_author_published ON articles(author_id, published, published_at DESC) WHERE published = true;

-- Partial indexes for better performance on filtered queries
CREATE INDEX IF NOT EXISTS idx_articles_published_only ON articles(published_at DESC) WHERE published = true;
CREATE INDEX IF NOT EXISTS idx_articles_unpublished_only ON articles(created_at DESC) WHERE published = false;

-- VACUUM ANALYZE to update statistics
VACUUM ANALYZE articles;
VACUUM ANALYZE players;
VACUUM ANALYZE users;
VACUUM ANALYZE categories;
VACUUM ANALYZE newsletter_subscriptions;
VACUUM ANALYZE contact_messages;
VACUUM ANALYZE polls;
VACUUM ANALYZE poll_options;
VACUUM ANALYZE poll_votes;

-- Add comments for documentation
COMMENT ON INDEX idx_articles_published_date IS 'Optimizes published articles listing';
COMMENT ON INDEX idx_articles_search IS 'Full-text search on articles';
COMMENT ON INDEX idx_players_team IS 'Player queries by team';
COMMENT ON INDEX idx_newsletter_active IS 'Active subscriber queries';
