-- Migration: Settings tables
-- Date: 2026-01-24

-- Definicje parametrów (tylko admin może zarządzać)
CREATE TABLE IF NOT EXISTS settings_definitions (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    key VARCHAR(100) UNIQUE NOT NULL,
    type VARCHAR(20) NOT NULL CHECK(type IN ('boolean', 'int', 'long', 'string')),
    default_value TEXT,
    label VARCHAR(255) NOT NULL,
    description TEXT,
    group_name VARCHAR(100) DEFAULT 'general',
    min_scope VARCHAR(20) DEFAULT 'device' CHECK(min_scope IN ('global', 'reseller', 'user', 'device')),
    options_json TEXT,                      -- dla nie-stringów: [{"value": 0, "label": "Góra-lewo"}]
    sort_order INTEGER DEFAULT 0,
    is_active INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP
);

-- Zestawy ustawień (presety)
CREATE TABLE IF NOT EXISTS settings_presets (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    name VARCHAR(255) NOT NULL,
    description TEXT,
    created_by INTEGER,
    is_active INTEGER DEFAULT 1,
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (created_by) REFERENCES users(id) ON DELETE SET NULL
);

-- Elementy presetów
CREATE TABLE IF NOT EXISTS settings_preset_items (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    preset_id INTEGER NOT NULL,
    definition_id INTEGER NOT NULL,
    value TEXT NOT NULL,
    FOREIGN KEY (preset_id) REFERENCES settings_presets(id) ON DELETE CASCADE,
    FOREIGN KEY (definition_id) REFERENCES settings_definitions(id) ON DELETE CASCADE,
    UNIQUE(preset_id, definition_id)
);

-- Wartości ustawień (przypisane do scope)
CREATE TABLE IF NOT EXISTS settings_values (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    scope VARCHAR(20) NOT NULL CHECK(scope IN ('global', 'reseller', 'user', 'device')),
    scope_id INTEGER,                       -- NULL dla global
    definition_id INTEGER NOT NULL,
    value TEXT NOT NULL,
    updated_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    updated_by INTEGER,
    FOREIGN KEY (definition_id) REFERENCES settings_definitions(id) ON DELETE CASCADE,
    FOREIGN KEY (updated_by) REFERENCES users(id) ON DELETE SET NULL,
    UNIQUE(scope, scope_id, definition_id)
);

-- Timestampy ustawień per scope (do API)
CREATE TABLE IF NOT EXISTS settings_timestamps (
    id INTEGER PRIMARY KEY AUTOINCREMENT,
    scope VARCHAR(20) NOT NULL CHECK(scope IN ('global', 'reseller', 'user', 'device')),
    scope_id INTEGER,                       -- NULL dla global
    updated_at INTEGER NOT NULL,            -- unix timestamp
    UNIQUE(scope, scope_id)
);

-- Indeksy
CREATE INDEX IF NOT EXISTS idx_settings_definitions_group ON settings_definitions(group_name);
CREATE INDEX IF NOT EXISTS idx_settings_definitions_key ON settings_definitions(key);
CREATE INDEX IF NOT EXISTS idx_settings_values_scope ON settings_values(scope, scope_id);
CREATE INDEX IF NOT EXISTS idx_settings_values_definition ON settings_values(definition_id);
CREATE INDEX IF NOT EXISTS idx_settings_timestamps_scope ON settings_timestamps(scope, scope_id);
CREATE INDEX IF NOT EXISTS idx_settings_preset_items_preset ON settings_preset_items(preset_id);

-- Wstaw domyślne definicje ustawień
INSERT OR IGNORE INTO settings_definitions (key, type, default_value, label, description, group_name, min_scope, options_json, sort_order) VALUES
-- EPG
('shouldUpdateTvGuideOnAppStart', 'boolean', 'true', 'Aktualizuj EPG przy starcie', 'Automatyczna aktualizacja przewodnika TV przy uruchomieniu aplikacji', 'epg', 'user', NULL, 10),
('shouldUpdateTvGuideOnPlaylistsChange', 'boolean', 'true', 'Aktualizuj EPG przy zmianie playlist', 'Automatyczna aktualizacja EPG gdy zmienią się playlisty', 'epg', 'user', NULL, 20),
('shouldStoreProgramDescriptions', 'boolean', 'true', 'Zapisuj opisy programów', 'Przechowuj opisy programów w pamięci', 'epg', 'user', NULL, 30),

-- Zegar
('isPlayerClockEnabled', 'boolean', 'true', 'Włącz zegar w playerze', 'Pokazuj zegar podczas odtwarzania', 'clock', 'user', NULL, 10),
('showClockInInfoPanel', 'boolean', 'true', 'Zegar w panelu info', 'Pokazuj zegar w panelu informacyjnym', 'clock', 'user', NULL, 20),
('showDateOnClockInInfoPanel', 'boolean', 'true', 'Data przy zegarze', 'Pokazuj datę obok zegara', 'clock', 'user', NULL, 30),
('playerClockPosition', 'int', '0', 'Pozycja zegara', 'Położenie zegara na ekranie', 'clock', 'user', '[{"value":0,"label":"Góra-lewo"},{"value":1,"label":"Góra-prawo"},{"value":2,"label":"Dół-lewo"},{"value":3,"label":"Dół-prawo"}]', 40),

-- UI
('uiTransparency', 'int', '30', 'Przezroczystość UI', 'Poziom przezroczystości interfejsu (0-100)', 'ui', 'user', NULL, 10),
('backgroundColor', 'int', '17', 'Kolor tła', 'Kolor tła interfejsu', 'ui', 'device', '[{"value":0,"label":"Czarny"},{"value":1,"label":"Ciemnoszary"},{"value":17,"label":"Domyślny"}]', 20),
('selectionColor', 'int', '4', 'Kolor zaznaczenia', 'Kolor podświetlenia wybranego elementu', 'ui', 'device', '[{"value":0,"label":"Czerwony"},{"value":1,"label":"Zielony"},{"value":2,"label":"Niebieski"},{"value":3,"label":"Żółty"},{"value":4,"label":"Biały"}]', 30),
('isWhiteSelectionColor', 'boolean', 'true', 'Biały kolor zaznaczenia', 'Użyj białego koloru dla zaznaczenia', 'ui', 'device', NULL, 40),

-- Kanały
('showChannelNumbers', 'boolean', 'true', 'Numery kanałów', 'Pokazuj numery przy kanałach', 'channels', 'user', NULL, 10),
('showChannelNames', 'boolean', 'true', 'Nazwy kanałów', 'Pokazuj nazwy kanałów', 'channels', 'user', NULL, 20),
('shouldGroupChannelsByPlaylists', 'boolean', 'true', 'Grupuj wg playlist', 'Grupuj kanały według playlist', 'channels', 'user', NULL, 30),
('showFavorites', 'boolean', 'true', 'Pokaż ulubione', 'Wyświetlaj sekcję ulubionych', 'channels', 'user', NULL, 40),
('showFavoriteChannelsFirst', 'boolean', 'false', 'Ulubione na początku', 'Pokazuj ulubione kanały na początku listy', 'channels', 'user', NULL, 50),
('highlightCurrentChannelInColor', 'boolean', 'true', 'Podświetl bieżący kanał', 'Kolorowe podświetlenie aktualnego kanału', 'channels', 'device', NULL, 60),

-- Player
('showVideoResolution', 'boolean', 'false', 'Pokaż rozdzielczość', 'Wyświetlaj rozdzielczość wideo', 'player', 'user', NULL, 10),
('showBlackScreen', 'boolean', 'false', 'Czarny ekran przy przełączaniu', 'Pokazuj czarny ekran podczas zmiany kanału', 'player', 'device', NULL, 20),
('autoPlayChannelsOnChannelsList', 'boolean', 'false', 'Auto-play na liście', 'Automatycznie odtwarzaj przy przeglądaniu listy', 'player', 'user', NULL, 30),

-- Panel informacyjny
('showProgramDescriptionInInfoPanel', 'boolean', 'true', 'Opis programu w panelu', 'Pokazuj opis programu w panelu info', 'info_panel', 'user', NULL, 10),
('showPlaylistAndGroupNameInInfoPanel', 'boolean', 'true', 'Nazwa playlisty w panelu', 'Pokazuj nazwę playlisty i grupy', 'info_panel', 'user', NULL, 20),
('showMediaPropertiesInInfoPanel', 'boolean', 'true', 'Właściwości mediów', 'Pokazuj właściwości strumienia', 'info_panel', 'user', NULL, 30),
('showInfoPanelAtBottom', 'boolean', 'false', 'Panel info na dole', 'Umieść panel informacyjny na dole ekranu', 'info_panel', 'device', NULL, 40),
('isInfoPanelCardStyleEnabled', 'boolean', 'false', 'Styl karty', 'Użyj stylu karty dla panelu info', 'info_panel', 'device', NULL, 50),

-- Programy
('highlightCurrentPrograms', 'boolean', 'true', 'Podświetl bieżące programy', 'Wyróżniaj aktualnie nadawane programy', 'programs', 'user', NULL, 10),
('highlightCurrentProgramsInChannelsList', 'boolean', 'true', 'Podświetl na liście kanałów', 'Podświetlaj bieżące programy na liście kanałów', 'programs', 'user', NULL, 20),
('showProgramsNextToChannels', 'boolean', 'true', 'Programy obok kanałów', 'Pokazuj programy obok nazw kanałów', 'programs', 'user', NULL, 30),
('dimPastProgramsInChannelsList', 'boolean', 'false', 'Przyciemnij minione', 'Przyciemniaj minione programy', 'programs', 'user', NULL, 40),

-- Catchup/Historia
('showCatchupIconInChannelsList', 'boolean', 'true', 'Ikona catchup', 'Pokazuj ikonę catchup przy kanałach', 'catchup', 'user', NULL, 10),
('showHistoryButton', 'boolean', 'true', 'Przycisk historii', 'Pokazuj przycisk historii', 'catchup', 'user', NULL, 20),
('showCurrentProgramsInHistory', 'boolean', 'true', 'Bieżące w historii', 'Pokazuj bieżące programy w historii', 'catchup', 'user', NULL, 30),

-- VOD
('moviesSorting', 'int', '3', 'Sortowanie filmów', 'Sposób sortowania filmów', 'vod', 'user', '[{"value":0,"label":"Domyślne"},{"value":1,"label":"A-Z"},{"value":2,"label":"Z-A"},{"value":3,"label":"Najnowsze"}]', 10),
('seriesSorting', 'int', '3', 'Sortowanie seriali', 'Sposób sortowania seriali', 'vod', 'user', '[{"value":0,"label":"Domyślne"},{"value":1,"label":"A-Z"},{"value":2,"label":"Z-A"},{"value":3,"label":"Najnowsze"}]', 20),

-- System
('autoUpdateApp', 'boolean', 'true', 'Auto-aktualizacja', 'Automatycznie aktualizuj aplikację', 'system', 'global', NULL, 10),
('sendLogs', 'boolean', 'false', 'Wysyłaj logi', 'Wysyłaj logi diagnostyczne', 'system', 'global', NULL, 20),
('sendStatistics', 'boolean', 'false', 'Wysyłaj statystyki', 'Wysyłaj anonimowe statystyki użycia', 'system', 'global', NULL, 30),
('allowNonTvUsage', 'boolean', 'true', 'Zezwól na użycie poza TV', 'Pozwól uruchamiać na urządzeniach innych niż TV', 'system', 'reseller', NULL, 40);

-- Wstaw domyślny timestamp globalny
INSERT OR IGNORE INTO settings_timestamps (scope, scope_id, updated_at) VALUES ('global', NULL, strftime('%s', 'now'));
