package com.videoapp.tv import android.os.Bundle import android.view.View import android.widget.AdapterView import android.widget.ArrayAdapter import android.widget.Button import android.widget.EditText import android.widget.Spinner import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import com.videoapp.tv.data.ConfigRepository import com.videoapp.tv.data.SiteConfig import com.videoapp.tv.engine.SourceHandler import com.videoapp.tv.engine.SourceRegistry class SettingsActivity : AppCompatActivity() { private lateinit var configRepo: ConfigRepository private lateinit var spinnerPreset: Spinner private lateinit var editBaseUrl: EditText private lateinit var editSearchPath: EditText private lateinit var editSearchMethod: EditText private lateinit var editKeywordParam: EditText private lateinit var editExtraParams: EditText private lateinit var editResultSelector: EditText private lateinit var editTitleSelector: EditText private lateinit var editCoverSelector: EditText private lateinit var editLinkSelector: EditText private lateinit var editSourceSelector: EditText private lateinit var editSourceEpisodeGroupSelector: EditText private lateinit var btnSave: Button private lateinit var btnRestore: Button private var ignoringSpinner = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_settings) configRepo = ConfigRepository(this) spinnerPreset = findViewById(R.id.spinner_preset) editBaseUrl = findViewById(R.id.edit_base_url) editSearchPath = findViewById(R.id.edit_search_path) editSearchMethod = findViewById(R.id.edit_search_method) editKeywordParam = findViewById(R.id.edit_keyword_param) editExtraParams = findViewById(R.id.edit_extra_params) editResultSelector = findViewById(R.id.edit_result_selector) editTitleSelector = findViewById(R.id.edit_title_selector) editCoverSelector = findViewById(R.id.edit_cover_selector) editLinkSelector = findViewById(R.id.edit_link_selector) editSourceSelector = findViewById(R.id.edit_source_selector) editSourceEpisodeGroupSelector = findViewById(R.id.edit_source_episode_group_selector) btnSave = findViewById(R.id.btn_save) btnRestore = findViewById(R.id.btn_restore) setupSourceSpinner() loadConfig() btnSave.setOnClickListener { saveConfig() } btnRestore.setOnClickListener { configRepo.restoreDefault() loadConfig() Toast.makeText(this, R.string.config_restored, Toast.LENGTH_SHORT).show() } } private fun setupSourceSpinner() { val handlers = SourceRegistry.getAll() val names = handlers.map { it.displayName } val adapter = ArrayAdapter( this, android.R.layout.simple_spinner_item, names ) adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item) spinnerPreset.adapter = adapter val currentId = configRepo.getCurrentSourceId() val currentIndex = handlers.indexOfFirst { it.id == currentId } if (currentIndex >= 0) { spinnerPreset.setSelection(currentIndex) } spinnerPreset.onItemSelectedListener = object : AdapterView.OnItemSelectedListener { override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long) { if (ignoringSpinner) return val handler = handlers[position] configRepo.setCurrentSourceId(handler.id) } override fun onNothingSelected(parent: AdapterView<*>?) {} } } private fun loadConfigFromPreset(config: SiteConfig) { editBaseUrl.setText(config.baseUrl) editSearchPath.setText(config.searchPath) editSearchMethod.setText(config.searchMethod) editKeywordParam.setText(config.keywordParam) editExtraParams.setText( config.extraParams.entries.joinToString("&") { "${it.key}=${it.value}" } ) editResultSelector.setText(config.resultSelector) editTitleSelector.setText(config.titleSelector) editCoverSelector.setText(config.coverSelector) editLinkSelector.setText(config.linkSelector) editSourceSelector.setText(config.sourceSelector) editSourceEpisodeGroupSelector.setText(config.sourceEpisodeGroupSelector) } private fun loadConfig() { val config = configRepo.getConfig() loadConfigFromPreset(config) val handlers = SourceRegistry.getAll() val currentId = configRepo.getCurrentSourceId() val matchedIndex = handlers.indexOfFirst { it.id == currentId } if (matchedIndex >= 0) { ignoringSpinner = true spinnerPreset.setSelection(matchedIndex) ignoringSpinner = false } } private fun saveConfig() { val extraParams = parseExtraParams(editExtraParams.text.toString()) val config = SiteConfig( baseUrl = editBaseUrl.text.toString().trim(), searchPath = editSearchPath.text.toString().trim(), searchMethod = editSearchMethod.text.toString().trim(), keywordParam = editKeywordParam.text.toString().trim(), extraParams = extraParams, resultSelector = editResultSelector.text.toString().trim(), titleSelector = editTitleSelector.text.toString().trim(), coverSelector = editCoverSelector.text.toString().trim(), linkSelector = editLinkSelector.text.toString().trim(), sourceSelector = editSourceSelector.text.toString().trim(), sourceEpisodeGroupSelector = editSourceEpisodeGroupSelector.text.toString().trim() ) configRepo.saveConfig(config) Toast.makeText(this, R.string.config_saved, Toast.LENGTH_SHORT).show() finish() } private fun parseExtraParams(paramStr: String): Map { val map = mutableMapOf() if (paramStr.isBlank()) return map paramStr.split("&").forEach { pair -> val parts = pair.split("=", limit = 2) if (parts.size == 2) { map[parts[0].trim()] = parts[1].trim() } } return map } }