Configuration.kt

package de.pflugradts.passbird.application.configuration

import de.pflugradts.passbird.application.Directory
import de.pflugradts.passbird.domain.model.egg.PasswordRequirements

private const val DEFAULT_BACKUP_DIRECTORY = "backups"
private const val DEFAULT_CLIPBOARD_RESET_DELAY_SECONDS = 10
private const val DEFAULT_PASSWORD_LENGTH = 20

data class Configuration(
    @Transient override var template: Boolean = false,
    override val application: Application = Application(),
    override val adapter: Adapter = Adapter(),
    override val domain: Domain = Domain(),
) : UpdatableConfiguration {

    override fun parsePasswordRequirements() = PasswordRequirements(
        length = application.password.length,
        hasSpecialCharacters = application.password.specialCharacters,
    )

    override fun updateDirectory(directory: Directory) {
        application.backup.location = "${directory.value}/$DEFAULT_BACKUP_DIRECTORY"
        adapter.keyStore.location = directory.value
        adapter.passwordTree.location = directory.value
    }

    override fun updateKeyStoreDirectory(directory: Directory) {
        adapter.keyStore.location = directory.value
    }

    data class Application(
        override val backup: Backup = Backup(),
        override val exchange: Exchange = Exchange(),
        override val inactivityLimit: InactivityLimit = InactivityLimit(),
        override val password: Password = Password(),
    ) : ReadableConfiguration.Application
    data class Backup(
        override var location: String = DEFAULT_BACKUP_DIRECTORY,
        override var numberOfBackups: Int = 10,
        override val configuration: BackupSettings = BackupSettings(),
        override val passwordTree: BackupSettings = BackupSettings(),
        override val keyStore: BackupSettings = BackupSettings(),
    ) : ReadableConfiguration.Backup
    data class BackupSettings(
        override val enabled: Boolean = true,
        override val location: String? = null,
        override val numberOfBackups: Int? = null,
    ) : ReadableConfiguration.BackupSettings
    data class Exchange(
        override val promptOnExportFile: Boolean = true,
    ) : ReadableConfiguration.Exchange
    data class InactivityLimit(
        override val enabled: Boolean = false,
        override val limitInMinutes: Int = 10,
    ) : ReadableConfiguration.InactivityLimit
    data class Password(
        override val length: Int = DEFAULT_PASSWORD_LENGTH,
        override val specialCharacters: Boolean = true,
        override val promptOnRemoval: Boolean = true,
        override val customPasswordConfigurations: List<CustomPasswordConfiguration> = emptyList(),
    ) : ReadableConfiguration.Password
    data class CustomPasswordConfiguration(
        override val name: String = "",
        override val length: Int = DEFAULT_PASSWORD_LENGTH,
        override val hasNumbers: Boolean = true,
        override val hasLowercaseLetters: Boolean = true,
        override val hasUppercaseLetters: Boolean = true,
        override val hasSpecialCharacters: Boolean = true,
        override val unusedSpecialCharacters: String = "",
    ) : ReadableConfiguration.CustomPasswordConfiguration
    data class Adapter(
        override val clipboard: Clipboard = Clipboard(),
        override val keyStore: KeyStore = KeyStore(),
        override val passwordTree: PasswordTree = PasswordTree(),
        override val userInterface: UserInterface = UserInterface(),
    ) : ReadableConfiguration.Adapter
    data class Clipboard(override val reset: ClipboardReset = ClipboardReset()) : ReadableConfiguration.Clipboard
    data class ClipboardReset(
        override val enabled: Boolean = true,
        override val delaySeconds: Int = DEFAULT_CLIPBOARD_RESET_DELAY_SECONDS,
    ) : ReadableConfiguration.ClipboardReset
    data class PasswordTree(
        override var location: String = "",
        override val verifySignature: Boolean = true,
        override val verifyChecksum: Boolean = true,
    ) : ReadableConfiguration.PasswordTree
    data class KeyStore(override var location: String = "") : ReadableConfiguration.KeyStore
    data class UserInterface(
        override val ansiEscapeCodes: AnsiEscapeCodes = AnsiEscapeCodes(),
        override val audibleBell: Boolean = false,
        override val secureInput: Boolean = true,
    ) : ReadableConfiguration.UserInterface
    data class AnsiEscapeCodes(override val enabled: Boolean = false) : ReadableConfiguration.AnsiEscapeCodes
    data class Domain(
        override val eggIdMemory: EggIdMemory = EggIdMemory(),
        override val protein: Protein = Protein(),
    ) : ReadableConfiguration.Domain
    data class EggIdMemory(
        override val enabled: Boolean = true,
        override val persisted: Boolean = false,
    ) : ReadableConfiguration.EggIdMemory
    data class Protein(
        override val secureProteinStructureInput: Boolean = true,
        override val promptForProteinStructureInputToggle: Boolean = false,
    ) : ReadableConfiguration.Protein
}