package org.jenkinsci.plugins.oic;

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

import org.acegisecurity.GrantedAuthority;

import hudson.model.User;
import hudson.model.UserProperty;
import hudson.model.UserPropertyDescriptor;
import org.acegisecurity.GrantedAuthorityImpl;

public class OicUserProperty extends UserProperty {

    public static class Descriptor extends UserPropertyDescriptor {

		@Override
		public UserProperty newInstance(User user) {
			LOGGER.fine("OicUserPropertyDescriptor.newInstance called, user:" + user);
			return new OicUserProperty(user.getId(), new GrantedAuthority[0]);
		}

		@Override
		public String getDisplayName() {
			return Messages.openid_connect_user_property();
		}
    	
    }

	private static final Logger LOGGER = Logger.getLogger(OicUserProperty.class.getName());

	private final List<String> authorities = new ArrayList<String>();
	private final String userName;

	public OicUserProperty(String userName, GrantedAuthority[] authorities) {
		this.userName = userName;
		for(GrantedAuthority authority : authorities) {
			this.authorities.add(authority.getAuthority());
		}
	}

	public List<String> getAuthorities() {
		return Collections.unmodifiableList(authorities);
	}

	public GrantedAuthority[] getAuthoritiesAsGrantedAuthorities() {
		GrantedAuthority[] authorities = new GrantedAuthority[this.authorities.size()];
		for(int i=0; i<authorities.length; i++) {
			authorities[i] = new GrantedAuthorityImpl(this.authorities.get(i));
		}
		return authorities;
	}
	
	public String getAllGrantedAuthorities() {
		StringBuilder result = new StringBuilder();
		result.append("Number of GrantedAuthorities in OicUserProperty for ").append(userName).append(": ").append(authorities.size());
		for (String authority: authorities) {
			result.append("<br>\nAuthority: ").append(authority);
		}
		return result.toString();
	}
	
	public String getUserName() {
		return userName;
	}

	@Override
	public UserPropertyDescriptor getDescriptor() {
		return new Descriptor();
	}
}