// Copyright (C) 2017 Google Inc
//
// 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.supermanifest;

import java.util.Arrays;
import java.util.Comparator;
import javax.xml.bind.annotation.XmlAttribute;
import javax.xml.bind.annotation.XmlElement;
import org.apache.commons.lang.StringUtils;

class JiriProjects {
  @XmlElement(name = "project")
  private Project[] projects;

  public JiriProjects() {
    projects = new Project[0];
  }

  /** @return the projects */
  public Project[] getProjects() {
    return projects;
  }

  public void sortByPath() {
    Arrays.sort(projects, new SortbyPath());
  }

  public String toSubmodules() {
    StringBuffer buf = new StringBuffer();
    sortByPath();
    for (Project p : projects) {
      buf.append(p.toSubmodules());
      buf.append("\n");
    }
    return buf.toString();
  }

  public JiriProjects(Project[] projects) {
    this.projects = projects;
  }

  @Override
  public String toString() {
    StringBuffer buf = new StringBuffer();
    if (projects.length > 0) {
      buf.append("projects:\n");
      for (Project p : projects) {
        buf.append(StringUtil.addTab(p.toString()));
      }
    }
    return buf.toString();
  }

  static class Project {
    @XmlAttribute(required = true)
    private String name;

    @XmlAttribute(required = true)
    private String path;

    @XmlAttribute(required = true)
    private String remote;

    @XmlAttribute private String remotebranch;

    @XmlAttribute private String revision;

    @XmlAttribute private int historydepth;

    /** @return the name */
    public String getName() {
      return name;
    }

    /** @return the path */
    public String getPath() {
      return path;
    }

    /** @return the remote */
    public String getRemote() {
      return remote;
    }

    /** @return the historydepth */
    public int getHistorydepth() {
      return historydepth;
    }

    public String getRef() {
      if (!revision.isEmpty()) {
        return revision;
      }
      return remotebranch;
    }

    public Project() {
      name = "";
      path = "";
      remote = "";
      remotebranch = "";
      revision = "";
      historydepth = 0;
    }

    public void fillDefault() {
      if (remotebranch.isEmpty()) {
        remotebranch = "master";
      }
    }

    @Override
    public String toString() {
      return String.format(
          "project:\n\tname: %s\n\tpath: %s\n\tremote: %s\n\tremotebranch: %s\n\trevision: %s",
          name, path, remote, remotebranch, revision);
    }

    @Override
    public boolean equals(Object obj) {
      Project p = (Project) obj;

      if (!name.equals(p.name)) {
        return false;
      }
      if (!path.equals(p.path)) {
        return false;
      }
      if (!remote.equals(p.remote)) {
        return false;
      }
      if (!remotebranch.equals(p.remotebranch)) {
        return false;
      }
      if (!revision.equals(p.revision)) {
        return false;
      }

      return true;
    }

    public String toSubmodules() {
      StringBuffer buf = new StringBuffer(String.format("[submodule \"%s\"]", name));
      buf.append("\n\tpath = " + path);
      buf.append("\n\turl = " + remote);
      String branch = "";
      if (!remotebranch.isEmpty()) {
        branch = remotebranch;
      }

      if (!revision.isEmpty()) {
        branch = revision;
      }

      if (!branch.isEmpty()) {
        buf.append("\n\tbranch = " + branch);
      }

      buf.append("\n");
      return buf.toString();
    }

    public String Key() {
      return name + "=" + StringUtils.strip(remote, "/");
    }

    /** @param revision the revision to set */
    public void setRevision(String revision) {
      this.revision = revision;
    }
  }

  static class SortbyPath implements Comparator<Project> {
    @Override
    public int compare(Project a, Project b) {
      String p1 = StringUtil.stripAndAddCharsAtEnd(a.getPath(), "/");
      String p2 = StringUtil.stripAndAddCharsAtEnd(b.getPath(), "/");
      return p1.compareTo(p2);
    }
  }
}
