/*
 * Copyright 2000-2014 JetBrains s.r.o.
 *
 * 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.jps.gradle.model.impl;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonParseException;
import com.google.gson.JsonSyntaxException;
import com.google.gson.reflect.TypeToken;
import com.intellij.util.xmlb.annotations.Tag;
import org.jetbrains.annotations.NotNull;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * @author Vladislav.Soroka
 * @since 7/22/2014
 */
@Tag("filter")
public class ResourceRootFilter {
  @Tag("filterType")
  @NotNull
  public String filterType;
  @Tag("properties")
  @NotNull
  public String properties;

  private transient Map<Object, Object> propertiesMap;

  public int computeConfigurationHash() {
    int result = filterType.hashCode();
    result = 31 * result + properties.hashCode();
    return result;
  }

  @NotNull
  public Map<Object, Object> getProperties() {
    if (propertiesMap == null) {
      try {
        Gson gson = new GsonBuilder().create();
        propertiesMap = gson.fromJson(
          properties,
          new TypeToken<Map<Object, Object>>() {
          }.getType());

        if("RenamingCopyFilter".equals(filterType)) {
          final Object pattern = propertiesMap.get("pattern");
          final Matcher matcher = Pattern.compile(pattern instanceof String ? (String)pattern : "").matcher("");
          propertiesMap.put("matcher", matcher);
        }
      }
      catch (JsonSyntaxException e) {
        throw new RuntimeException("Unsupported filter: " + properties , e);
      } catch (JsonParseException e) {
        throw new RuntimeException("Unsupported filter: " + properties , e);
      }
    }
    return propertiesMap;
  }
}
