package com.demandware.studio.settings;

import com.intellij.ide.passwordSafe.PasswordSafe;
import com.intellij.ide.passwordSafe.PasswordSafeException;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.components.StoragePathMacros;
import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.module.Module;
import com.intellij.openapi.module.ModuleServiceManager;
import com.intellij.openapi.util.text.StringUtil;

import java.util.UUID;


@State(
    name = "DWSettingsProvider",
    storages = {
        @Storage(file = StoragePathMacros.MODULE_FILE)
    }
)
public class DWSettingsProvider implements PersistentStateComponent<DWSettingsProvider.State> {
    public static final Logger LOG = Logger.getInstance(DWSettingsProvider.class);
    private State myState = new State();

    public static DWSettingsProvider getInstance(Module module) {
        return ModuleServiceManager.getService(module, DWSettingsProvider.class);
    }

    public String getHostname() {
        return myState.hostname;
    }

    public void setHostname(String hostname) {
        myState.hostname = hostname;
    }

    public String getUsername() {
        return myState.username;
    }

    public void setUsername(String username) {
        myState.username = username;
    }

    public String getPassword() {
        String password;
        try {
            password = PasswordSafe.getInstance().getPassword(null, DWSettingsProvider.class, myState.passwordKey);
        } catch (PasswordSafeException e) {
            LOG.info("Couldn't get password for key " + myState.passwordKey, e);
            password = "";
        }
        return StringUtil.notNullize(password);
    }

    public void setPassword(String password) {
        try {
            PasswordSafe.getInstance().storePassword(null, DWSettingsProvider.class, myState.passwordKey, password != null ? password : "");
        } catch (PasswordSafeException e) {
            LOG.info("Couldn't set password for key " + myState.passwordKey, e);
        }
    }

    public String getVersion() {
        return myState.version;
    }

    public void setVersion(String version) {
        myState.version = version;
    }

    public boolean getAutoUploadEnabled() {
        return myState.autoUploadEnabled;
    }

    public void setAutoUploadEnabled(boolean autoUploadEnabled) {
        myState.autoUploadEnabled = autoUploadEnabled;
    }

    public String getPasswordKey() {
        return myState.passwordKey;
    }

    public void setPasswordKey(String passwordKey) {
        myState.passwordKey = passwordKey;
    }

    @Override
    public State getState() {
        return myState;
    }

    @Override
    public void loadState(State state) {
        myState.hostname = state.hostname;
        myState.username = state.username;
        myState.passwordKey = state.passwordKey;
        myState.version = state.version;
        myState.autoUploadEnabled = state.autoUploadEnabled;
    }

    public static class State {
        public String hostname;
        public String username;
        public String passwordKey = UUID.randomUUID().toString();
        public String version;
        public boolean autoUploadEnabled;
    }
}