package org.apache.archiva.web.rss;

/*
 * 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 org.apache.archiva.redback.authentication.AuthenticationDataSource;
import org.apache.archiva.redback.authentication.AuthenticationException;
import org.apache.archiva.redback.authentication.AuthenticationResult;
import org.apache.archiva.redback.authorization.AuthorizationException;
import org.apache.archiva.redback.authorization.AuthorizationResult;
import org.apache.archiva.redback.keys.KeyManager;
import org.apache.archiva.redback.policy.AccountLockedException;
import org.apache.archiva.redback.policy.UserSecurityPolicy;
import org.apache.archiva.redback.system.DefaultSecuritySession;
import org.apache.archiva.redback.system.SecuritySession;
import org.apache.archiva.redback.system.SecuritySystem;
import org.apache.archiva.redback.users.User;
import org.apache.archiva.redback.users.UserManager;
import org.apache.archiva.redback.users.UserManagerException;
import org.apache.archiva.redback.users.UserManagerListener;
import org.apache.archiva.redback.users.UserNotFoundException;
import org.apache.archiva.redback.users.UserQuery;
import org.apache.archiva.redback.users.jpa.model.JpaUser;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * SecuritySystem stub used for testing.
 */
public class SecuritySystemStub
    implements SecuritySystem
{
    Map<String, String> users = new HashMap<>();

    List<String> repoIds = new ArrayList<>();

    public SecuritySystemStub()
    {
        users.put( "user1", "password1" );
        users.put( "user2", "password2" );
        users.put( "user3", "password3" );

        repoIds.add( "test-repo" );
    }

    @Override
    public SecuritySession authenticate( AuthenticationDataSource source )
        throws AuthenticationException, UserNotFoundException, AccountLockedException
    {
        AuthenticationResult result = null;
        SecuritySession session = null;

        if ( users.get( source.getUsername() ) != null )
        {
            result = new AuthenticationResult( true, source.getUsername(), null );

            User user = new JpaUser();
            user.setUsername( source.getUsername() );
            user.setPassword( users.get( source.getUsername() ) );

            session = new DefaultSecuritySession( result, user );
        }
        else
        {
            result = new AuthenticationResult( false, source.getUsername(), null );
            session = new DefaultSecuritySession( result );
        }
        return session;
    }

    @Override
    public AuthorizationResult authorize( SecuritySession arg0, String arg1 )
        throws AuthorizationException
    {
        return null;
    }

    @Override
    public AuthorizationResult authorize( SecuritySession arg0, String permission, String repositoryId )
        throws AuthorizationException
    {

        AuthorizationResult result = new AuthorizationResult( this.repoIds.contains( repositoryId ), permission, null );
        return result;
    }

    @Override
    public AuthorizationResult authorize( User user, String permission, String resource )
        throws AuthorizationException
    {
        return null;
    }

    public String getAuthenticatorId()
    {
        return null;
    }

    public String getAuthorizerId()
    {
        return null;
    }

    @Override
    public KeyManager getKeyManager()
    {
        return null;
    }

    @Override
    public UserSecurityPolicy getPolicy()
    {
        return null;
    }

    public String getUserManagementId()
    {
        return null;
    }

    @Override
    public UserManager getUserManager()
    {
        return new UserManager()
        {

            @Override
            public String getDescriptionKey()
            {
                return "French wine is better than Australian wine !";
            }

            @Override
            public boolean isFinalImplementation()
            {
                return false;
            }

            @Override
            public void initialize()
            {
                // no op
            }

            @Override
            public boolean isReadOnly()
            {
                return false;
            }

            @Override
            public String getId()
            {
                return null;
            }

            @Override
            public void addUserManagerListener( UserManagerListener listener )
            {
                // no op
            }

            @Override
            public void removeUserManagerListener( UserManagerListener listener )
            {
                // no op
            }

            @Override
            public User createUser( String username, String fullName, String emailAddress )
            {
                return null;
            }

            @Override
            public User createGuestUser()
            {
                return new User()
                {

                    @Override
                    public String getUsername()
                    {
                        return "guest";
                    }

                    @Override
                    public void setUsername( String name )
                    {

                    }

                    @Override
                    public String getFullName()
                    {
                        return null;
                    }

                    @Override
                    public void setFullName( String name )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getEmail()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setEmail( String address )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getPassword()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPassword( String rawPassword )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getEncodedPassword()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setEncodedPassword( String encodedPassword )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public Date getLastPasswordChange()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setLastPasswordChange( Date passwordChangeDate )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public List<String> getPreviousEncodedPasswords()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPreviousEncodedPasswords( List<String> encodedPasswordList )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void addPreviousEncodedPassword( String encodedPassword )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isPermanent()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPermanent( boolean permanent )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isLocked()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setLocked( boolean locked )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isPasswordChangeRequired()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPasswordChangeRequired( boolean changeRequired )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isValidated()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setValidated( boolean valid )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public int getCountFailedLoginAttempts()
                    {
                        return 0;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setCountFailedLoginAttempts( int count )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public Date getAccountCreationDate()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setAccountCreationDate( Date date )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public Date getLastLoginDate()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setLastLoginDate( Date date )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getUserManagerId()
                    {
                        return "mock";
                    }
                };
            }

            @Override
            public UserQuery createUserQuery()
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public List<User> getUsers()
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public List<User> getUsers( boolean orderAscending )
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public User addUser( User user )
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public User updateUser( User user )
                throws UserNotFoundException
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public User findUser( String username )
                throws UserNotFoundException
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public User findUser( String username, boolean useCache )
                throws UserNotFoundException, UserManagerException
            {
                return null;
            }

            @Override
            public User getGuestUser()
                throws UserNotFoundException
            {
                return new User()
                {

                    @Override
                    public String getUsername()
                    {
                        return "guest";
                    }

                    @Override
                    public void setUsername( String name )
                    {

                    }

                    @Override
                    public String getFullName()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setFullName( String name )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getEmail()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setEmail( String address )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getPassword()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPassword( String rawPassword )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getEncodedPassword()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setEncodedPassword( String encodedPassword )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public Date getLastPasswordChange()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setLastPasswordChange( Date passwordChangeDate )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public List<String> getPreviousEncodedPasswords()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPreviousEncodedPasswords( List<String> encodedPasswordList )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void addPreviousEncodedPassword( String encodedPassword )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isPermanent()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPermanent( boolean permanent )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isLocked()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setLocked( boolean locked )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isPasswordChangeRequired()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setPasswordChangeRequired( boolean changeRequired )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public boolean isValidated()
                    {
                        return false;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setValidated( boolean valid )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public int getCountFailedLoginAttempts()
                    {
                        return 0;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setCountFailedLoginAttempts( int count )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public Date getAccountCreationDate()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setAccountCreationDate( Date date )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public Date getLastLoginDate()
                    {
                        return null;  //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public void setLastLoginDate( Date date )
                    {
                        //To change body of implemented methods use File | Settings | File Templates.
                    }

                    @Override
                    public String getUserManagerId()
                    {
                        return "mock";
                    }
                };
            }

            @Override
            public List<User> findUsersByUsernameKey( String usernameKey, boolean orderAscending )
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public List<User> findUsersByFullNameKey( String fullNameKey, boolean orderAscending )
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public List<User> findUsersByEmailKey( String emailKey, boolean orderAscending )
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public List<User> findUsersByQuery( UserQuery query )
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public boolean userExists( String principal )
            {
                return false;  //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public void deleteUser( String username )
                throws UserNotFoundException
            {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public void addUserUnchecked( User user )
            {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public void eraseDatabase()
            {
                //To change body of implemented methods use File | Settings | File Templates.
            }

            @Override
            public User updateUser( User user, boolean passwordChangeRequired )
                throws UserNotFoundException
            {
                return null;  //To change body of implemented methods use File | Settings | File Templates.
            }
        };
    }

    @Override
    public boolean isAuthenticated( AuthenticationDataSource arg0 )
        throws AuthenticationException, UserNotFoundException, AccountLockedException
    {
        return false;
    }

    @Override
    public boolean isAuthorized( SecuritySession arg0, String arg1 )
        throws AuthorizationException
    {
        return false;
    }

    @Override
    public boolean isAuthorized( SecuritySession arg0, String arg1, String arg2 )
        throws AuthorizationException
    {
        if ( repoIds.contains( arg2 ) )
        {
            return true;
        }

        return false;
    }

    @Override
    public boolean userManagerReadOnly()
    {
        return true;
    }
}
