// Copyright (C) 2020 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.google.gerrit.plugins.codeowners.restapi;

import com.google.gerrit.entities.BranchNameKey;
import com.google.gerrit.extensions.restapi.BadRequestException;
import com.google.gerrit.extensions.restapi.IdString;
import com.google.gerrit.extensions.restapi.ResourceNotFoundException;
import com.google.gerrit.extensions.restapi.RestResource;
import com.google.gerrit.server.change.RevisionResource;
import com.google.gerrit.server.project.BranchResource;
import java.nio.file.InvalidPathException;
import java.nio.file.Path;
import org.eclipse.jgit.lib.ObjectId;

/**
 * Abstract REST resource that represents a path in a REST collection under a branch or revision in
 * a change.
 *
 * <p>We have several REST collections under a branch or revision in a change that have paths as
 * members (see {@link CodeOwnerConfigsInBranchCollection}, {@link CodeOwnersInBranchCollection} and
 * {@link CodeOwnersInChangeCollection}). Due to the REST framework the resources in each REST
 * collection must be represented by an own class. To avoid code duplication for the path resources
 * in these different REST collection we have this abstract REST resource for a path that can be
 * extended for each of these REST collections.
 */
abstract class AbstractPathResource implements RestResource {
  protected static Path parsePath(IdString id) throws BadRequestException {
    Path path;
    try {
      path = Path.of(id.get());
    } catch (InvalidPathException e) {
      throw new BadRequestException("invalid path: " + e.getReason());
    }

    if (!path.isAbsolute()) {
      // we assume that all paths are absolute, add the missing leading '/'
      path = Path.of("/").resolve(path);
    }
    return path;
  }

  private final BranchNameKey branchNameKey;
  private final ObjectId revision;
  private final Path path;

  protected AbstractPathResource(BranchResource branchResource, Path path)
      throws ResourceNotFoundException {
    if (branchResource.getRevision().isEmpty()) {
      throw new ResourceNotFoundException(IdString.fromDecoded(branchResource.getName()));
    }

    this.branchNameKey = branchResource.getBranchKey();
    this.revision = ObjectId.fromString(branchResource.getRevision().get());
    this.path = path;
  }

  protected AbstractPathResource(BranchNameKey branchNameKey, String revision, Path path) {
    this.branchNameKey = branchNameKey;
    this.revision = ObjectId.fromString(revision);
    this.path = path;
  }

  protected AbstractPathResource(
      RevisionResource revisionResource, ObjectId branchRevision, Path path) {
    this.branchNameKey = revisionResource.getChange().getDest();
    this.revision = branchRevision;
    this.path = path;
  }

  /**
   * Returns the branch of this path resource.
   *
   * @return the branch of this path resource
   */
  public BranchNameKey getBranch() {
    return branchNameKey;
  }

  /**
   * Returns the revision of the branch.
   *
   * @return the revision of the branch
   */
  public ObjectId getRevision() {
    return revision;
  }

  /**
   * Returns the path of this path resource.
   *
   * <p>The path may or may not exist in the branch.
   *
   * @return the path of this path resource
   */
  public Path getPath() {
    return path;
  }
}
