/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ~ Licensed to the Apache Software Foundation (ASF) under one
 ~ or more contributor license agreements.  See the NOTICE file
 ~ distributed with this work for additional information
 ~ regarding copyright ownership.  The ASF licenses this file
 ~ to you 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.apache.sling.cli.impl.nexus;

import java.net.URI;
import java.util.Objects;

/**
 * An {@code Artifact} describes a Maven artifact stored in a Maven repository (remote or local).
 */
public class Artifact {

    private final StagingRepository repository;
    private final String groupId;
    private final String artifactId;
    private final String version;
    private final String classifier;
    private final String type;
    private final URI uri;
    private final String repositoryRelativePath;
    private final String repositoryRelativeSignaturePath;
    private final String repositoryRelativeSha1SumPath;
    private final String repositoryRelativeMd5SumPath;

    public Artifact(StagingRepository repository, String groupId, String artifactId, String version, String classifier, String type) {
        this.repository = repository;
        this.groupId = groupId;
        this.artifactId = artifactId;
        this.version = version;
        this.classifier = classifier;
        this.type = type;
        String base = groupId.replaceAll("\\.", "/") + "/" + artifactId + "/" + version + "/" + artifactId + "-" + version;
        StringBuilder stringBuilder = new StringBuilder(base);
        if (this.classifier != null) {
            stringBuilder.append("-").append(this.classifier);
        }
        stringBuilder.append(".").append(this.type);
        repositoryRelativePath = stringBuilder.toString();
        uri = URI.create(repository.getRepositoryURI() + "/" + repositoryRelativePath);
        repositoryRelativeSignaturePath = repositoryRelativePath + ".asc";
        repositoryRelativeSha1SumPath = repositoryRelativePath + ".sha1";
        repositoryRelativeMd5SumPath = repositoryRelativePath + ".md5";
    }

    public StagingRepository getRepository() {
        return repository;
    }

    public URI getUri() {
        return uri;
    }

    public String getRepositoryRelativePath() {
        return repositoryRelativePath;
    }

    public String getRepositoryRelativeSignaturePath() {
        return repositoryRelativeSignaturePath;
    }

    public String getRepositoryRelativeSha1SumPath() {
        return repositoryRelativeSha1SumPath;
    }

    public String getRepositoryRelativeMd5SumPath() {
        return repositoryRelativeMd5SumPath;
    }

    public String getGroupId() {
        return groupId;
    }

    public String getArtifactId() {
        return artifactId;
    }

    public String getVersion() {
        return version;
    }

    public String getClassifier() {
        return classifier;
    }

    public String getType() {
        return type;
    }

    @Override
    public int hashCode() {
        return repositoryRelativePath.hashCode();
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj instanceof Artifact) {
            Artifact other = (Artifact) obj;
            return Objects.equals(repositoryRelativePath, other.repositoryRelativePath);
        }
        return false;
    }

    @Override
    public String toString() {
        return String.format("Artifact {groupId=%s; artifactId=%s; version=%s; classifier=%s; type=%s}", groupId, artifactId, version,
                classifier, type);
    }
}
