/*******************************************************************************
 * Copyright (c) 2015 Red Hat, Inc. Distributed under license by Red Hat, Inc.
 * All rights reserved. This program is 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: Red Hat, Inc.
 ******************************************************************************/
package com.openshift.restclient;

import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.Set;

import org.apache.commons.lang.StringUtils;

/**
 * ResourceKind are the various types of Kubernetes
 * resources that are of interest
 *
 */
public final class ResourceKind {
	
	//OpenShift Kinds
	public static final String BUILD = "Build";
	public static final String BUILD_CONFIG = "BuildConfig";
	public static final String DEPLOYMENT_CONFIG = "DeploymentConfig";
	public static final String IMAGE_STREAM = "ImageStream";
	public static final String IMAGE_STREAM_TAG = "ImageStreamTag";
	public static final String IMAGE_STREAM_IMPORT = "ImageStreamImport";
	public static final String OAUTH_ACCESS_TOKEN = "OAuthAccessToken";
	public static final String OAUTH_AUTHORIZE_TOKEN = "OAuthAuthorizeToken";
	public static final String OAUTH_CLIENT = "OAuthClient";
	public static final String OAUTH_CLIENT_AUTHORIZATION = "OAuthClientAuthorization";
	public static final String POLICY = "Policy";
	public static final String POLICY_BINDING = "PolicyBinding";
	public static final String PROJECT = "Project";
	public static final String PROJECT_REQUEST = "ProjectRequest";
	public static final String ROLE = "Role";
	public static final String ROLE_BINDING = "RoleBinding";
	public static final String ROUTE = "Route";
	public static final String TEMPLATE = "Template";
	public static final String USER = "User";
	
	//Kubernetes Kinds
	public static final String ENDPOINTS = "Endpoints";
	public static final String EVENT = "Event";
	public static final String LIMIT_RANGE = "LimitRange";
	public static final String POD = "Pod";
	public static final String PVC = "PersistentVolumeClaim";
	public static final String PERSISTENT_VOLUME = "PersistentVolume";
	public static final String REPLICATION_CONTROLLER = "ReplicationController";
	public static final String RESOURCE_QUOTA = "ResourceQuota";
	public static final String SERVICE = "Service";
	public static final String SECRET = "Secret";
	public static final String SERVICE_ACCOUNT = "ServiceAccount";
	public static final String CONFIG_MAP = "ConfigMap";
	/*
	 * These are not true resources that can be used (mostly) in
	 * RESTful operations
	 */
	public static final String BUILD_REQUEST = "BuildRequest";

	@Deprecated
	public static final String CONFIG = "Config";//not rest resource;
	public static final String LIST = "List";
	public static final String STATUS = "Status";//not rest resource
	public static final String PROCESSED_TEMPLATES = "ProcessedTemplates";//mechanism for processing templates

	/**
	 * The default if we haven't implemented the kind yet
	 */
	public static final String UNRECOGNIZED = "Unrecognized";
	
	private static final Collection<String> values; 
	
	public static Collection<String> values() {
		return values;
	}
	
	public static String pluralize(String kind) {
		return pluralize(kind, false, false);
	}	
	public static String pluralize(String kind, boolean lowercase, boolean uncapitalize) {
		if(StringUtils.isBlank(kind)) return "";
		if(kind.endsWith("y")) 
			kind = kind.substring(0, kind.length()-1).concat("ies");
		else if(!kind.endsWith("s")) {
			kind = kind.concat("s");
		}
		if(lowercase) {
			kind = kind.toLowerCase();
		}
		if(uncapitalize) {
			kind = StringUtils.uncapitalize(kind);
		}
		return kind;
	}
	
	static {
		Set<String> set = new HashSet<String>();
		//OpenShift Kinds
		set.add(BUILD);
		set.add(BUILD_CONFIG);
		set.add(DEPLOYMENT_CONFIG);
		set.add(IMAGE_STREAM );
		set.add(IMAGE_STREAM_TAG);
		set.add(IMAGE_STREAM_IMPORT);
		set.add(OAUTH_ACCESS_TOKEN);
		set.add(OAUTH_AUTHORIZE_TOKEN);
		set.add(OAUTH_CLIENT);
		set.add(OAUTH_CLIENT_AUTHORIZATION);
		set.add(POLICY);
		set.add(POLICY_BINDING);
		set.add(PROJECT );
		set.add(PROJECT_REQUEST);
		set.add(ROLE);
		set.add(ROLE_BINDING);
		set.add(ROUTE);
		set.add(TEMPLATE);
		set.add(USER);
		
		//Kubernetes Kinds
		set.add(EVENT);
		set.add(LIMIT_RANGE);
		set.add(POD);
		set.add(PVC);
		set.add(PERSISTENT_VOLUME);
		set.add(REPLICATION_CONTROLLER);
		set.add(RESOURCE_QUOTA);
		set.add(SERVICE);
		set.add(SECRET);
		set.add(SERVICE_ACCOUNT);
		set.add(CONFIG_MAP);

		/*
		 * These are not true resources that can be used (mostly) in
		 * RESTful operations
		 */
		set.add(BUILD_REQUEST);
		set.add(CONFIG);
		set.add(LIST);
		set.add(STATUS);
		set.add("ProcessedTemplates");
		values = Collections.unmodifiableCollection(set);
	}
	
	private ResourceKind() {
	}
}
