package com.jscs.settings;

import com.jscs.cli.JscsFinder;
import com.intellij.openapi.components.*;
import com.intellij.openapi.project.Project;
import com.intellij.util.xmlb.XmlSerializerUtil;
import com.jscs.cli.JscsSettings;
import com.wix.utils.Strings;
import org.jetbrains.annotations.Nullable;

@State(name = "JscsProjectComponent",
        storages = {
                @Storage(id = "default", file = StoragePathMacros.PROJECT_FILE),
                @Storage(id = "dir", file = StoragePathMacros.PROJECT_CONFIG_DIR + "/jscsPlugin.xml", scheme = StorageScheme.DIRECTORY_BASED)})
public class Settings implements PersistentStateComponent<Settings> {
    public String jscsrcFile = JscsFinder.JSCSRC;
    public String preset = "";
    public String jscsExecutable = "";
    public String nodeInterpreter;
    public boolean treatAllIssuesAsWarnings;
    public boolean pluginEnabled;
    public boolean esnext;
    public String esprima;

    public boolean isEqualTo(Settings settings) {
        return settings != null && esnext == settings.esnext && pluginEnabled == settings.pluginEnabled &&
                treatAllIssuesAsWarnings == settings.treatAllIssuesAsWarnings &&
                Strings.areEqual(jscsExecutable, settings.jscsExecutable) &&
                Strings.areEqual(esprima, settings.esprima) &&
                Strings.areEqual(jscsrcFile, settings.jscsrcFile) &&
                Strings.areEqual(nodeInterpreter, settings.nodeInterpreter) &&
                Strings.areEqual(preset, settings.preset);
    }

    public JscsSettings toJscsSettings() {
        JscsSettings settings = new JscsSettings();
        settings.node = nodeInterpreter;
        settings.jscsExecutablePath = jscsExecutable;
        settings.preset = preset;
        settings.config = jscsrcFile;
        settings.esnext = esnext;
        settings.esprima = esprima;
        return settings;
    }

    protected Project project;

    public static Settings getInstance(Project project) {
        Settings settings = ServiceManager.getService(project, Settings.class);
        settings.project = project;
        return settings;
    }

    @Nullable
    @Override
    public Settings getState() {
        return this;
    }

    @Override
    public void loadState(Settings state) {
        XmlSerializerUtil.copyBean(state, this);
    }

    public String getVersion() {
        return nodeInterpreter + jscsExecutable + jscsrcFile + preset + esnext + esprima;
    }
}