package org.apache.maven.continuum.web.action.admin;

/*
 * 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.
 */

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.apache.maven.continuum.installation.InstallationService;
import org.apache.maven.continuum.model.system.Installation;
import org.apache.maven.continuum.model.system.Profile;
import org.apache.maven.continuum.profile.AlreadyExistsProfileException;
import org.apache.maven.continuum.profile.ProfileException;
import org.apache.maven.continuum.profile.ProfileService;
import org.apache.maven.continuum.security.ContinuumRoleConstants;
import org.apache.maven.continuum.web.action.ContinuumActionSupport;
import org.codehaus.plexus.redback.rbac.Resource;
import org.codehaus.plexus.redback.xwork.interceptor.SecureAction;
import org.codehaus.plexus.redback.xwork.interceptor.SecureActionBundle;
import org.codehaus.plexus.redback.xwork.interceptor.SecureActionException;

import com.opensymphony.webwork.ServletActionContext;
import com.opensymphony.xwork.Preparable;

/**
 * @author <a href="mailto:olamy@codehaus.org">olamy</a>
 * @version $Id$
 * @plexus.component role="com.opensymphony.xwork.Action" role-hint="profileAdministration"
 * @since 7 juin 07
 */
public class ProfileAction
    extends ContinuumActionSupport
    implements Preparable, SecureAction

{
    /**
     * @plexus.requirement role-hint="default"
     */
    private ProfileService profileService;

    /**
     * @plexus.requirement role-hint="default"
     */
    private InstallationService installationService;

    private List<Profile> profiles;

    private Profile profile;

    private int installationId;

    private List<Installation> allInstallations;

    private List<Installation> profileInstallations;

    private String message;

    // -------------------------------------------------------
    //  Webwork Methods
    // -------------------------------------------------------

    public String input()
        throws Exception
    {
        this.allInstallations = installationService.getAllInstallations();
        return INPUT;
    }

    public String list()
        throws Exception
    {
        String errorMessage = ServletActionContext.getRequest().getParameter( "errorMessage" );

        if ( errorMessage != null )
        {
            addActionError( errorMessage );
        }
        
        this.profiles = profileService.getAllProfiles();
        return SUCCESS;
    }

    public String edit()
        throws Exception
    {
        if ( getLogger().isDebugEnabled() )
        {
            getLogger().debug( "edit profile with id " + profile.getId() );
        }
        this.profile = profileService.getProfile( profile.getId() );
        return SUCCESS;
    }

    public String save()
        throws Exception
    {
        try
        {
            Profile stored = profileService.getProfile( profile.getId() );

            if ( StringUtils.isEmpty( profile.getName() ) )
            {
                if ( stored != null )
                {
                    profile = stored;
                }

                this.addFieldError( "profile.name", getResourceBundle().getString( "profile.name.required" ) );
                return INPUT;
            }

            if ( stored == null )
            {
                this.profile = profileService.addProfile( profile );
                this.allInstallations = installationService.getAllInstallations();
                return "editProfile";
            }
            else
            {
                // olamy : the only thing to change here is the profile name
                // but in the UI maybe some installations has been we retrieve it
                // and only set the name related to CONTINUUM-1361
                String name = profile.getName();
                profile = profileService.getProfile( profile.getId() );
                // CONTINUUM-1746 we update the profile only if the name has changed 
                if ( !StringUtils.equals( name, profile.getName() ) )
                {
                    profile.setName( name );
                    profileService.updateProfile( profile );
                }
            }
        }
        catch ( AlreadyExistsProfileException e )
        {
            this.addActionError( getResourceBundle().getString( "profile.name.already.exists" ) );
            return INPUT;
        }
        this.profiles = profileService.getAllProfiles();
        return SUCCESS;
    }

    public String delete()
        throws Exception
    {   
        try
        {
            profileService.deleteProfile( profile.getId() );
            this.profiles = profileService.getAllProfiles();
            return SUCCESS;
        }
        catch ( ProfileException e )
        {
            message = "profile.remove.error";
            return ERROR;
        }
    }

    public String confirmDelete()
        throws ProfileException
    {
        this.profile = getContinuum().getProfileService().getProfile( profile.getId() );
        return SUCCESS;
    }
    
    public String addInstallation()
        throws Exception
    {
        Installation installation = installationService.getInstallation( this.getInstallationId() );
        if ( installation != null )
        {
            profileService.addInstallationInProfile( profile, installation );
            // read again
            this.profile = profileService.getProfile( profile.getId() );
        }
        return SUCCESS;
    }

    public String removeInstallation()
        throws Exception
    {

        Installation installation = installationService.getInstallation( this.getInstallationId() );
        profileService.removeInstallationFromProfile( profile, installation );
        this.profile = profileService.getProfile( profile.getId() );
        return SUCCESS;
    }

    // -----------------------------------------------------
    // security
    // -----------------------------------------------------    
    
    public SecureActionBundle getSecureActionBundle()
        throws SecureActionException
    {
        SecureActionBundle bundle = new SecureActionBundle();
        bundle.setRequiresAuthentication( true );
        bundle.addRequiredAuthorization( ContinuumRoleConstants.CONTINUUM_MANAGE_PROFILES, Resource.GLOBAL );

        return bundle;
    }    
    
    // -------------------------------------------------------
    // Webwork setter/getter
    // -------------------------------------------------------

    public List<Profile> getProfiles()
    {
        return profiles;
    }

    public void setProfiles( List<Profile> profiles )
    {
        this.profiles = profiles;
    }

    public Profile getProfile()
    {
        return profile;
    }

    public void setProfile( Profile profile )
    {
        this.profile = profile;
    }

    public List<Installation> getAllInstallations()
        throws Exception
    {
        if ( this.allInstallations == null )
        {
            this.allInstallations = installationService.getAllInstallations();
        }
        // CONTINUUM-1742 (olamy) don't display already attached en var
        if (this.profile != null)
        {
            this.allInstallations.removeAll( this.profile.getEnvironmentVariables() );
        }
        return allInstallations;
    }

    public void setAllInstallations( List<Installation> allInstallations )
    {
        this.allInstallations = allInstallations;
    }

    public List<Installation> getProfileInstallations()
    {
        if ( this.profile != null )
        {
            if ( this.profileInstallations == null )
            {
                this.profileInstallations = new ArrayList<Installation>();
                if ( this.profile.getJdk() != null )
                {
                    this.profileInstallations.add( this.profile.getJdk() );
                }
                if ( this.profile.getBuilder() != null )
                {
                    this.profileInstallations.add( this.profile.getBuilder() );
                }
                if ( this.profile.getEnvironmentVariables() != null &&
                    !this.profile.getEnvironmentVariables().isEmpty() )
                {
                    this.profileInstallations.addAll( this.profile.getEnvironmentVariables() );
                }
            }
            return profileInstallations;
        }
        return Collections.EMPTY_LIST;
    }

    public void setProfileInstallations( List<Installation> profileInstallations )
    {
        this.profileInstallations = profileInstallations;
    }

    public int getInstallationId()
    {
        return installationId;
    }

    public void setInstallationId( int installationId )
    {
        this.installationId = installationId;
    }

    public String getMessage()
    {
        return message;
    }

    public void setMessage( String message )
    {
        this.message = message;
    }
}
