package org.apache.maven.continuum;

import java.io.File;

import org.apache.maven.continuum.builddefinition.BuildDefinitionService;
import org.apache.maven.continuum.model.project.BuildDefinition;
import org.apache.maven.continuum.model.project.BuildDefinitionTemplate;
import org.apache.maven.continuum.model.project.Project;
import org.apache.maven.continuum.model.project.ProjectGroup;
import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/*
 * 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.
 */
/**
 * @author olamy
 * @since 
 * @version $Id$
 */
public class AddMaven2ProjectTest
    extends AbstractContinuumTest
{
    protected Logger log = LoggerFactory.getLogger( getClass() );

    protected BuildDefinitionTemplate bdt;

    protected BuildDefinition bd;
    
    @Override
    protected void setUp()
        throws Exception
    {
        super.setUp();
        bd = new BuildDefinition();
        bd.setGoals( "clean deploy" );
        bd.setBuildFile( "pom.xml" );
        bd.setDescription( "my foo" );
        bd.setTemplate( true );
        BuildDefinitionService bds = (BuildDefinitionService) lookup( BuildDefinitionService.class.getName(), "default" );
        bd = bds.addBuildDefinition( bd );
        
        
        assertEquals( 5, bds.getAllBuildDefinitions().size() );

        bdt = new BuildDefinitionTemplate();
        bdt.setName( "bdt foo" );
        
        bdt = bds.addBuildDefinitionTemplate( bdt );
        
        bdt = bds.addBuildDefinitionInTemplate( bdt, bd, false );        
    }    
    
    
    
    public void testAddProjectToExistingGroupWithBuildDefTemplate()
        throws Exception
    {

        ProjectGroup pg = new ProjectGroup();
        pg.setName( "foo" );
        pg.setDescription( "foo pg" );
        getContinuum().addProjectGroup( pg );
        pg = getContinuum().getAllProjectGroups().get( 1 );
        assertEquals( 2, getContinuum().getAllProjectGroups().size() );
        pg = getContinuum().getProjectGroupWithBuildDetails( pg.getId() );
        // group created with the m2 default build def 
        assertEquals( 1, pg.getBuildDefinitions().size() );
        

        File rootPom = getTestFile( "src/test/resources/projects/continuum/continuum-core/pom.xml" );

        assertTrue( rootPom.exists() );
        //String url = getTestFile( "src/test-projects/project1/pom.xml" ).toURL().toExternalForm();
        ContinuumProjectBuildingResult result = getContinuum().addMavenTwoProject(
                                                                                   rootPom.toURI().toURL()
                                                                                       .toExternalForm(), pg.getId(),
                                                                                   true, false, false, bdt.getId() );
        assertNotNull( result );

        assertEquals( 1, result.getProjects().size() );

        Project project = result.getProjects().get( 0 );
        project = getContinuum().getProjectWithBuildDetails( project.getId() );
        assertNotNull( project );
        pg = getContinuum().getProjectGroupWithBuildDetails( pg.getId() );
        log.info( "project buildDef list size : " + project.getBuildDefinitions().size() );
        // project with the build def coming from template
        assertEquals( 1, project.getBuildDefinitions().size() );
        assertEquals( "clean deploy", ( (BuildDefinition) project.getBuildDefinitions().get( 0 ) ).getGoals() );
    }
    
    public void testAddProjectWithGroupCreationWithBuildDefTemplate()
        throws Exception
    {

        //bdt = bds.addBuildDefinitionInTemplate( bdt, bd, true );
        File rootPom = getTestFile( "src/test/resources/projects/continuum/continuum-core/pom.xml" );

        assertTrue( rootPom.exists() );

        ContinuumProjectBuildingResult result = getContinuum().addMavenTwoProject(
                                                                                   rootPom.toURI().toURL()
                                                                                       .toExternalForm(), -1, true,
                                                                                   false, true, bdt.getId() );
        assertNotNull( result );

        assertEquals( 1, result.getProjects().size() );
        Project project = result.getProjects().get( 0 );
        assertNotNull( project );
        project = getContinuum().getProjectWithBuildDetails( project.getId() );
        log.info( "project buildDef list size : " + project.getBuildDefinitions().size() );
        // build def only at the group level du to group creation 
        assertEquals( 0, project.getBuildDefinitions().size() );
        
        log.info( "all pg size " + getContinuum().getAllProjectGroups().size() );
        ProjectGroup pg = result.getProjectGroups().get( 0 );

        pg = getContinuum().getProjectGroupWithBuildDetails( pg.getId() );

        log.info( " pg groupId " + pg.getGroupId() );
        //@ group level the db from template must be used
        log.info( " pg builddefs size " + pg.getBuildDefinitions().size() );
        log.info( "pg bd goals " + ( (BuildDefinition) pg.getBuildDefinitions().get( 0 ) ).getGoals() );
        assertEquals( "clean deploy", ( (BuildDefinition) pg.getBuildDefinitions().get( 0 ) ).getGoals() );
        
    }    
    
    public void testAddProjectWithGroupCreationDefaultBuildDef()
        throws Exception
    {

        //bdt = bds.addBuildDefinitionInTemplate( bdt, bd, true );
        File rootPom = getTestFile( "src/test/resources/projects/continuum/continuum-core/pom.xml" );

        assertTrue( rootPom.exists() );

        ContinuumProjectBuildingResult result = getContinuum().addMavenTwoProject(
                                                                                   rootPom.toURI().toURL()
                                                                                       .toExternalForm(), -1, true,
                                                                                   false, true, -1 );
        assertNotNull( result );

        assertEquals( 1, result.getProjects().size() );

        Project project = result.getProjects().get( 0 );
        assertNotNull( project );
        
        assertNotNull( project );
        project = getContinuum().getProjectWithBuildDetails( project.getId() );
        log.info( "project buildDef list size : " + project.getBuildDefinitions().size() );
        // only build def at group level
        assertEquals( 0, project.getBuildDefinitions().size() );
        
        log.info( "all pg size " + getContinuum().getAllProjectGroups().size() );
        ProjectGroup pg = result.getProjectGroups().get( 0 );

        log.info( getContinuum().getAllProjectGroups().toString() );
        log.info( " pg id " + Integer.toString( pg.getId() ) );

        pg = getContinuum().getProjectGroupWithBuildDetails( pg.getId() );

        log.info( " pg groupId " + pg.getGroupId() );
        //@ group level the db from template must be used
        log.info( " mg builddefs size " + pg.getBuildDefinitions().size() );
        log.info( "pg bd goals " + ( (BuildDefinition) pg.getBuildDefinitions().get( 0 ) ).getGoals() );
        assertEquals( "clean install", ( (BuildDefinition) pg.getBuildDefinitions().get( 0 ) ).getGoals() );

    }       

    public void testAddProjectToExistingGroupDefaultBuildDef()
        throws Exception
    {

        ProjectGroup pg = new ProjectGroup();
        pg.setName( "foo" );
        pg.setDescription( "foo pg" );
        getContinuum().addProjectGroup( pg );
        pg = getContinuum().getAllProjectGroups().get( 1 );
        assertEquals( 2, getContinuum().getAllProjectGroups().size() );

        File rootPom = getTestFile( "src/test/resources/projects/continuum/continuum-core/pom.xml" );

        assertTrue( rootPom.exists() );
        //String url = getTestFile( "src/test-projects/project1/pom.xml" ).toURL().toExternalForm();
        ContinuumProjectBuildingResult result = getContinuum().addMavenTwoProject(
                                                                                   rootPom.toURI().toURL()
                                                                                       .toExternalForm(), pg.getId(),
                                                                                   true, false, false, -1 );
        assertNotNull( result );

        assertEquals( 1, result.getProjects().size() );

        Project project = result.getProjects().get( 0 );
        project = getContinuum().getProjectWithBuildDetails( project.getId() );
        assertNotNull( project );
        pg = getContinuum().getProjectGroupWithBuildDetails( pg.getId() );
        log.info( "project buildDef list size : " + project.getBuildDefinitions().size() );
        assertEquals( 0, project.getBuildDefinitions().size() );
        pg = result.getProjectGroups().get( 0 );

        pg = getContinuum().getProjectGroupWithBuildDetails( pg.getId() );
        
        assertEquals( "clean install", ( (BuildDefinition) pg.getBuildDefinitions().get( 0 ) ).getGoals() );
    }
    
    
    private Continuum getContinuum()
        throws Exception
    {
        return (Continuum) lookup( Continuum.ROLE );
    }

    @Override
    protected String getPlexusConfigLocation()
    {
        return "org/apache/maven/continuum/DefaultContinuumTest.xml";
    }

    @Override
    protected String getSpringConfigLocation()
    {
        return "applicationContextSlf4jPlexusLogger.xml";
    }    
    
    
}
