package org.openstack4j.model.manila;

import java.util.List;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonValue;
import org.openstack4j.model.ModelEntity;

/**
 * A security service stores configuration information for clients for authentication and authorization (AuthN/AuthZ).
 *
 * @author Daniel Gonzalez Nothnagel
 */
public interface SecurityService extends ModelEntity {
    /**
     * @return the security service status
     */
    String getStatus();

    /**
     * @return the security service ID
     */
    String getId();

    /**
     * @return the project where the security service was created
     */
    String getProjectId();

    /**
     * @return the security service type
     */
    Type getType();

    /**
     * @return the security service name
     */
    String getName();

    /**
     * @return the security service description
     */
    String getDescription();

    /**
     * @return the DNS IP address that is used inside the tenant network
     */
    String getDnsIp();

    /**
     * @return the security service user or group name that is used by the tenant
     */
    String getUser();

    /**
     * @return the user password
     */
    String getPassword();

    /**
     * @return the security service domain
     */
    String getDomain();

    /**
     * @return the security service host name or IP address
     */
    String getServer();

    /**
     * @return the date and time stamp when the security service was created
     */
    String getCreatedAt();

    /**
     * @return the date and time stamp when the security service was updated
     */
    String getUpdatedAt();

    /**
     * @return the share networks this security is added to
     */
    List<String> getShareNetworks();

    enum Type {
        LDAP, KERBEROS, ACTIVE_DIRECTORY;

        @JsonCreator
        public static Type value(String v) {
            return valueOf(v.toUpperCase());
        }

        @JsonValue
        public String value() {
            return name().toLowerCase();
        }
    }
}
