/*******************************************************************************
 * Copyright (c) 26.07.2011 Aaron Digulla.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *    Aaron Digulla - initial API and implementation and/or initial documentation
 *******************************************************************************/
package m4e

class ConvertCmd extends AbstractCommand {

    final static String DESCRIPTION = '''\
groupId:artifactId:version patches...
- Convert everything in the directory "downloads" into one big Maven repository
    
The first argument is used to create a POM file with a dependencyManagement element.'''
    
    void doRun( String... args ) {
        File downloads = new File( 'downloads' ).absoluteFile
        if( !downloads.exists() ) {
            throw new UserError( "Missing directory ${downloads}. Please create it and copy all files into it that you want to convert." )
        }
        
        if( args.size() < 2 ) {
            throw new UserError( "Expected at least one argument: The groupId:artifactId:version of a POM in which to write the dependencyManagement element" )
        }
        
        targetRepo = new File( workDir, 'm2repo' )
        
        log.info( "Converting everything in ${downloads} into ${targetRepo}" )
        
        checkDependencyManagementInfo( args[1] )
        
        List<String> patches = args[2..<args.size()] as List
        
        importArchives( downloads )
        
        mergeRepos()
        
        applyPatches( patches )
        
        analyze()
        
        createDependencyManagement()
        
        log.info( "The converted Maven repository can be found here: ${targetRepo}" )
    }
    
    String dmInfo
    
    void checkDependencyManagementInfo( String info ) {
        String[] parts = info.split( ':' )
        if( parts.size() != 3 ) {
            throw new UserError( "Expected argument format 'groupId:artifactId:version' but was '${info}'" )
        }
        
        dmInfo = info
    }
    
    File targetRepo
    List<File> m2repos = []
    
    void importArchives( File file ) {
        if( file.isDirectory() ) {
            file.eachFile { importArchives( it ) }
        } else {
            def cmd = new InstallCmd( workDir: workDir )
            cmd.run( 'import', file.absolutePath )
            
            mergeCounters( cmd )
            
            m2repos.addAll( cmd.m2repos )
        }
    }
    
    void mergeRepos() {
        if( !targetRepo.deleteDir() ) {
            throw new RuntimeException( "Error deleting ${targetRepo}" )
        }
        
        def cmd = new MergeCmd( workDir: workDir )
        
        List<String> args = []
        args << 'merge'
        
        for( File file : m2repos ) {
            args << file.absolutePath
        }
        
        args << targetRepo.absolutePath
        
        cmd.run( args )
        mergeCounters( cmd )
    }
    
    void applyPatches( List<String> patches ) {
        List args = [ 'ap', targetRepo.absolutePath ]
        args.addAll( patches )
        
        def cmd = new PatchCmd( workDir: workDir )
        cmd.run( args as String[] )
        mergeCounters( cmd )
    }
    
    void analyze() {
        def cmd = new AnalyzeCmd( workDir: workDir )
        cmd.run( 'an', targetRepo.absolutePath )
        mergeCounters( cmd )
    }
    
    void createDependencyManagement() {
        def cmd = new DependencyManagementCmd( workDir: workDir )
        cmd.run( 'dm',  targetRepo.absolutePath, dmInfo )
        mergeCounters( cmd )
    }
}
