package com.grigowashere.aismap;

import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.widget.Button;
import android.widget.EditText;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.Toast;

import com.google.android.material.switchmaterial.SwitchMaterial;

import androidx.appcompat.app.AppCompatActivity;

import com.grigowashere.aismap.utils.SettingsManager;

/**
 * Экран настроек приложения
 */
public class SettingsActivity extends AppCompatActivity {
    
    private static final String TAG = "SettingsActivity";
    
    private SettingsManager settingsManager;
    
    // UI элементы
    private EditText etUDPPort;
    private SwitchMaterial switchUDPEnabled;
    private SwitchMaterial switchAndroidNMEAEnabled;
    private SwitchMaterial switchUDPNMEAEnabled;
    private RadioGroup radioGroupDataMode;
    private RadioButton radioHybridMode;
    private RadioButton radioNMEAOnly;
    private RadioButton radioAndroidOnly;
    private EditText etStaleWarningMinutes;
    private EditText etStaleRemoveMinutes;
    private SwitchMaterial switchVibrationEnabled;
    private SwitchMaterial switchSoundEnabled;
    private Button btnCancel;
    private Button btnSave;
    
    // Состояние настроек до изменений
    private int originalUDPPort;
    private boolean originalUDPEnabled;
    private boolean originalAndroidNMEAEnabled;
    private boolean originalUDPNMEAEnabled;
    private String originalDataMode;
    private int originalStaleWarningMinutes;
    private int originalStaleRemoveMinutes;
    private boolean originalVibrationEnabled;
    private boolean originalSoundEnabled;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_settings);
        
        // Инициализируем менеджер настроек
        settingsManager = new SettingsManager(this);
        
        // Инициализируем UI элементы
        initializeViews();
        
        // Загружаем текущие настройки
        loadCurrentSettings();
        
        // Сохраняем оригинальные значения
        saveOriginalSettings();
        
        // Настраиваем обработчики событий
        setupEventHandlers();
        
        Log.i(TAG, "SettingsActivity создан");
    }
    
    /**
     * Инициализирует UI элементы
     */
    private void initializeViews() {
        etUDPPort = findViewById(R.id.et_udp_port);
        switchUDPEnabled = findViewById(R.id.switch_udp_enabled);
        switchAndroidNMEAEnabled = findViewById(R.id.switch_android_nmea_enabled);
        switchUDPNMEAEnabled = findViewById(R.id.switch_udp_nmea_enabled);
        radioGroupDataMode = findViewById(R.id.radio_group_data_mode);
        radioHybridMode = findViewById(R.id.radio_hybrid_mode);
        radioNMEAOnly = findViewById(R.id.radio_nmea_only);
        radioAndroidOnly = findViewById(R.id.radio_android_only);
        etStaleWarningMinutes = findViewById(R.id.et_stale_warning_minutes);
        etStaleRemoveMinutes = findViewById(R.id.et_stale_remove_minutes);
        switchVibrationEnabled = findViewById(R.id.switch_vibration_enabled);
        switchSoundEnabled = findViewById(R.id.switch_sound_enabled);
        btnCancel = findViewById(R.id.btn_cancel);
        btnSave = findViewById(R.id.btn_save);
    }
    
    /**
     * Загружает текущие настройки в UI
     */
    private void loadCurrentSettings() {
        // UDP настройки
        etUDPPort.setText(String.valueOf(settingsManager.getUDPPort()));
        switchUDPEnabled.setChecked(settingsManager.isUDPEnabled());
        
        // NMEA настройки
        switchAndroidNMEAEnabled.setChecked(settingsManager.isAndroidNMEAEnabled());
        switchUDPNMEAEnabled.setChecked(settingsManager.isUDPNMEAEnabled());
        
        // Режим данных
        String dataMode = settingsManager.getDataMode();
        switch (dataMode) {
            case SettingsManager.DATA_MODE_HYBRID:
                radioHybridMode.setChecked(true);
                break;
            case SettingsManager.DATA_MODE_NMEA_ONLY:
                radioNMEAOnly.setChecked(true);
                break;
            case SettingsManager.DATA_MODE_ANDROID_ONLY:
                radioAndroidOnly.setChecked(true);
                break;
        }
        
        // Настройки устаревания данных
        etStaleWarningMinutes.setText(String.valueOf(settingsManager.getDataStaleWarningMinutes()));
        etStaleRemoveMinutes.setText(String.valueOf(settingsManager.getDataStaleRemoveMinutes()));
        
        // Настройки уведомлений
        switchVibrationEnabled.setChecked(settingsManager.isVibrationEnabled());
        switchSoundEnabled.setChecked(settingsManager.isSoundEnabled());
        
        Log.i(TAG, "Настройки загружены в UI");
    }
    
    /**
     * Сохраняет оригинальные значения настроек
     */
    private void saveOriginalSettings() {
        originalUDPPort = settingsManager.getUDPPort();
        originalUDPEnabled = settingsManager.isUDPEnabled();
        originalAndroidNMEAEnabled = settingsManager.isAndroidNMEAEnabled();
        originalUDPNMEAEnabled = settingsManager.isUDPNMEAEnabled();
        originalDataMode = settingsManager.getDataMode();
        originalStaleWarningMinutes = settingsManager.getDataStaleWarningMinutes();
        originalStaleRemoveMinutes = settingsManager.getDataStaleRemoveMinutes();
        originalVibrationEnabled = settingsManager.isVibrationEnabled();
        originalSoundEnabled = settingsManager.isSoundEnabled();
        
        Log.i(TAG, "Оригинальные настройки сохранены");
    }
    
    /**
     * Настраивает обработчики событий
     */
    private void setupEventHandlers() {
        // Кнопка отмены
        btnCancel.setOnClickListener(v -> {
            Log.i(TAG, "Нажата кнопка отмены");
            finish();
        });
        
        // Кнопка сохранения
        btnSave.setOnClickListener(v -> {
            Log.i(TAG, "Нажата кнопка сохранения");
            saveSettings();
        });
        
        // Обработчик изменения режима данных
        radioGroupDataMode.setOnCheckedChangeListener((group, checkedId) -> {
            updateDataModeDescription();
        });
        
        // Обработчики переключателей для валидации
        switchAndroidNMEAEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
            validateDataModeSettings();
        });
        
        switchUDPNMEAEnabled.setOnCheckedChangeListener((buttonView, isChecked) -> {
            validateDataModeSettings();
        });
    }
    
    /**
     * Обновляет описание режима данных
     */
    private void updateDataModeDescription() {
        // Здесь можно добавить динамическое обновление описаний
        // в зависимости от выбранного режима
    }
    
    /**
     * Валидирует настройки режима данных
     */
    private void validateDataModeSettings() {
        boolean androidNMEA = switchAndroidNMEAEnabled.isChecked();
        boolean udpNMEA = switchUDPNMEAEnabled.isChecked();
        
        // Если оба источника отключены, показываем предупреждение
        if (!androidNMEA && !udpNMEA) {
            Toast.makeText(this, "Внимание: Все источники данных отключены!", 
                Toast.LENGTH_LONG).show();
        }
        
        // Если выбран режим "только NMEA", но UDP NMEA отключен
        if (radioNMEAOnly.isChecked() && !udpNMEA) {
            Toast.makeText(this, "Для режима 'Только NMEA' необходимо включить UDP NMEA", 
                Toast.LENGTH_LONG).show();
        }
        
        // Если выбран режим "только Android", но Android NMEA отключен
        if (radioAndroidOnly.isChecked() && !androidNMEA) {
            Toast.makeText(this, "Для режима 'Только Android GPS' необходимо включить Android NMEA", 
                Toast.LENGTH_LONG).show();
        }
    }
    
    /**
     * Сохраняет настройки
     */
    private void saveSettings() {
        try {
            // Валидируем UDP порт
            String portText = etUDPPort.getText().toString().trim();
            if (portText.isEmpty()) {
                Toast.makeText(this, "Порт не может быть пустым", Toast.LENGTH_SHORT).show();
                return;
            }
            
            int udpPort;
            try {
                udpPort = Integer.parseInt(portText);
                if (udpPort < 1 || udpPort > 65535) {
                    Toast.makeText(this, "Порт должен быть от 1 до 65535", Toast.LENGTH_SHORT).show();
                    return;
                }
            } catch (NumberFormatException e) {
                Toast.makeText(this, "Некорректный формат порта", Toast.LENGTH_SHORT).show();
                return;
            }
            
            // Получаем выбранный режим данных
            String dataMode = getSelectedDataMode();
            
            // Валидируем режим данных
            if (!validateDataMode(dataMode)) {
                return;
            }
            
            // Валидируем настройки устаревания данных
            int staleWarningMinutes = validateStaleMinutes(etStaleWarningMinutes.getText().toString().trim(), "время предупреждения");
            if (staleWarningMinutes == -1) return;
            
            int staleRemoveMinutes = validateStaleMinutes(etStaleRemoveMinutes.getText().toString().trim(), "время удаления");
            if (staleRemoveMinutes == -1) return;
            
            // Проверяем логичность значений
            if (staleWarningMinutes >= staleRemoveMinutes) {
                Toast.makeText(this, "Время предупреждения должно быть меньше времени удаления", Toast.LENGTH_SHORT).show();
                return;
            }
            
            // Сохраняем настройки
            settingsManager.setUDPPort(udpPort);
            settingsManager.setUDPEnabled(switchUDPEnabled.isChecked());
            settingsManager.setAndroidNMEAEnabled(switchAndroidNMEAEnabled.isChecked());
            settingsManager.setUDPNMEAEnabled(switchUDPNMEAEnabled.isChecked());
            settingsManager.setDataMode(dataMode);
            settingsManager.setDataStaleWarningMinutes(staleWarningMinutes);
            settingsManager.setDataStaleRemoveMinutes(staleRemoveMinutes);
            settingsManager.setVibrationEnabled(switchVibrationEnabled.isChecked());
            settingsManager.setSoundEnabled(switchSoundEnabled.isChecked());
            
            Log.i(TAG, "Настройки сохранены: " + settingsManager.getSettingsSummary());
            
            // Проверяем, нужно ли уведомить MainActivity об изменениях
            boolean needsRestart = checkIfRestartNeeded();
            
            // Возвращаем результат
            Intent resultIntent = new Intent();
            resultIntent.putExtra("settings_changed", true);
            resultIntent.putExtra("needs_restart", needsRestart);
            resultIntent.putExtra("udp_port", udpPort);
            resultIntent.putExtra("udp_enabled", switchUDPEnabled.isChecked());
            resultIntent.putExtra("android_nmea_enabled", switchAndroidNMEAEnabled.isChecked());
            resultIntent.putExtra("udp_nmea_enabled", switchUDPNMEAEnabled.isChecked());
            resultIntent.putExtra("data_mode", dataMode);
            
            setResult(RESULT_OK, resultIntent);
            
            Toast.makeText(this, "Настройки сохранены", Toast.LENGTH_SHORT).show();
            finish();
            
        } catch (Exception e) {
            Log.e(TAG, "Ошибка при сохранении настроек: " + e.getMessage(), e);
            Toast.makeText(this, "Ошибка при сохранении настроек", Toast.LENGTH_SHORT).show();
        }
    }
    
    /**
     * Получает выбранный режим данных
     */
    private String getSelectedDataMode() {
        int checkedId = radioGroupDataMode.getCheckedRadioButtonId();
        
        if (checkedId == R.id.radio_hybrid_mode) {
            return SettingsManager.DATA_MODE_HYBRID;
        } else if (checkedId == R.id.radio_nmea_only) {
            return SettingsManager.DATA_MODE_NMEA_ONLY;
        } else if (checkedId == R.id.radio_android_only) {
            return SettingsManager.DATA_MODE_ANDROID_ONLY;
        } else {
            return SettingsManager.DATA_MODE_HYBRID; // По умолчанию
        }
    }
    
    /**
     * Валидирует режим данных
     */
    private boolean validateDataMode(String dataMode) {
        boolean androidNMEA = switchAndroidNMEAEnabled.isChecked();
        boolean udpNMEA = switchUDPNMEAEnabled.isChecked();
        
        switch (dataMode) {
            case SettingsManager.DATA_MODE_HYBRID:
                if (!androidNMEA && !udpNMEA) {
                    Toast.makeText(this, "Для гибридного режима необходимо включить хотя бы один источник данных", 
                        Toast.LENGTH_LONG).show();
                    return false;
                }
                break;
                
            case SettingsManager.DATA_MODE_NMEA_ONLY:
                if (!udpNMEA) {
                    Toast.makeText(this, "Для режима 'Только NMEA' необходимо включить UDP NMEA", 
                        Toast.LENGTH_LONG).show();
                    return false;
                }
                break;
                
            case SettingsManager.DATA_MODE_ANDROID_ONLY:
                if (!androidNMEA) {
                    Toast.makeText(this, "Для режима 'Только Android GPS' необходимо включить Android NMEA", 
                        Toast.LENGTH_LONG).show();
                    return false;
                }
                break;
        }
        
        return true;
    }
    
    /**
     * Валидирует время устаревания данных
     */
    private int validateStaleMinutes(String text, String fieldName) {
        if (text.isEmpty()) {
            Toast.makeText(this, fieldName + " не может быть пустым", Toast.LENGTH_SHORT).show();
            return -1;
        }
        
        try {
            int minutes = Integer.parseInt(text);
            if (minutes < 1 || minutes > 60) {
                Toast.makeText(this, fieldName + " должно быть от 1 до 60 минут", Toast.LENGTH_SHORT).show();
                return -1;
            }
            return minutes;
        } catch (NumberFormatException e) {
            Toast.makeText(this, "Некорректный формат " + fieldName, Toast.LENGTH_SHORT).show();
            return -1;
        }
    }
    
    /**
     * Проверяет, нужно ли перезапустить сервисы
     */
    private boolean checkIfRestartNeeded() {
        return settingsManager.shouldRestartUDP(originalUDPPort, originalUDPEnabled) ||
               settingsManager.shouldRestartNMEA(originalAndroidNMEAEnabled, originalUDPNMEAEnabled, originalDataMode);
    }
    
    @Override
    public void onBackPressed() {
        Log.i(TAG, "Нажата кнопка назад");
        finish();
    }
}
