/**
 *  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.maven.mercury.plexus;

import java.io.File;
import java.io.InputStream;
import java.net.URL;
import java.util.Collection;
import java.util.List;
import java.util.Set;

import org.apache.maven.mercury.artifact.Artifact;
import org.apache.maven.mercury.artifact.ArtifactBasicMetadata;
import org.apache.maven.mercury.artifact.ArtifactExclusionList;
import org.apache.maven.mercury.artifact.ArtifactInclusionList;
import org.apache.maven.mercury.artifact.ArtifactMetadata;
import org.apache.maven.mercury.artifact.ArtifactQueryList;
import org.apache.maven.mercury.artifact.ArtifactScopeEnum;
import org.apache.maven.mercury.builder.api.DependencyProcessor;
import org.apache.maven.mercury.crypto.api.StreamObserverFactory;
import org.apache.maven.mercury.crypto.api.StreamVerifierException;
import org.apache.maven.mercury.crypto.api.StreamVerifierFactory;
import org.apache.maven.mercury.crypto.pgp.PgpStreamVerifierFactory;
import org.apache.maven.mercury.repository.api.Repository;
import org.apache.maven.mercury.repository.api.RepositoryException;
import org.apache.maven.mercury.repository.local.m2.LocalRepositoryM2;
import org.apache.maven.mercury.repository.remote.m2.RemoteRepositoryM2;

/**
 * @author Oleg Gusakov
 */
public interface PlexusMercury
{
    /**
     * lookup dependency processor in plexus and return the "default" implementation
     * 
     * @return the dependency processor
     * @throws RepositoryException
     */
    public DependencyProcessor findDependencyProcessor()
        throws RepositoryException;

    /**
     * lookup dependency processor in plexus and return the requested implementation
     * 
     * @param hint the plexus hint to lookup by
     * @return the dependency processor
     * @throws RepositoryException
     */
    public DependencyProcessor findDependencyProcessor( String hint )
        throws RepositoryException;

    /**
     * create PGP factory to configure into repository reader for signature verification
     * 
     * @param lenient
     * @param sufficient
     * @param pubRing - keyring with all acceptable public keys
     * @return pgp verifier factory to be sent to Repository
     * @throws PlexusMercuryException
     */
    public PgpStreamVerifierFactory createPgpReaderFactory( boolean lenient, boolean sufficient, InputStream pubRing )
        throws StreamVerifierException;

    /**
     * create PGP factory to configure into repository writer for signature generation
     * 
     * @param lenient
     * @param sufficient
     * @param secRing
     * @param keyId
     * @param keyPass
     * @return pgp verifier factory to be sent to Repository
     * @throws PlexusMercuryException
     */
    public PgpStreamVerifierFactory createPgpWriterFactory( boolean lenient, boolean sufficient, InputStream secRing,
                                                            String keyId, String keyPass )
        throws StreamVerifierException;

    /**
     * construct remote M2 repository and configure it with supplied attributes
     * 
     * @param id
     * @param serverUrl
     * @param serverUser
     * @param serverPass
     * @param proxyUrl
     * @param proxyUser
     * @param proxyPass
     * @param readerStreamObservers
     * @param readerStreamVerifiers
     * @param writerStreamObservers
     * @param writerStreamVerifiers
     * @return repository instance
     * @throws PlexusMercuryException
     */
    public RemoteRepositoryM2 constructRemoteRepositoryM2( String id, URL serverUrl, String serverUser,
                                                           String serverPass, URL proxyUrl, String proxyUser,
                                                           String proxyPass,
                                                           Set<StreamObserverFactory> readerStreamObservers,
                                                           Set<StreamVerifierFactory> readerStreamVerifiers,
                                                           Set<StreamObserverFactory> writerStreamObservers,
                                                           Set<StreamVerifierFactory> writerStreamVerifiers )
        throws RepositoryException;

    /**
     * construct local M2 repository and configure it with supplied attributes
     * 
     * @param id
     * @param rootDir
     * @param readerStreamObservers
     * @param readerStreamVerifiers
     * @param writerStreamObservers
     * @param writerStreamVerifiers
     * @return repository instance
     * @throws PlexusMercuryException
     */
    public LocalRepositoryM2 constructLocalRepositoryM2( String id, File rootDir,
                                                         Set<StreamObserverFactory> readerStreamObservers,
                                                         Set<StreamVerifierFactory> readerStreamVerifiers,
                                                         Set<StreamObserverFactory> writerStreamObservers,
                                                         Set<StreamVerifierFactory> writerStreamVerifiers )
        throws RepositoryException;

    /**
     * construct a list of repositories from strings. First string is local dir, all others - remote URLs
     * 
     * @param localDir
     * @param urls varargs list of urls for remote repos
     * @return repository list
     * @throws PlexusMercuryException
     */
    public List<Repository> constructRepositories( String localDir, String... urls )
        throws RepositoryException;

    /**
     * construct a list of repositories from strings and retains them for future use by this instance of PlexusMercury
     * 
     * @param localDir
     * @param urls varargs list of urls for remote repos
     * @return repository list
     * @throws PlexusMercuryException
     */
    public PlexusMercury setRepositories( String localDir, String... urls )
    throws RepositoryException;

    public PlexusMercury setRepositories( List<Repository> repos )
    throws RepositoryException;

    public PlexusMercury setRepositories( Repository... repos )
    throws RepositoryException;

    /**
     * write (deploy) given Artifact(s) to the repository
     * 
     * @param repo repository instance to search
     * @param artfifacts to write
     * @return
     * @throws PlexusMercuryException
     */
    public void write( Repository repo, Artifact... artifacts )
        throws RepositoryException;

    public void write( Repository repo, Collection<Artifact> artifacts )
        throws RepositoryException;

    /**
     * read given Artifact(s) from the repository
     * 
     * @param repo repository instance to search
     * @param artfifacts to read
     * @return
     * @throws PlexusMercuryException
     */
    public List<Artifact> read( List<Repository> repo, List<? extends ArtifactBasicMetadata> artifacts )
        throws RepositoryException;

    public List<Artifact> read( List<Repository> repo, ArtifactBasicMetadata... artifacts )
        throws RepositoryException;

    /** use previously set repositories */
    public List<Artifact> read( List<? extends ArtifactBasicMetadata> artifacts )
        throws RepositoryException;

    public List<Artifact> read( ArtifactBasicMetadata... artifacts )
        throws RepositoryException;

    /**
     * resolve Artifact dependencies. The inclusions and exclusions accept version ranges as parameters
     * 
     * @param repo repository instance to search
     * @param scope scope enumeration member indication the scope to resolve for
     * @param artfifacts list of artifact metadatas to resolve
     * @param inclusions list of artifact metadatas to include - only these will be in the resolved classpath
     * @param exclusions list of artifact metadatas to exclude - is applied after the inclusion, if one is present
     * @return
     * @throws PlexusMercuryException
     */
    public List<ArtifactMetadata> resolve( List<Repository> repos, ArtifactScopeEnum scope,
                                           ArtifactQueryList artifacts, ArtifactInclusionList inclusions,
                                           ArtifactExclusionList exclusions )
        throws RepositoryException;

    public List<ArtifactMetadata> resolve( List<Repository> repos, ArtifactScopeEnum scope, ArtifactMetadata metadata )
        throws RepositoryException;

    /** previously set repos now */
    public List<ArtifactMetadata> resolve( ArtifactScopeEnum scope, ArtifactQueryList artifacts,
                                           ArtifactInclusionList inclusions, ArtifactExclusionList exclusions )
        throws RepositoryException;

    public List<ArtifactMetadata> resolve( ArtifactScopeEnum scope, ArtifactMetadata metadata )
        throws RepositoryException;

    /**
     * get all available versions of for the artifact query.
     * 
     * @param repo repository instance to search
     * @param query metadata query to search by
     * @return list of found version metadatas
     * @throws PlexusMercuryException
     */
    public List<ArtifactBasicMetadata> readVersions( List<Repository> repos, ArtifactBasicMetadata query )
        throws RepositoryException;
    /** previously set repos now */
    public List<ArtifactBasicMetadata> readVersions( ArtifactBasicMetadata query )
    throws RepositoryException;
}
