#  ============LICENSE_START=======================================================
#  Copyright (C) 2021-2022 Nordix Foundation
#  Modifications Copyright (C) 2021 Pantheon.tech
#  ================================================================================
#  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.
#
#  SPDX-License-Identifier: Apache-2.0
#  ============LICENSE_END=========================================================

components:
  schemas:
    # Common Schemas
    ErrorMessage:
      type: object
      title: Error
      properties:
        status:
          type: string
        message:
          type: string
        details:
          type: string

    # Request Schemas
    RestDmiPluginRegistration:
      type: object
      properties:
        dmiPlugin:
          type: string
          example: my-dmi-plugin
        dmiDataPlugin:
          type: string
          example: my-dmi-data-plugin
        dmiModelPlugin:
          type: string
          example: my-dmi-model-plugin
        createdCmHandles:
          type: array
          items:
            $ref: '#/components/schemas/RestCmHandle'
        updatedCmHandles:
          type: array
          example:
            cmHandle: my-cm-handle
            cmHandleProperties:
              add-my-property: add-property
              update-my-property: updated-property
              delete-my-property: '~'
            publicCmHandleProperties:
              add-my-property: add-property
              update-my-property: updated-property
              delete-my-property: '~'
          items:
            $ref: '#/components/schemas/RestCmHandle'
        removedCmHandles:
          type: array
          items:
            type: string
            example: [my-cm-handle1, my-cm-handle2, my-cm-handle3]

    RestCmHandle:
      required:
        - cmHandle
      type: object
      properties:
        cmHandle:
          type: string
          example: my-cm-handle
        cmHandleProperties:
            $ref: '#/components/schemas/RestCmHandleProperties'
        publicCmHandleProperties:
            $ref: '#/components/schemas/RestCmHandleProperties'
    RestCmHandleProperties:
        type: object
        additionalProperties:
            type: string
            example: my-property

    Conditions:
      type: object
      properties:
        conditions:
          $ref: '#/components/schemas/ConditionsData'
    ConditionsData:
      type: array
      items:
        type: object
        $ref: '#/components/schemas/ConditionProperties'
    ConditionProperties:
      properties:
        name:
          type: string
          example: hasAllModules
        conditionParameters:
          $ref: '#/components/schemas/ModuleNamesAsJsonArray'
    ModuleNamesAsJsonArray:
      type: array
      items:
        type: object
        $ref: '#/components/schemas/ModuleNameAsJsonObject'
        example: [my-module-1, my-module-2, my-module-3]
    ModuleNameAsJsonObject:
        properties:
          moduleName:
            type: string
            example: my-module

    #Response Schemas
    CmHandles:
      type: object
      properties:
        cmHandles:
          $ref: '#/components/schemas/CmHandleProperties'
    CmHandleProperties:
      type: array
      items:
        type: object
        $ref: '#/components/schemas/CmHandleProperty'
    CmHandleProperty:
      properties:
        cmHandleId:
          type: string
          example: my-cm-handle-id

    ModuleReference:
      type: object
      title: Module reference details
      properties:
        moduleName:
          type: string
          example: my-module-name
        revision:
          type: string
          example: my-module-revision

  examples:
    dataSampleRequest:
        summary: Sample request
        description: Sample request body
        value:
          test:bookstore:
            bookstore-name: Chapters
            categories:
              - code: '01'
                name: SciFi
                books:
                - authors:
                    - Iain M. Banks
                    - Ursula K. Le Guin
              - code: '02'
                name: kids
                books:
                - authors:
                    - Philip Pullman

    dataSamplePatchRequest:
      summary: Sample patch request
      description: Sample patch request body
      value:
        ietf-restconf:yang-patch:
          patch-id: patch-1
          edit:
            - edit-id: edit1
              operation: merge
              target: /
              value:
                test:bookstore:
                  bookstore-name: Chapters
                  categories:
                    - code: '01'
                      name: Science
                      books:
                        - authors:
                            - Author1
                            - Author2
                    - code: '02'
                      name: Arts
                      books:
                        - authors:
                            - Author3
            - edit-id: edit2
              operation: merge
              target: /
              value:
                test:bookstore:
                  bookstore-name: Novels
                  categories:
                    - code: '03'
                      name: History
                      books:
                        - authors:
                            - Iain M. Banks
                            - Ursula K. Le Guin
                    - code: '04'
                      name: Fiction
                      books:
                        - authors:
                            - Philip Pullman

    dataSampleResponse:
        summary: Sample response
        description: Sample response for selecting 'sample 1'.
        value:
          bookstore:
            categories:
              - code: '01'
                books:
                  - authors:
                      - Iain M. Banks
                      - Ursula K. Le Guin
                name: SciFi
              - code: '02'
                books:
                  - authors:
                      - Philip Pullman
                name: kids

  parameters:
    cmHandleInPath:
      name: cm-handle
      in: path
      description: The identifier for a network function, network element, subnetwork or any other cm object by managed Network CM Proxy
      required: true
      schema:
        type: string
        example: my-cm-handle
    xpathInQuery:
      name: xpath
      in: query
      description: xpath
      required: false
      schema:
        type: string
        default: /
    requiredXpathInQuery:
      name: xpath
      in: query
      description: xpath
      required: true
      schema:
        type: string
    includeDescendantsOptionInQuery:
      name: include-descendants
      in: query
      description: include-descendants
      required: false
      schema:
        type: boolean
        default: false
    cpsPathInQuery:
      name: cps-path
      in: query
      description: cps-path
      required: false
      schema:
        type: string
        default: /
    resourceIdentifierInQuery:
      name: resourceIdentifier
      in: query
      description: The format of resource identifier depend on the associated DMI Plugin implementation. For ONAP DMI Plugin it will be RESTConf paths but it can really be anything.
      required: true
      allowReserved: true
      schema:
        type: string
      examples:
        sample 1:
          value:
            resourceIdentifier: \shops\bookstore
        sample 2:
          value:
            resourceIdentifier: \shops\bookstore\categories[@code=1]
        sample 3:
          value:
            resourceIdentifier: parent=shops,child=bookstore
    acceptParamInHeader:
      name: Accept
      in: header
      required: false
      description: Accept parameter for response, if accept parameter is null, that means client can accept any format.
      schema:
        type: string
        enum: [ application/json, application/yang-data+json ]
    optionsParamInQuery:
      name: options
      in: query
      description: options parameter in query, it is mandatory to wrap key(s)=value(s) in parenthesis'()'. The format of options parameter depend on the associated DMI Plugin implementation.
      required: false
      schema:
        type: string
      allowReserved: true
      examples:
        sample 1:
          value:
            options: (depth=3)
        sample 2:
          value:
            options: (fields=book)
        sample 3:
          value:
            options: (depth=2,fields=book/authors)
    contentParamInHeader:
      name: Content-Type
      in: header
      required: false
      description: Content parameter for request, if content parameter is null, default value is application/json.
      schema:
        type: string
        default: application/json
        example: application/yang-data+json

  responses:
    NotFound:
      description: The specified resource was not found
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorMessage'
          example:
            status: 400
            message: Not found error message
            details: Not found error details
    Unauthorized:
      description: Unauthorized
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorMessage'
          example:
            status: 401
            message: Unauthorized error message
            details: Unauthorized error details
    Forbidden:
      description: Forbidden
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorMessage'
          example:
           status: 403
           message: Forbidden error message
           details: Forbidden error details
    BadRequest:
      description: Bad Request
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorMessage'
          example:
           status: 400 BAD_REQUEST
           message: Bad request error message
           details: Bad request error details
    Conflict:
      description: Conflict
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorMessage'
          example:
           status: 409 CONFLICT
           message: Conflict error message
           details: Conflict error details
    NotImplemented:
      description: The given path has not been implemented
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorMessage'
          example:
           status: 501
           message: Not implemented error message
           details: Not implemented error details
    Ok:
      description: OK
      content:
        application/json:
          schema:
            type: object
    Created:
      description: Created
      content: {}
    NoContent:
      description: No Content
      content: {}
    InternalServerError:
      description: Internal Server Error
      content:
        application/json:
          schema:
            $ref: "#/components/schemas/ErrorMessage"
          example:
            status: 500
            message: Internal Server Error
            details: Internal Server Error occurred