/*
 * Copyright 2001-2013 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.jetbrains.generate.tostring.config;

/**
 * The configuration is stored standard xmlb.XmlSerializer that automatically stores the
 * state of this classes public fields.
 */
public class Config {

    public boolean useFullyQualifiedName = false;
    public InsertWhere insertNewMethodOption = InsertWhere.AT_CARET;
    public DuplicationPolicy whenDuplicatesOption = DuplicationPolicy.ASK;
    public boolean filterConstantField = true;
    public boolean filterEnumField = false;
    public boolean filterTransientModifier = false;
    public boolean filterStaticModifier = true;
    public String filterFieldName = null;
    public String filterMethodName = null;
    public String filterMethodType = null;
    public String filterFieldType = null;
    public boolean filterLoggers = true;
    public boolean addImplementSerializable = false;
    public boolean enableMethods = false;
    public boolean jumpToMethod = true; // jump cursor to toString method
    public int sortElements = 0; // 0 = none, 1 = asc, 2 = desc

    private FilterPattern myPattern = null;

    public boolean isUseFullyQualifiedName() {
        return useFullyQualifiedName;
    }

    public void setUseFullyQualifiedName(boolean useFullyQualifiedName) {
        this.useFullyQualifiedName = useFullyQualifiedName;
    }

    public DuplicationPolicy getReplaceDialogInitialOption() {
        return whenDuplicatesOption;
    }

    public void setReplaceDialogInitialOption(DuplicationPolicy option) {
        this.whenDuplicatesOption = option;
    }

    public InsertWhere getInsertNewMethodInitialOption() {
        return this.insertNewMethodOption;
    }

    public void setInsertNewMethodInitialOption(InsertWhere where) {
        this.insertNewMethodOption = where;
    }

    public boolean isFilterConstantField() {
        return filterConstantField;
    }

    public void setFilterConstantField(boolean filterConstantField) {
        this.filterConstantField = filterConstantField;
    }

    public boolean isFilterTransientModifier() {
        return filterTransientModifier;
    }

    public void setFilterTransientModifier(boolean filterTransientModifier) {
        this.filterTransientModifier = filterTransientModifier;
    }

    public boolean isFilterStaticModifier() {
        return filterStaticModifier;
    }

    public void setFilterStaticModifier(boolean filterStaticModifier) {
        this.filterStaticModifier = filterStaticModifier;
    }

    public String getFilterFieldName() {
        if (filterFieldName == null) {
            return "";
        }
        return filterFieldName;
    }

    public void setFilterFieldName(String filterFieldName) {
        this.filterFieldName = filterFieldName;
    }

    public boolean isEnableMethods() {
        return enableMethods;
    }

    public void setEnableMethods(boolean enableMethods) {
        this.enableMethods = enableMethods;
    }

    public String getFilterMethodName() {
        if (filterMethodName == null) {
            return "";
        }
        return filterMethodName;
    }

    public void setFilterMethodName(String filterMethodName) {
        this.filterMethodName = filterMethodName;
    }

    public boolean isJumpToMethod() {
        return jumpToMethod;
    }

    public void setJumpToMethod(boolean jumpToMethod) {
        this.jumpToMethod = jumpToMethod;
    }

    public boolean isFilterEnumField() {
        return filterEnumField;
    }

    public void setFilterEnumField(boolean filterEnumField) {
        this.filterEnumField = filterEnumField;
    }

    public int getSortElements() {
        return sortElements;
    }

    public void setSortElements(int sortElements) {
        this.sortElements = sortElements;
    }

    public String getFilterFieldType() {
        if (filterFieldType == null) {
            return "";
        }
        return filterFieldType;
    }

    public void setFilterFieldType(String filterFieldType) {
        this.filterFieldType = filterFieldType;
    }

    public boolean isFilterLoggers() {
        return filterLoggers;
    }

    public void setFilterLoggers(boolean filterLoggers) {
        this.filterLoggers = filterLoggers;
    }

    public String getFilterMethodType() {
        if (filterMethodType == null) {
            return "";
        }
        return filterMethodType;
    }

    public void setFilterMethodType(String filterMethodType) {
        this.filterMethodType = filterMethodType;
    }

    /**
     * Gets the filter pattern that this configuration represents.
     *
     * @return the filter pattern.
     */
    public FilterPattern getFilterPattern() {
        FilterPattern pattern = myPattern;
        if (pattern != null) {
            return pattern;
        }
        pattern = new FilterPattern();
        pattern.setConstantField(filterConstantField);
        pattern.setTransientModifier(filterTransientModifier);
        pattern.setStaticModifier(filterStaticModifier);
        pattern.setFieldName(filterFieldName);
        pattern.setFieldType(filterFieldType);
        pattern.setMethodName(filterMethodName);
        pattern.setMethodType(filterMethodType);
        pattern.setEnumField(filterEnumField);
        pattern.setLoggers(filterLoggers);
        return myPattern = pattern;
    }

    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        final Config config = (Config) o;

        if (addImplementSerializable != config.addImplementSerializable) return false;
        if (enableMethods != config.enableMethods) return false;
        if (filterConstantField != config.filterConstantField) return false;
        if (filterEnumField != config.filterEnumField) return false;
        if (filterStaticModifier != config.filterStaticModifier) return false;
        if (filterTransientModifier != config.filterTransientModifier) return false;
        if (jumpToMethod != config.jumpToMethod) return false;
        if (sortElements != config.sortElements) return false;
        if (useFullyQualifiedName != config.useFullyQualifiedName) return false;
        if (filterFieldName != null ? !filterFieldName.equals(config.filterFieldName) : config.filterFieldName != null)
            return false;
        if (filterFieldType != null ? !filterFieldType.equals(config.filterFieldType) : config.filterFieldType != null)
            return false;
        if (filterMethodName != null ? !filterMethodName.equals(config.filterMethodName) : config.filterMethodName != null)
            return false;
        if (filterMethodType != null ? !filterMethodType.equals(config.filterMethodType) : config.filterMethodType != null)
            return false;
        if (!whenDuplicatesOption.equals(config.whenDuplicatesOption)) return false;
        if (!insertNewMethodOption.equals(config.insertNewMethodOption)) return false;

        return true;
    }

    public int hashCode() {
        int result;
        result = (useFullyQualifiedName ? 1 : 0);
        result = 29 * result + whenDuplicatesOption.hashCode();
        result = 29 * result + insertNewMethodOption.hashCode();
        result = 29 * result + (filterConstantField ? 1 : 0);
        result = 29 * result + (filterEnumField ? 1 : 0);
        result = 29 * result + (filterTransientModifier ? 1 : 0);
        result = 29 * result + (filterStaticModifier ? 1 : 0);
        result = 29 * result + (filterFieldName != null ? filterFieldName.hashCode() : 0);
        result = 29 * result + (filterFieldType != null ? filterFieldType.hashCode() : 0);
        result = 29 * result + (filterMethodName != null ? filterMethodName.hashCode() : 0);
        result = 29 * result + (filterMethodType != null ? filterMethodType.hashCode() : 0);
        result = 29 * result + (addImplementSerializable ? 1 : 0);
        result = 29 * result + (enableMethods ? 1 : 0);
        result = 29 * result + (jumpToMethod ? 1 : 0);
        result = 29 * result + sortElements;
        return result;
    }

    public String toString() {
        return "Config{" +
                "useFullyQualifiedName=" + useFullyQualifiedName +
                ", replaceDialogOption=" + whenDuplicatesOption +
                ", insertNewMethodOption=" + insertNewMethodOption +
                ", filterConstantField=" + filterConstantField +
                ", filterEnumField=" + filterEnumField +
                ", filterTransientModifier=" + filterTransientModifier +
                ", filterStaticModifier=" + filterStaticModifier +
                ", filterFieldName='" + filterFieldName + "'" +
                ", filterFieldType='" + filterFieldType + "'" +
                ", filterMethodName='" + filterMethodName + "'" +
                ", filterMethodType='" + filterMethodType + "'" +
                ", addImplementSerializable=" + addImplementSerializable +
                ", enableMethods=" + enableMethods +
                ", jumpToMethod=" + jumpToMethod +
                ", sortElements=" + sortElements +
                "}";
    }

}