<?php

declare(strict_types=1);

header('Content-Type: application/json; charset=utf-8');

$spec = [
    'openapi' => '3.0.3',

    'info' => [
        'title' => 'Project Kiln API',
        'version' => '1.0.0',
        'description' => 'API documentation for Project Kiln.'
    ],

    'servers' => [
        [
            'url' => '/api',
            'description' => 'Local API'
        ]
    ],

    'tags' => [
        ['name' => 'Auth'],
        ['name' => 'Projects'],
        ['name' => 'Versions'],
        ['name' => 'Tasks'],
        ['name' => 'Workflows'],
        ['name' => 'Admin Options']
    ],

    'security' => [
        ['bearerAuth' => []]
    ],

    'components' => [
        'securitySchemes' => [
            'bearerAuth' => [
                'type' => 'http',
                'scheme' => 'bearer',
                'bearerFormat' => 'API Token'
            ]
        ],

        'schemas' => [
            'User' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'name' => ['type' => 'string', 'example' => 'Demo User'],
                    'email' => ['type' => 'string', 'example' => 'demo@example.com'],
                    'picture' => ['type' => 'string', 'nullable' => true],
                    'settings' => [
                        'type' => 'object',
                        'properties' => [
                            'theme' => [
                                'type' => 'string',
                                'enum' => ['white', 'dark', 'purple', 'green', 'beige'],
                                'example' => 'dark'
                            ]
                        ]
                    ]
                ]
            ],

            'AuthTokenResponse' => [
                'type' => 'object',
                'properties' => [
                    'success' => ['type' => 'boolean', 'example' => true],
                    'token_type' => ['type' => 'string', 'example' => 'Bearer'],
                    'access_token' => ['type' => 'string', 'example' => 'generated-api-token'],
                    'expires_in' => ['type' => 'integer', 'example' => 43200],
                    'user' => ['$ref' => '#/components/schemas/User']
                ]
            ],

            'Project' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'string', 'example' => 'AUTH'],
                    'name' => ['type' => 'string', 'example' => 'Authentication System'],
                    'owner' => ['type' => 'integer', 'example' => 1],
                    'created_date' => ['type' => 'string', 'format' => 'date', 'example' => '2026-06-13']
                ]
            ],

            'Version' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'name' => ['type' => 'string', 'example' => 'Version 1.0'],
                    'description' => ['type' => 'string', 'nullable' => true],
                    'created_date' => ['type' => 'string', 'format' => 'date'],
                    'due_date' => ['type' => 'string', 'format' => 'date', 'nullable' => true],
                    'released_date' => ['type' => 'string', 'format' => 'date', 'nullable' => true],
                    'project' => ['type' => 'string', 'example' => 'AUTH']
                ]
            ],

            'Task' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'string', 'example' => 'AUTH-1'],
                    'title' => ['type' => 'string', 'example' => 'Build login system'],
                    'description' => ['type' => 'string', 'nullable' => true],
                    'project' => ['type' => 'string', 'example' => 'AUTH'],
                    'created_date' => ['type' => 'string', 'format' => 'date'],
                    'last_changed' => ['type' => 'string', 'format' => 'date'],
                    'reporter' => ['type' => 'integer'],
                    'assignee' => ['type' => 'integer', 'nullable' => true],
                    'fix_version' => ['type' => 'integer', 'nullable' => true],
                    'type' => ['type' => 'integer'],
                    'priority' => ['type' => 'integer'],
                    'status' => ['type' => 'integer', 'nullable' => true],
                    'status_state' => [
                        'nullable' => true,
                        '$ref' => '#/components/schemas/WorkflowState'
                    ],
                    'status_transitions' => [
                        'type' => 'array',
                        'items' => ['$ref' => '#/components/schemas/WorkflowTransition']
                    ],
                    'custom_fields' => [
                        'type' => 'array',
                        'items' => ['$ref' => '#/components/schemas/CustomTaskField']
                    ]
                ]
            ],

            'TaskListItem' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'string', 'example' => 'AUTH-1'],
                    'title' => ['type' => 'string', 'example' => 'Build login system'],
                    'type' => ['type' => 'integer', 'example' => 1],
                    'priority' => ['type' => 'integer', 'example' => 2],
                    'assignee' => ['type' => 'integer', 'nullable' => true],
                    'assignee_name' => ['type' => 'string', 'nullable' => true],
                    'assignee_picture' => ['type' => 'string', 'nullable' => true],
                    'status' => ['type' => 'integer', 'nullable' => true],
                    'status_state' => [
                        'nullable' => true,
                        '$ref' => '#/components/schemas/WorkflowState'
                    ]
                ]
            ],

            'TaskComment' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'response_to' => ['type' => 'integer', 'nullable' => true],
                    'task_id' => ['type' => 'string', 'example' => 'AUTH-1'],
                    'commenter' => ['type' => 'integer', 'example' => 1],
                    'comment' => ['type' => 'string', 'example' => 'Looks good to me.'],
                    'commenter_name' => ['type' => 'string', 'example' => 'Demo User'],
                    'commenter_email' => ['type' => 'string', 'example' => 'demo@example.com'],
                    'commenter_picture' => ['type' => 'string', 'nullable' => true]
                ]
            ],

            'TaskOption' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'name' => ['type' => 'string', 'example' => 'Bug'],
                    'icon' => ['type' => 'string', 'nullable' => true]
                ]
            ],

            'CustomTaskField' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'task_type' => ['type' => 'integer', 'example' => 1],
                    'name' => ['type' => 'string', 'example' => 'Story points'],
                    'type' => [
                        'type' => 'string',
                        'enum' => ['string', 'int', 'float', 'date', 'boolean', 'text', 'json'],
                        'example' => 'int'
                    ],
                    'value' => ['nullable' => true],
                    'raw_value' => ['type' => 'string', 'example' => '3']
                ]
            ],

            'Right' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'name' => ['type' => 'string', 'example' => 'Admin']
                ]
            ],

            'UserRight' => [
                'type' => 'object',
                'properties' => [
                    'user_id' => ['type' => 'integer', 'example' => 1],
                    'right_id' => ['type' => 'integer', 'example' => 3]
                ]
            ],

            'ProjectAccess' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'user_id' => ['type' => 'integer', 'example' => 1],
                    'project_id' => ['type' => 'string', 'example' => 'AUTH']
                ]
            ],

            'WorkflowState' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'name' => ['type' => 'string', 'example' => 'Open'],
                    'color' => ['type' => 'string', 'example' => '#4ea1ff']
                ]
            ],

            'WorkflowTransition' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'from_id' => ['type' => 'integer', 'example' => 1],
                    'to_id' => ['type' => 'integer', 'example' => 2],
                    'action_name' => ['type' => 'string', 'example' => 'Close task']
                ]
            ],

            'WorkflowAssignment' => [
                'type' => 'object',
                'properties' => [
                    'id' => ['type' => 'integer', 'example' => 1],
                    'task_type' => ['type' => 'integer', 'example' => 1],
                    'state' => ['type' => 'integer', 'example' => 1]
                ]
            ],

            'ErrorResponse' => [
                'type' => 'object',
                'properties' => [
                    'success' => ['type' => 'boolean', 'example' => false],
                    'error' => ['type' => 'string', 'example' => 'Invalid request.']
                ]
            ]
        ]
    ],

    'paths' => [
        '/auth.php' => [
            'post' => [
                'tags' => ['Auth'],
                'summary' => 'Login, create token or logout',
                'security' => [],
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['Login', 'CreateToken', 'Logout']
                        ]
                    ]
                ],
                'requestBody' => [
                    'required' => false,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'email' => ['type' => 'string', 'example' => 'demo@example.com'],
                                    'password' => ['type' => 'string', 'example' => 'password123']
                                ]
                            ]
                        ]
                    ]
                ],
                'responses' => [
                    '200' => [
                        'description' => 'Successful auth response',
                        'content' => [
                            'application/json' => [
                                'schema' => ['$ref' => '#/components/schemas/AuthTokenResponse']
                            ]
                        ]
                    ],
                    '400' => ['description' => 'Invalid request'],
                    '401' => ['description' => 'Invalid credentials or not logged in'],
                    '405' => ['description' => 'Invalid method']
                ]
            ],

            'get' => [
                'tags' => ['Auth'],
                'summary' => 'Get current authenticated user',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['Me']
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Current user returned'],
                    '401' => ['description' => 'Not authenticated']
                ]
            ]
        ],

        '/user.php' => [
            'get' => [
                'tags' => ['Auth'],
                'summary' => 'List users or get one user',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['ListUsers', 'UserInfo']
                        ]
                    ],
                    [
                        'name' => 'user_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ]
                ],
                'responses' => [
                    '200' => [
                        'description' => 'Successful response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'success' => ['type' => 'boolean'],
                                        'users' => [
                                            'type' => 'array',
                                            'items' => ['$ref' => '#/components/schemas/User']
                                        ],
                                        'user' => ['$ref' => '#/components/schemas/User']
                                    ]
                                ]
                            ]
                        ]
                    ],
                    '400' => ['description' => 'Invalid request'],
                    '404' => ['description' => 'User not found']
                ]
            ],

            'post' => [
                'tags' => ['Auth'],
                'summary' => 'Edit current user',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['Edit']
                        ]
                    ],
                    [
                        'name' => 'user_id',
                        'in' => 'query',
                        'required' => true,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ]
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => ['type' => 'string', 'example' => 'Demo User'],
                                    'email' => ['type' => 'string', 'example' => 'demo@example.com'],
                                    'password' => ['type' => 'string', 'example' => 'new-password'],
                                    'theme' => [
                                        'type' => 'string',
                                        'enum' => ['white', 'dark', 'purple', 'green', 'beige'],
                                        'example' => 'dark'
                                    ]
                                ]
                            ]
                        ],
                        'multipart/form-data' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => ['type' => 'string', 'example' => 'Demo User'],
                                    'email' => ['type' => 'string', 'example' => 'demo@example.com'],
                                    'password' => ['type' => 'string', 'example' => 'new-password'],
                                    'theme' => [
                                        'type' => 'string',
                                        'enum' => ['white', 'dark', 'purple', 'green', 'beige'],
                                        'example' => 'dark'
                                    ],
                                    'picture' => [
                                        'type' => 'string',
                                        'format' => 'binary',
                                        'description' => 'PNG, JPG, WEBP, or GIF up to 10 MB.'
                                    ],
                                    'remove_picture' => [
                                        'type' => 'string',
                                        'example' => '1'
                                    ]
                                ]
                            ]
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'User edited'],
                    '400' => ['description' => 'Invalid request'],
                    '403' => ['description' => 'Cannot edit another user']
                ]
            ]
        ],

        '/project.php' => [
            'get' => [
                'tags' => ['Projects'],
                'summary' => 'List projects or get project info',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['ListProjects', 'ProjectInfo']
                        ]
                    ],
                    [
                        'name' => 'project_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'string', 'example' => 'AUTH']
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Successful response'],
                    '400' => ['description' => 'Invalid request'],
                    '404' => ['description' => 'Project not found']
                ]
            ],

            'post' => [
                'tags' => ['Projects'],
                'summary' => 'Create or edit project',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['Create', 'Edit']
                        ]
                    ],
                    [
                        'name' => 'project_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'string', 'example' => 'AUTH']
                    ]
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'id' => ['type' => 'string', 'example' => 'AUTH'],
                                    'name' => ['type' => 'string', 'example' => 'Authentication System'],
                                    'owner' => ['type' => 'integer', 'example' => 1]
                                ]
                            ]
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Project edited'],
                    '201' => ['description' => 'Project created'],
                    '400' => ['description' => 'Invalid request'],
                    '409' => ['description' => 'Project id already exists']
                ]
            ]
        ],

        '/version.php' => [
            'get' => [
                'tags' => ['Versions'],
                'summary' => 'List versions or get version info',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['ListVersions', 'VersionInfo']
                        ]
                    ],
                    [
                        'name' => 'project_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'string', 'example' => 'AUTH']
                    ],
                    [
                        'name' => 'version_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Successful response'],
                    '400' => ['description' => 'Invalid request'],
                    '404' => ['description' => 'Version not found']
                ]
            ],

            'post' => [
                'tags' => ['Versions'],
                'summary' => 'Create or edit version',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['Create', 'Edit']
                        ]
                    ],
                    [
                        'name' => 'version_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ]
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'project_id' => ['type' => 'string', 'example' => 'AUTH'],
                                    'name' => ['type' => 'string', 'example' => 'Version 1.0'],
                                    'description' => ['type' => 'string', 'nullable' => true],
                                    'due_date' => ['type' => 'string', 'format' => 'date', 'nullable' => true],
                                    'released_date' => ['type' => 'string', 'format' => 'date', 'nullable' => true]
                                ]
                            ]
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Version edited'],
                    '201' => ['description' => 'Version created'],
                    '400' => ['description' => 'Invalid request']
                ]
            ]
        ],

        '/workflow.php' => [
            'get' => [
                'tags' => ['Workflows'],
                'summary' => 'Get workflow editor data',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['WorkflowData']
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Workflow data returned']
                ]
            ],
            'post' => [
                'tags' => ['Workflows'],
                'summary' => 'Edit workflow states, transitions, and task type assignments',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => [
                                'CreateState',
                                'DeleteState',
                                'CreateTransition',
                                'DeleteTransition',
                                'AssignState',
                                'SetDefaultState',
                                'RemoveAssignedState'
                            ]
                        ]
                    ],
                    [
                        'name' => 'state_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer']
                    ],
                    [
                        'name' => 'transition_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer']
                    ],
                    [
                        'name' => 'assignment_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer']
                    ]
                ],
                'requestBody' => [
                    'required' => false,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'name' => ['type' => 'string', 'example' => 'Open'],
                                    'color' => ['type' => 'string', 'example' => '#4ea1ff'],
                                    'from_id' => ['type' => 'integer', 'example' => 1],
                                    'to_id' => ['type' => 'integer', 'example' => 2],
                                    'action_name' => ['type' => 'string', 'example' => 'Close task'],
                                    'task_type' => ['type' => 'integer', 'example' => 1],
                                    'state' => ['type' => 'integer', 'nullable' => true, 'example' => 1]
                                ]
                            ]
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Workflow changed'],
                    '201' => ['description' => 'Workflow item created'],
                    '400' => ['description' => 'Invalid request']
                ]
            ]
        ],

        '/admin_options.php' => [
            'get' => [
                'tags' => ['Admin Options'],
                'summary' => 'Get editable task options and user rights',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['OptionsData']
                        ]
                    ]
                ],
                'responses' => [
                    '200' => [
                        'description' => 'Task options and user rights returned',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'success' => ['type' => 'boolean'],
                                        'options' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'types' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/TaskOption']
                                                ],
                                                'priorities' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/TaskOption']
                                                ],
                                                'custom_fields' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/CustomTaskField']
                                                ],
                                                'users' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/User']
                                                ],
                                                'rights' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/Right']
                                                ],
                                                'user_rights' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/UserRight']
                                                ],
                                                'projects' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/Project']
                                                ],
                                                'user_access' => [
                                                    'type' => 'array',
                                                    'items' => ['$ref' => '#/components/schemas/ProjectAccess']
                                                ]
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ]
                ]
            ],
            'post' => [
                'tags' => ['Admin Options'],
                'summary' => 'Create, update, or delete task options and user rights',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => [
                                'CreateOption',
                                'UpdateOption',
                                'DeleteOption',
                                'CreateCustomField',
                                'UpdateCustomField',
                                'DeleteCustomField',
                                'SetUserRight',
                                'GrantProjectAccess',
                                'RevokeProjectAccess'
                            ]
                        ]
                    ],
                    [
                        'name' => 'kind',
                        'in' => 'query',
                        'required' => false,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['type', 'priority']
                        ]
                    ],
                    [
                        'name' => 'id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer']
                    ],
                    [
                        'name' => 'field_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer']
                    ],
                    [
                        'name' => 'access_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer']
                    ]
                ],
                'requestBody' => [
                    'required' => false,
                    'content' => [
                        'multipart/form-data' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'kind' => [
                                        'type' => 'string',
                                        'enum' => ['type', 'priority']
                                    ],
                                    'id' => ['type' => 'integer'],
                                    'name' => ['type' => 'string', 'example' => 'Bug'],
                                    'logo' => [
                                        'type' => 'string',
                                        'format' => 'binary'
                                    ],
                                    'remove_logo' => ['type' => 'boolean'],
                                    'task_type' => ['type' => 'integer', 'example' => 1],
                                    'type' => [
                                        'type' => 'string',
                                        'enum' => ['string', 'int', 'float', 'date', 'boolean', 'text', 'json']
                                    ],
                                    'value' => ['type' => 'string', 'example' => '3'],
                                    'user_id' => ['type' => 'integer', 'example' => 1],
                                    'right_id' => ['type' => 'integer', 'example' => 3],
                                    'enabled' => ['type' => 'boolean', 'example' => true],
                                    'project_id' => ['type' => 'string', 'example' => 'AUTH']
                                ]
                            ]
                        ],
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'kind' => [
                                        'type' => 'string',
                                        'enum' => ['type', 'priority']
                                    ],
                                    'id' => ['type' => 'integer'],
                                    'name' => ['type' => 'string', 'example' => 'Bug'],
                                    'remove_logo' => ['type' => 'boolean'],
                                    'task_type' => ['type' => 'integer', 'example' => 1],
                                    'type' => [
                                        'type' => 'string',
                                        'enum' => ['string', 'int', 'float', 'date', 'boolean', 'text', 'json']
                                    ],
                                    'value' => ['type' => 'string', 'example' => '3'],
                                    'user_id' => ['type' => 'integer', 'example' => 1],
                                    'right_id' => ['type' => 'integer', 'example' => 3],
                                    'enabled' => ['type' => 'boolean', 'example' => true],
                                    'project_id' => ['type' => 'string', 'example' => 'AUTH']
                                ]
                            ]
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Admin option changed'],
                    '201' => ['description' => 'Task option created'],
                    '400' => ['description' => 'Invalid request'],
                    '409' => ['description' => 'Task option is still in use']
                ]
            ]
        ],

        '/task.php' => [
            'get' => [
                'tags' => ['Tasks'],
                'summary' => 'List tasks or get task info',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => [
                                'TaskInfo',
                                'ListTasksByProject',
                                'ListTasksByVersion',
                                'ListComments',
                                'GetType',
                                'GetPriority',
                                'ListTypes',
                                'ListPriorities'
                            ]
                        ]
                    ],
                    [
                        'name' => 'task_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'string', 'example' => 'AUTH-1']
                    ],
                    [
                        'name' => 'project_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'string', 'example' => 'AUTH']
                    ],
                    [
                        'name' => 'version_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ],
                    [
                        'name' => 'type_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ],
                    [
                        'name' => 'priority_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 2]
                    ],
                    [
                        'name' => 'page',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ],
                    [
                        'name' => 'per_page',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'maximum' => 100, 'example' => 100]
                    ],
                    [
                        'name' => 'sort',
                        'in' => 'query',
                        'required' => false,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['id', 'title', 'type', 'priority', 'assignee', 'status']
                        ]
                    ],
                    [
                        'name' => 'direction',
                        'in' => 'query',
                        'required' => false,
                        'schema' => [
                            'type' => 'string',
                            'enum' => ['asc', 'desc']
                        ]
                    ]
                ],
                'responses' => [
                    '200' => [
                        'description' => 'Successful response',
                        'content' => [
                            'application/json' => [
                                'schema' => [
                                    'type' => 'object',
                                    'properties' => [
                                        'success' => ['type' => 'boolean'],
                                        'task' => ['$ref' => '#/components/schemas/Task'],
                                        'tasks' => [
                                            'type' => 'array',
                                            'items' => [
                                                'oneOf' => [
                                                    ['type' => 'string'],
                                                    ['$ref' => '#/components/schemas/TaskListItem']
                                                ]
                                            ]
                                        ],
                                        'comments' => [
                                            'type' => 'array',
                                            'items' => ['$ref' => '#/components/schemas/TaskComment']
                                        ],
                                        'type' => ['$ref' => '#/components/schemas/TaskOption'],
                                        'priority' => ['$ref' => '#/components/schemas/TaskOption'],
                                        'types' => [
                                            'type' => 'array',
                                            'items' => ['$ref' => '#/components/schemas/TaskOption']
                                        ],
                                        'priorities' => [
                                            'type' => 'array',
                                            'items' => ['$ref' => '#/components/schemas/TaskOption']
                                        ],
                                        'pagination' => [
                                            'type' => 'object',
                                            'properties' => [
                                                'page' => ['type' => 'integer'],
                                                'per_page' => ['type' => 'integer'],
                                                'total' => ['type' => 'integer'],
                                                'total_pages' => ['type' => 'integer']
                                            ]
                                        ]
                                    ]
                                ]
                            ]
                        ]
                    ],
                    '400' => ['description' => 'Invalid request'],
                    '404' => ['description' => 'Task not found']
                ]
            ],

            'post' => [
                'tags' => ['Tasks'],
                'summary' => 'Create or edit task',
                'parameters' => [
                    [
                        'name' => 'api',
                        'in' => 'query',
                        'required' => true,
                        'schema' => [
                            'type' => 'string',
                            'enum' => [
                                'Create',
                                'Edit',
                                'CreateComment',
                                'EditComment',
                                'DeleteComment',
                                'SetCustomFieldValue',
                                'TransitionStatus'
                            ]
                        ]
                    ],
                    [
                        'name' => 'task_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'string', 'example' => 'AUTH-1']
                    ],
                    [
                        'name' => 'comment_id',
                        'in' => 'query',
                        'required' => false,
                        'schema' => ['type' => 'integer', 'example' => 1]
                    ]
                ],
                'requestBody' => [
                    'required' => true,
                    'content' => [
                        'application/json' => [
                            'schema' => [
                                'type' => 'object',
                                'properties' => [
                                    'project_id' => ['type' => 'string', 'example' => 'AUTH'],
                                    'title' => ['type' => 'string', 'example' => 'Build login system'],
                                    'description' => ['type' => 'string', 'nullable' => true],
                                    'assignee' => ['type' => 'integer', 'nullable' => true],
                                    'fix_version' => ['type' => 'integer', 'nullable' => true],
                                    'type' => [
                                        'type' => 'integer',
                                        'example' => 1,
                                        'description' => 'Must be one of ListTypes.'
                                    ],
                                    'priority' => [
                                        'type' => 'integer',
                                        'example' => 2,
                                        'description' => 'Must be one of ListPriorities.'
                                    ],
                                    'comment' => ['type' => 'string', 'example' => 'Looks good to me.'],
                                    'response_to' => ['type' => 'integer', 'nullable' => true],
                                    'field_id' => ['type' => 'integer', 'example' => 1],
                                    'value' => ['type' => 'string', 'nullable' => true],
                                    'transition_id' => ['type' => 'integer', 'example' => 1]
                                ]
                            ]
                        ]
                    ]
                ],
                'responses' => [
                    '200' => ['description' => 'Task edited'],
                    '201' => ['description' => 'Task created'],
                    '400' => ['description' => 'Invalid request']
                ]
            ]
        ]
    ]
];

echo json_encode(
    $spec,
    JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE
);
