/*******************************************************************************
 * Copyright (c) 25.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

import java.util.zip.ZipInputStream;
import org.codehaus.groovy.runtime.ProcessGroovyMethods;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;

class Tool {
    
    static final Logger log = LoggerFactory.getLogger( Tool )
    
    static String VERSION = "0.13 (27.04.2012)"
    
    File workDir = new File( "tmp" ).absoluteFile
    
    List<CmdInfo> commands = [
        new CmdInfo( names: ['convert'], impl: ConvertCmd ),
        new CmdInfo( names: ['install', 'in'], impl: InstallCmd ),
        new CmdInfo( names: ['merge', 'me'], impl: MergeCmd ),
        new CmdInfo( names: ['attach-sources', 'as', 'attach', 'sources'], impl: AttachSourcesCmd ),
        new CmdInfo( names: ['apply-patches', 'patch', 'ap'], impl: PatchCmd ),
        new CmdInfo( names: ['analyze', 'an'], impl: AnalyzeCmd ),
        new CmdInfo( names: ['dependency-management', 'dm'], impl: DependencyManagementCmd ),
        new CmdInfo( names: ['clean'], impl: CleanCmd ),
        new CmdInfo( names: ['p2list', 'p2ls'], impl: P2ListCmd ),
        new CmdInfo( names: ['show', 'view'], impl: ShowRepoCmd ),
        new CmdInfo( names: ['download', 'dl'], impl: DownloadCmd ),
    ]
    
    void run( String... args ) {
        log.info( "mt4e ${VERSION}" )
        log.debug( "workDir={}", workDir )
        log.debug( "args[${args.size()}]: {}", Arrays.toString( args ) )
        
        if( args.size() == 0 ) {
            throw new UserError( "Missing command. Valid commands are:\n${help()}" )
        }
        
        if( args[0] in ['help', '--help', '-h', '?', '/?', '-help', '-?']) {
            print( help() )
            return
        }
        
        AbstractCommand cmd
        
        outer: for( def ci in commands ) {
            for( name in ci.names ) {
                if( name == args[0] ) {
                    cmd = ci.impl.newInstance()
                    break outer
                }
            }
        }
        
        if( cmd == null ) {
            throw new UserError( "Unknown command ${args[0]}\n${help()}" )
        }
        
        workDir.makedirs()
        
        cmd.workDir = workDir
        cmd.run( args )
        cmd.logSummary()
        
        log.debug( 'Done.' )
    }
    
    void print( String text ) {
        println text
    }
    
    String help() {
        def list = []
        for( def ci in commands ) {
            String name
            if( ci.names.size() == 1 ) {
                name = "${ci.names[0]}"
            } else {
                name = "[ ${ci.names.join( ' | ' )} ]"
            }
            
            String output = ConsoleUtils.wrapText( "${name} ${ci.impl.DESCRIPTION}" )
            list << output
        }
        return list.join( '\n' )
    }
    
    static void main( String[] args ) {
        try {
            MopSetup.setup();
            new Tool().run( args )
        } catch( UserError t ) {
            t.print()
            System.exit( 1 )
        } catch( Throwable t ) {
            t.printStackTrace()
            System.exit( 1 )
        }
    }
}

class CmdInfo {
    List<String> names
    Class impl
}

class CleanCmd extends AbstractCommand {
    
    final static String DESCRIPTION = '\n- Clean the work directory'
    
    void run( String... args ) {
        assert workDir != null
        
        log.info( 'Deleting {} and everything below', workDir )
        workDir.deleteDir()
    }
}