---
#openapi: "3.0.0"
#info:
#  version: "1.0.0"
#  title: "Chill api"
#  description: "Api documentation for chill. Currently, work in progress"
#servers:
#  - url: "/api"
#    description: "Your current dev server"

components:
    schemas:
        Date:
            type: object
            properties:
                datetime:
                    type: string
                    format: date-time
        User:
            type: object
            properties:
                id:
                    type: integer
                type:
                    type: string
                    enum:
                        - user
                username:
                    type: string
                text:
                    type: string

paths:
    /1.0/calendar/calendar/{id}/answer/{answer}.json:
        post:
            tags:
                - calendar
            summary: Answer to a calendar's invite
            parameters:
                -
                    in: path
                    name: id
                    required: true
                    description: the calendar id
                    schema:
                        type: integer
                        format: integer
                        minimum: 0
                -
                    in: path
                    name: answer
                    required: true
                    description: the answer
                    schema:
                        type: string
                        enum:
                            - accepted
                            - declined
                            - tentative
            responses:
                400:
                    description: bad answer
                403:
                    description: not invited
                404:
                    description: not found
                202:
                    description: accepted

    /1.0/calendar/calendar.json:
        get:
            tags:
                - calendar
            summary: Return a list of all calendar items
            responses:
                200:
                    description: "ok"

    /1.0/calendar/calendar/{id}.json:
        get:
            tags:
                - calendar
            summary: Return an calendar item by id
            parameters:
                -   name: id
                    in: path
                    required: true
                    description: The calendar id
                    schema:
                        type: integer
                        format: integer
                        minimum: 1
            responses:
                200:
                    description: "ok"
                404:
                    description: "not found"
                403:
                    description: "Unauthorized"

    /1.0/calendar/calendar/by-user/{userId}.json:
        get:
            tags:
                - calendar
            summary: Return a list of calendars for a user
            parameters:
                -   name: userId
                    in: path
                    required: true
                    description: The user id
                    schema:
                        type: integer
                        format: integer
                        minimum: 1
                -   name: dateFrom
                    in: query
                    required: true
                    description: The date from, formatted as ISO8601 string
                    schema:
                        type: string
                        format: date-time
                -   name: dateTo
                    in: query
                    required: true
                    description: The date to, formatted as ISO8601 string
                    schema:
                        type: string
                        format: date-time
            responses:
                200:
                    description: "ok"
                404:
                    description: "not found"
                403:
                    description: "Unauthorized"

    /1.0/calendar/calendar-range.json:
        get:
            tags:
                - calendar
            summary: Return a list of all calendar range items
            responses:
                200:
                    description: "ok"
        post:
            tags:
                - calendar
            summary: create a new calendar range
            requestBody:
                required: true
                content:
                    application/json:
                        schema:
                            type: object
                            properties:
                                user:
                                    $ref: '#/components/schemas/User'
                                startDate:
                                    $ref: '#/components/schemas/Date'
                                endDate:
                                    $ref: '#/components/schemas/Date'
            responses:
                401:
                    description: "Unauthorized"
                404:
                    description: "Not found"
                200:
                    description: "OK"
                422:
                    description: "Unprocessable entity (validation errors)"
                400:
                    description: "transition cannot be applyed"

    /1.0/calendar/calendar-range/{id}.json:
        get:
            tags:
                - calendar
            summary: Return an calendar-range item by id
            parameters:
                -   name: id
                    in: path
                    required: true
                    description: The calendar-range id
                    schema:
                        type: integer
                        format: integer
                        minimum: 1
            responses:
                200:
                    description: "ok"
                404:
                    description: "not found"
                401:
                    description: "Unauthorized"
        patch:
            tags:
                - calendar
            summary: update a calendar range
            requestBody:
                required: true
                content:
                    application/json:
                        schema:
                            type: object
                            properties:
                                user:
                                    $ref: '#/components/schemas/User'
                                startDate:
                                    $ref: '#/components/schemas/Date'
                                endDate:
                                    $ref: '#/components/schemas/Date'
            responses:
                401:
                    description: "Unauthorized"
                404:
                    description: "Not found"
                200:
                    description: "OK"
                422:
                    description: "Unprocessable entity (validation errors)"
                400:
                    description: "transition cannot be applyed"
        delete:
            tags:
                - calendar
            summary: "Remove a calendar range"
            parameters:
                -   name: id
                    in: path
                    required: true
                    description: The calendar range id
                    schema:
                        type: integer
                        format: integer
                        minimum: 1
            responses:
                401:
                    description: "Unauthorized"
                404:
                    description: "Not found"
                200:
                    description: "OK"
                422:
                    description: "object with validation errors"

    /1.0/calendar/calendar-range-available/{userId}.json:
        get:
            tags:
                - calendar
            summary: Return a list of available calendar range items. Available means calendar-range not being taken by a calendar entity
            parameters:
                -   name: userId
                    in: path
                    required: true
                    description: The user id
                    schema:
                        type: integer
                        format: integer
                        minimum: 1
                -   name: dateFrom
                    in: query
                    required: true
                    description: The date from, formatted as ISO8601 string
                    schema:
                        type: string
                        format: date-time
                -   name: dateTo
                    in: query
                    required: true
                    description: The date to, formatted as ISO8601 string
                    schema:
                        type: string
                        format: date-time
            responses:
                200:
                    description: "ok"
