//Copyright (C) 2013 The Android Open Source Project
//
//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 com.googlesource.gerrit.plugins.hooks.util;

import java.util.Set;

import com.google.common.collect.Sets;
import com.google.gerrit.server.data.AccountAttribute;
import com.google.gerrit.server.data.ChangeAttribute;
import com.google.gerrit.server.data.PatchSetAttribute;
import com.google.gerrit.server.data.RefUpdateAttribute;
import com.google.inject.Inject;

import com.googlesource.gerrit.plugins.hooks.workflow.Property;

/**
 * Extractor to translate the various {@code *Attribute}s to
 * {@link Property Properties}.
 */
public class PropertyAttributeExtractor {
  private Property.Factory propertyFactory;

  @Inject
  PropertyAttributeExtractor(Property.Factory propertyFactory) {
    this.propertyFactory = propertyFactory;
  }

  public Set<Property> extractFrom(AccountAttribute accountAttribute,
      String prefix) {
    Set<Property> properties = Sets.newHashSet();
    if (accountAttribute != null) {
      properties.add(propertyFactory.create(prefix + "-email",
          accountAttribute.email));
      properties.add(propertyFactory.create(prefix + "-username",
          accountAttribute.username));
      properties.add(propertyFactory.create(prefix + "-name",
          accountAttribute.name));
    }
    return properties;
  }

  public Set<Property> extractFrom(ChangeAttribute changeAttribute) {
    Set<Property> properties = Sets.newHashSet();
    properties.add(propertyFactory.create("project", changeAttribute.project));
    properties.add(propertyFactory.create("branch", changeAttribute.branch));
    properties.add(propertyFactory.create("topic", changeAttribute.topic));
    properties.add(propertyFactory.create("subject", changeAttribute.subject));
    properties.add(propertyFactory.create("change-id", changeAttribute.id));
    properties.add(propertyFactory.create("change-number", changeAttribute.number));
    properties.add(propertyFactory.create("change-url", changeAttribute.url));
    properties.addAll(extractFrom(changeAttribute.owner, "owner"));
    return properties;
  }

  public Set<Property>extractFrom(PatchSetAttribute patchSetAttribute) {
    Set<Property> properties = Sets.newHashSet();
    properties.add(propertyFactory.create("revision",
        patchSetAttribute.revision));
    properties.add(propertyFactory.create("patch-set-number",
        patchSetAttribute.number));
    properties.add(propertyFactory.create("ref", patchSetAttribute.ref));
    properties.add(propertyFactory.create("created-on",
        patchSetAttribute.createdOn.toString()));
    properties.add(propertyFactory.create("parents",
        patchSetAttribute.parents.toString()));
    properties.add(propertyFactory.create("deletions",
        Integer.toString(patchSetAttribute.sizeDeletions)));
    properties.add(propertyFactory.create("insertions",
        Integer.toString(patchSetAttribute.sizeInsertions)));
    properties.addAll(extractFrom(patchSetAttribute.uploader,
        "uploader"));
    properties.addAll(extractFrom(patchSetAttribute.author,
        "author"));
    return properties;
  }

  public Set<Property>extractFrom(RefUpdateAttribute refUpdateAttribute) {
    Set<Property> properties = Sets.newHashSet();
    properties.add(propertyFactory.create("revision",
        refUpdateAttribute.newRev));
    properties.add(propertyFactory.create("revision-old",
        refUpdateAttribute.oldRev));
    properties.add(propertyFactory.create("project",
        refUpdateAttribute.project));
    properties.add(propertyFactory.create("ref",
        refUpdateAttribute.refName));
    return properties;
  }
}
