package ru.mcs.sopds.service;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Service;
import java.io.*;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Properties;
@Slf4j
@Service
public class SettingsService {
private final Properties properties;
private final Path externalConfigPath;
public SettingsService() {
this.properties = new Properties();
this.externalConfigPath = Paths.get("sopds.properties");
loadSettings();
}
public void loadSettings() {
try {
// Сначала пробуем загрузить из внешнего файла (рядом с JAR)
if (Files.exists(externalConfigPath)) {
try (InputStream input = Files.newInputStream(externalConfigPath)) {
properties.load(input);
log.info("Настройки загружены из внешнего файла: {}", externalConfigPath.toAbsolutePath());
}
} else {
// Если внешнего файла нет, загружаем из ресурсов
Resource resource = new ClassPathResource("sopds.properties");
try (InputStream input = resource.getInputStream()) {
properties.load(input);
log.info("Настройки загружены из ресурсов");
}
// Создаем внешний файл для будущих изменений
saveSettings();
}
} catch (IOException e) {
log.error("Ошибка при загрузке настроек: {}", e.getMessage());
setDefaultSettings();
}
}
public void saveSettings() {
try (OutputStream output = Files.newOutputStream(externalConfigPath)) {
properties.store(output, "SOPDS Configuration File");
log.info("Настройки сохранены в файл: {}", externalConfigPath.toAbsolutePath());
} catch (IOException e) {
log.error("Ошибка при сохранении настроек: {}", e.getMessage());
}
}
private void setDefaultSettings() {
properties.setProperty("SOPDS_ALPHABET_MENU", "true");
properties.setProperty("SOPDS_SCAN_ENABLED", "true");
properties.setProperty("SOPDS_SCAN_PATH", "books");
properties.setProperty("SOPDS_PAGE_SIZE", "20");
properties.setProperty("SOPDS_TITLE", "Simple OPDS Catalog");
properties.setProperty("SOPDS_LANGUAGE", "ru");
}
// Общие методы для работы с настройками
public String getProperty(String key, String defaultValue) {
return properties.getProperty(key, defaultValue);
}
public void setProperty(String key, String value) {
properties.setProperty(key, value);
}
public boolean getBooleanProperty(String key, boolean defaultValue) {
String value = properties.getProperty(key);
if (value != null) {
return Boolean.parseBoolean(value);
}
return defaultValue;
}
public int getIntProperty(String key, int defaultValue) {
String value = properties.getProperty(key);
if (value != null) {
try {
return Integer.parseInt(value);
} catch (NumberFormatException e) {
log.warn("Некорректное значение для {}: {}", key, value);
}
}
return defaultValue;
}
// Специфичные геттеры и сеттеры для каждой настройки
public boolean getAlphabetMenu() {
return getBooleanProperty("SOPDS_ALPHABET_MENU", true);
}
public void setAlphabetMenu(boolean value) {
setProperty("SOPDS_ALPHABET_MENU", String.valueOf(value));
}
public boolean getScanEnabled() {
return getBooleanProperty("SOPDS_SCAN_ENABLED", true);
}
public void setScanEnabled(boolean value) {
setProperty("SOPDS_SCAN_ENABLED", String.valueOf(value));
}
public String getScanPath() {
return getProperty("SOPDS_SCAN_PATH", "books");
}
public void setScanPath(String value) {
setProperty("SOPDS_SCAN_PATH", value);
}
public int getPageSize() {
return getIntProperty("SOPDS_PAGE_SIZE", 20);
}
public void setPageSize(int value) {
setProperty("SOPDS_PAGE_SIZE", String.valueOf(value));
}
public String getTitle() {
return getProperty("SOPDS_TITLE", "Simple OPDS Catalog");
}
public void setTitle(String value) {
setProperty("SOPDS_TITLE", value);
}
public String getLanguage() {
return getProperty("SOPDS_LANGUAGE", "ru");
}
public void setLanguage(String value) {
setProperty("SOPDS_LANGUAGE", value);
}
// Метод для получения всех настроек (для отображения)
public Properties getAllProperties() {
return new Properties(properties);
}
}