package org.apache.maven.settings;

/*
 * 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.
 */

import java.io.File;
import java.io.IOException;
import java.io.Reader;

import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
import org.apache.maven.model.Profile;
import org.apache.maven.project.DefaultProjectBuilder;
import org.apache.maven.project.DefaultProjectBuildingRequest;
import org.apache.maven.project.ProjectBuildingRequest;
import org.apache.maven.project.harness.PomTestWrapper;
import org.apache.maven.repository.RepositorySystem;
import org.apache.maven.repository.internal.MavenRepositorySystemUtils;
import org.apache.maven.settings.io.xpp3.SettingsXpp3Reader;
import org.apache.maven.test.PlexusTestCase;
import org.codehaus.plexus.util.ReaderFactory;
import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
import org.eclipse.aether.DefaultRepositorySystemSession;
import org.eclipse.aether.internal.impl.SimpleLocalRepositoryManagerFactory;
import org.eclipse.aether.repository.LocalRepository;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;

import javax.inject.Inject;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class PomConstructionWithSettingsTest
    extends PlexusTestCase
{
    private static final String BASE_DIR = "src/test";

    private static final String BASE_POM_DIR = BASE_DIR + "/resources-settings";

    @Inject
    private DefaultProjectBuilder projectBuilder;

    @Inject
    private RepositorySystem repositorySystem;

    private File testDirectory;

    @BeforeEach
    public void setUp()
        throws Exception
    {
        super.setUp();
        testDirectory = new File( getBasedir(), BASE_POM_DIR );
    }

    @Test
    public void testSettingsNoPom()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "settings-no-pom" );
        assertEquals( "local-profile-prop-value", pom.getValue( "properties/local-profile-prop" ) );
    }

    /**
     * MNG-4107
     */
    @Test
    public void testPomAndSettingsInterpolation()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "test-pom-and-settings-interpolation" );
        assertEquals( "applied", pom.getValue( "properties/settingsProfile" ) );
        assertEquals( "applied", pom.getValue( "properties/pomProfile" ) );
        assertEquals( "settings", pom.getValue( "properties/pomVsSettings" ) );
        assertEquals( "settings", pom.getValue( "properties/pomVsSettingsInterpolated" ) );
    }

    /**
     * MNG-4107
     */
    @Test
    public void testRepositories()
        throws Exception
    {
        PomTestWrapper pom = buildPom( "repositories" );
        assertEquals( "maven-core-it-0", pom.getValue( "repositories[1]/id" ) );
    }

    private PomTestWrapper buildPom( String pomPath )
        throws Exception
    {
        File pomFile = new File( testDirectory + File.separator + pomPath, "pom.xml" );
        File settingsFile = new File( testDirectory + File.separator + pomPath, "settings.xml" );
        Settings settings = readSettingsFile( settingsFile );

        ProjectBuildingRequest config = new DefaultProjectBuildingRequest();

        for ( org.apache.maven.settings.Profile rawProfile : settings.getProfiles() )
        {
            Profile profile = SettingsUtils.convertFromSettingsProfile( rawProfile );
            config.addProfile( profile );
        }

        String localRepoUrl =
            System.getProperty( "maven.repo.local", System.getProperty( "user.home" ) + "/.m2/repository" );
        localRepoUrl = "file://" + localRepoUrl;
        config.setLocalRepository(
            repositorySystem.createArtifactRepository( "local", localRepoUrl, new DefaultRepositoryLayout(), null,
                                                       null ) );
        config.setActiveProfileIds( settings.getActiveProfiles() );

        DefaultRepositorySystemSession repoSession = MavenRepositorySystemUtils.newSession();
        LocalRepository localRepo = new LocalRepository( config.getLocalRepository().getBasedir() );
        repoSession.setLocalRepositoryManager(
            new SimpleLocalRepositoryManagerFactory().newInstance( repoSession, localRepo ) );
        config.setRepositorySession( repoSession );

        return new PomTestWrapper( pomFile, projectBuilder.build( pomFile, config ).getProject() );
    }

    private static Settings readSettingsFile( File settingsFile )
        throws IOException, XmlPullParserException
    {
        Settings settings = null;

        try ( Reader reader = ReaderFactory.newXmlReader( settingsFile ) )
        {
            SettingsXpp3Reader modelReader = new SettingsXpp3Reader();

            settings = modelReader.read( reader );
        }
        return settings;
    }
}
