/*******************************************************************************
 * 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 ),
        new CmdInfo( names: ['updateImportExportDB', 'upiedb'], impl: UpdateImportExportDatabaseCmd ),
    ]
    
    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()
    }
}