/*
 * 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;

import com.intellij.openapi.diagnostic.Logger;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.psi.PsiField;
import com.intellij.psi.PsiMethod;
import com.intellij.psi.PsiModifier;
import com.intellij.psi.PsiType;
import gnu.trove.THashSet;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.generate.tostring.psi.PsiAdapter;

import java.util.Collections;
import java.util.Set;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * This is a filtering pattern, used to filter unwanted fields for this action.
 */
public class FilterPattern {

    private static final Logger LOG = Logger.getInstance("#org.jetbrains.generate.tostring.config.FilterPattern");
    private static final Set<String> loggerNames = new THashSet<String>();
    static {
      Collections.addAll(loggerNames,
                         "org.apache.log4j.Logger", "java.util.logging.Logger", "org.apache.commons.logging.Log", "org.slf4j.Logger");
    }

    private String fieldName;
    private String fieldType;
    private String methodName;
    private String methodType;
    private boolean constantField;
    private boolean staticModifier;
    private boolean transientModifier;
    private boolean enumField;
    private boolean loggers;
    private Pattern methodNamePattern = null;
    private Pattern methodTypePattern = null;
    private Pattern fieldNamePattern = null;
    private Pattern fieldTypePattern = null;

  public boolean fieldMatches(PsiField field) {
    if (isConstantField() && PsiAdapter.isConstantField(field)) {
      return true;
    }
    if (isEnumField() && PsiAdapter.isEnumField(field)) {
      return true;
    }
    if (isStaticModifier() && field.hasModifierProperty(PsiModifier.STATIC)) {
      return true;
    }
    if (isTransientModifier() && field.hasModifierProperty(PsiModifier.TRANSIENT)) {
      return true;
    }
    final Pattern fieldNamePattern = getFieldNamePattern();
    if ((fieldNamePattern != null) && fieldNamePattern.matcher(field.getName()).matches()) {
      return true;
    }
    final String typeText = field.getType().getCanonicalText();
    final Pattern fieldTypePattern = getFieldTypePattern();
    if ((fieldTypePattern != null) && fieldTypePattern.matcher(typeText).matches()) {
      return true;
    }
    if (isLoggers() && loggerNames.contains(typeText)) {
      return true;
    }
    return false;
  }

  public boolean methodMatches(@NotNull PsiMethod method) {
    final String methodName = method.getName();
    final Pattern methodNamePattern = getMethodNamePattern();
    if ((methodNamePattern != null) && methodNamePattern.matcher(methodName).matches()) {
      return true;
    }
    final PsiType returnType = method.getReturnType();
    if (returnType == null) {
      return false;
    }
    final Pattern patternTypePattern = getMethodTypePattern();
    final String methodType = returnType.getCanonicalText();
    return (patternTypePattern != null) && methodTypePattern.matcher(methodType).matches();
  }

    public Pattern getFieldNamePattern() {
      if (StringUtil.isEmpty(fieldName)) {
        return null;
      }
      if (fieldNamePattern == null) {
        try {
          fieldNamePattern = Pattern.compile(fieldName);
        } catch (PatternSyntaxException e) {
          fieldName = null;
          LOG.warn(e.getMessage());
        }
      }
      return fieldNamePattern;
    }

    /**
     * Sets a filtering using regular expression on the field name.
     *
     * @param regexp the regular expression.
     */
    public void setFieldName(String regexp) {
        this.fieldName = regexp;
    }

    public boolean isConstantField() {
        return constantField;
    }

    /**
     * Set this to true to filter by constant fields.
     *
     * @param constantField if true constant fields is unwanted.
     */
    public void setConstantField(boolean constantField) {
        this.constantField = constantField;
    }

    public boolean isTransientModifier() {
        return transientModifier;
    }

    /**
     * Set this to true to filter by transient modifier.
     *
     * @param transientModifier if true fields with transient modifier is unwanted.
     */
    public void setTransientModifier(boolean transientModifier) {
        this.transientModifier = transientModifier;
    }

    public boolean isStaticModifier() {
        return staticModifier;
    }

    /**
     * Set this to true to filter by static modifier.
     *
     * @param staticModifier if true fields with static modifier is unwanted.
     */
    public void setStaticModifier(boolean staticModifier) {
        this.staticModifier = staticModifier;
    }

    public Pattern getMethodNamePattern() {
      if (StringUtil.isEmpty(methodName)) {
        return null;
      }
      if (methodNamePattern == null) {
        try {
          methodNamePattern = Pattern.compile(methodName);
        } catch (PatternSyntaxException e) {
          methodName = null;
          LOG.warn(e.getMessage());
        }
      }
      return methodNamePattern;
    }

    /**
     * Sets a filtering using regular expression on the method name.
     *
     * @param regexp the regular expression.
     */
    public void setMethodName(String regexp) {
        this.methodName = regexp;
    }

    public boolean isEnumField() {
        return enumField;
    }

    /**
     * Set this to true to filter by enum fields (JDK1.5).
     *
     * @param enumField if true enum fields is unwanted.
     * @since 3.17
     */
    public void setEnumField(boolean enumField) {
        this.enumField = enumField;
    }

    public boolean isLoggers() {
        return loggers;
    }

    /**
     * Set this to true to filter loggers (Log4j, JDK1.4).
     *
     * @param loggers if true logger fields is unwanted.
     * @since 3.20
     */
    public void setLoggers(boolean loggers) {
        this.loggers = loggers;
    }

    public Pattern getFieldTypePattern() {
      if (StringUtil.isEmpty(fieldType)) {
        return null;
      }
      if (fieldTypePattern ==  null) {
        try {
          fieldTypePattern = Pattern.compile(fieldType);
        } catch (PatternSyntaxException e) {
          fieldType = null;
          LOG.warn(e.getMessage());
        }
      }
      return fieldTypePattern;
    }

    /**
     * Sets a filtering using the field type FQN.
     *
     * @param fieldType  the field type
     * @since 3.20
     */
    public void setFieldType(String fieldType) {
        this.fieldType = fieldType;
    }

    public Pattern getMethodTypePattern() {
      if (StringUtil.isEmpty(methodType)) {
        return null;
      }
      if (methodTypePattern == null) {
        try {
          methodTypePattern = Pattern.compile(methodType);
        } catch (PatternSyntaxException e) {
          methodType = null;
          LOG.warn(e.getMessage());
        }
      }
      return methodTypePattern;
    }

    /**
     * Sets a filtering using the method return type FQN.
     *
     * @param methodType  the method return type
     * @since 3.20
     */
    public void setMethodType(String methodType) {
        this.methodType = methodType;
    }

    public String toString() {
        return "FilterPattern{" +
                "fieldName='" + fieldName + "'" +
                "fieldType='" + fieldType + "'" +
                ", methodName='" + methodName + "'" +
                ", methodType='" + methodType + "'" +
                ", constantField=" + constantField +
                ", staticModifier=" + staticModifier +
                ", transientModifier=" + transientModifier +
                ", enumField=" + enumField +
                ", loggers=" + loggers +
                "}";
    }
}
