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

import java.io.File;
import java.util.regex.Pattern;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import m4e.Dependency;
import m4e.MavenRepositoryTools;
import m4e.Pom;

/** Strip Eclipse qualifiers from versions.
 * 
 *  <p>This patcher supports versions like "1", "1.0", "[1.0,2.0)" and standard
 *  Eclipse versions (three numbers plus optional qualifier)
 */
class StripQualifiers extends Patch {
    
    static final Logger log = LoggerFactory.getLogger( StripQualifiers )
    
    // ~/.../ isn't supported by the Eclipse Groovy editor
    Pattern versionRangePattern = Pattern.compile( '^([\\[\\]()])([^,]*),([^,]*?)([\\[\\]()])$' );
    
    GlobalPatches globalPatches
    File target
    
    void apply( Pom pom ) {
        
        updateVersion( pom )
        
        pom.dependencies.each {
            String version = it.value( Dependency.VERSION )
            
            QualifierPatch p = findQualifierPatch( it.key() )
            String newVersion
            if( p ) {
                newVersion = p.version
            } else {
                newVersion = stripQualifier( version )
            }
            
            if( version != newVersion ) {
                log.debug( 'Setting version of dependency {} to {}', it.shortKey(), newVersion )
                it.value( Dependency.VERSION, newVersion )
            }
        }
    }
    
    QualifierPatch findQualifierPatch( String key ) {
        for( QualifierPatch p : globalPatches.qualifierPatches ) {
            if( p.appliesTo( key ) ) {
                return p
            }
        }
        
        return null
    }
    
    void updateVersion( Pom pom ) {
        
        String key = pom.key()
        QualifierPatch p = findQualifierPatch( key )
        if( p ) {
            updateVersion( pom, p.version )
            return
        }
        
        String oldVersion = pom.version()
        String newVersion = stripQualifier( oldVersion )
        
        if( oldVersion != newVersion ) {
            updateVersion( pom, newVersion )
        }
    }
    
    void updateVersion( Pom pom, String newVersion ) {
        def e = pom.xml( Pom.VERSION )
        if( ! e ) {
            throw new RuntimeException( 'TODO Missing version element' )
        }
        
        String oldVersion = e.text
        e.text = newVersion
        
        log.debug( 'Setting POM version to {}', newVersion )
    }
    
    String stripQualifier( String version ) {
        if( !version ) {
            return version
        }
        
        def m = versionRangePattern.matcher( version )
        if( !m.matches() ) {
            return stripQualifier2( version )
        }
        
        def prefix = m.group(1)
        def v1 = m.group(2)
        def v2 = m.group(3)
        def postfix = m.group(4)
        
        v1 = stripQualifier2(v1)
        v2 = stripQualifier2(v2)
        
        return "${prefix}${v1},${v2}${postfix}"
    }
    
    String stripQualifier2( String version ) {
        def parts = version.split('\\.', -1)
        if( parts.size() == 3 ) {
            def m = parts[2] =~ '^\\d+'
            parts[2] = m[0]
        }
        int end = Math.min( parts.size()-1, 2 )
        return parts[0..end].join( '.' )
    }
    
    @Override
    public String toString() {
        return 'StripQualifiers()';
    }
}
