/*
 *  Copyright © 2019 IBM.
 *
 *  Licensed 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.
 */

package org.onap.ccsdk.cds.controllerblueprints.core.annotations


import org.onap.ccsdk.cds.controllerblueprints.core.BluePrintConstants
import kotlin.reflect.KClass

@Target(AnnotationTarget.CLASS)
annotation class BluePrintsDataType(
        val name: String,
        val version: String = BluePrintConstants.DEFAULT_VERSION_NUMBER,
        val description: String,
        val derivedFrom: String = "tosca.datatypes.root"
)

@Target(AnnotationTarget.CLASS)
annotation class BluePrintsWorkflowInput

@Target(AnnotationTarget.CLASS)
annotation class BluePrintsWorkflowOutput

@Target(AnnotationTarget.CLASS)
annotation class BluePrintsNodeType(val propertiesType: KClass<*>, val attributesType: KClass<*>,
                                    val inputsType: KClass<*>, val outputsType: KClass<*>)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class BluePrintsProperty(
        val name: String = "",
        val description: String = ""
)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
@Repeatable
annotation class BluePrintsConstrain()

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class PropertyDefaultValue(val value: String)

annotation class PropertyValidValue(val value: String)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class InputExpression(
        val propertyName: String
)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class PropertyExpression(
        val modelableEntityName: String = "SELF",
        val reqOrCapEntityName: String = "",
        val propertyName: String,
        val subPropertyName: String = ""
)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class AttributeExpression(
        val modelableEntityName: String = "SELF",
        val reqOrCapEntityName: String = "",
        val attributeName: String,
        val subAttributeName: String = ""
)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class ArtifactExpression(
        val modelableEntityName: String = "SELF",
        val artifactName: String,
        val location: String = "LOCAL_FILE",
        val remove: Boolean = false
)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class OperationOutputExpression(
        val modelableEntityName: String = "SELF",
        val interfaceName: String,
        val operationName: String,
        val propertyName: String,
        val subPropertyName: String = ""
)

@Target(AnnotationTarget.FIELD, AnnotationTarget.TYPE_PARAMETER, AnnotationTarget.PROPERTY)
annotation class DSLExpression(
        val propertyName: String
)