{
  "openapi": "3.0.3",
  "info": {
    "title": "BTClock API",
    "version": "3.0",
    "description": "BTClock V3 API"
  },
  "servers": [
    {
      "url": "/api/"
    }
  ],
  "paths": {
    "/status": {
      "get": {
        "tags": [
          "system"
        ],
        "summary": "Get current status",
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/system_status": {
      "get": {
        "tags": [
          "system"
        ],
        "summary": "Get system status",
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/settings": {
      "get": {
        "tags": [
          "system"
        ],
        "summary": "Get current settings",
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": null
                }
              }
            }
          }
        }
      },
      "post": {
        "tags": [
          "system"
        ],
        "summary": "Save current settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Settings"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      },
      "patch": {
        "tags": [
          "system"
        ],
        "summary": "Save current settings",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/Settings"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/action/pause": {
      "get": {
        "tags": [
          "timer"
        ],
        "summary": "Pause screen rotation",
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/action/timer_restart": {
      "get": {
        "tags": [
          "timer"
        ],
        "summary": "Restart screen rotation",
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/show/screen/{id}": {
      "get": {
        "tags": [
          "screens"
        ],
        "summary": "Set screen to show",
        "parameters": [
          {
            "in": "path",
            "name": "id",
            "schema": {
              "type": "integer",
              "default": 1
            },
            "required": true,
            "description": "ID of screen to show"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/show/text/{text}": {
      "get": {
        "tags": [
          "screens"
        ],
        "summary": "Set text to show",
        "parameters": [
          {
            "in": "path",
            "name": "text",
            "schema": {
              "type": "string",
              "default": "text"
            },
            "required": true,
            "description": "Text to show"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/show/custom": {
      "post": {
        "tags": [
          "screens"
        ],
        "summary": "Set text to show (advanced)",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CustomText"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/full_refresh": {
      "get": {
        "tags": [
          "system"
        ],
        "summary": "Force full refresh of all displays",
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/lights": {
      "get": {
        "tags": [
          "lights"
        ],
        "summary": "Get LEDs status",
        "responses": {
          "200": {
            "description": "successful operation",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ArrayOfLeds"
                }
              }
            }
          }
        }
      },
      "patch": {
        "tags": [
          "lights"
        ],
        "summary": "Set individual LEDs",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ArrayOfLedsInput"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "succesful operation"
          },
          "400": {
            "description": "invalid colors or wrong amount of LEDs"
          }
        }
      }
    },
    "/lights/{color}": {
      "get": {
        "tags": [
          "lights"
        ],
        "summary": "Turn on LEDs with specific color",
        "parameters": [
          {
            "in": "path",
            "name": "color",
            "schema": {
              "type": "string",
              "default": "FFCC00"
            },
            "required": true,
            "description": "Color in RGB hex"
          }
        ],
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/lights/off": {
      "get": {
        "tags": [
          "lights"
        ],
        "summary": "Turn LEDs off",
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    },
    "/restart": {
      "get": {
        "tags": [
          "system"
        ],
        "summary": "Restart BTClock",
        "responses": {
          "200": {
            "description": "successful operation"
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "RgbColorValues": {
        "type": "object",
        "properties": {
          "red": {
            "type": "integer",
            "minimum": 0,
            "maximum": 255,
            "example": 255
          },
          "green": {
            "type": "integer",
            "minimum": 0,
            "maximum": 255,
            "example": 204
          },
          "blue": {
            "type": "integer",
            "minimum": 0,
            "maximum": 255,
            "example": 0
          }
        }
      },
      "RgbColorHex": {
        "type": "object",
        "properties": {
          "hex": {
            "type": "string",
            "pattern": "^#(?:[0-9a-fA-F]{3}){1,2}$",
            "example": "#FFCC00"
          }
        }
      },
      "RgbColorValueAndHex": {
        "allOf": [
          {
            "$ref": "#/components/schemas/RgbColorValues"
          },
          {
            "$ref": "#/components/schemas/RgbColorHex"
          }
        ]
      },
      "RgbColorValueOrHex": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/RgbColorValues"
          },
          {
            "$ref": "#/components/schemas/RgbColorHex"
          }
        ]
      },
      "ArrayOfLeds": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/RgbColorValueAndHex"
        }
      },
      "ArrayOfLedsInput": {
        "type": "array",
        "items": {
          "$ref": "#/components/schemas/RgbColorValueOrHex"
        }
      },
      "Settings": {
        "type": "object",
        "properties": {
          "fetchEurPrice": {
            "type": "boolean",
            "description": "Fetch EUR price instead of USD"
          },
          "fgColor": {
            "type": "string",
            "default": 16777215,
            "description": "ePaper foreground (text) color"
          },
          "bgColor": {
            "type": "string",
            "default": 0,
            "description": "ePaper background color"
          },
          "ledTestOnPower": {
            "type": "boolean",
            "default": true,
            "description": "Do LED test on power-on"
          },
          "ledFlashOnUpd": {
            "type": "boolean",
            "default": false,
            "description": "Flash LEDs on new block"
          },
          "mdnsEnabled": {
            "type": "boolean",
            "default": true,
            "description": "Enable mDNS"
          },
          "otaEnabled": {
            "type": "boolean",
            "default": true,
            "description": "Enable over-the-air updates"
          },
          "stealFocus": {
            "type": "boolean",
            "default": false,
            "description": "Steal focus on new block"
          },
          "mcapBigChar": {
            "type": "boolean",
            "default": false,
            "description": "Use big characters for market cap screen"
          },
          "mempoolInstance": {
            "type": "string",
            "default": "mempool.space",
            "description": "Mempool.space instance to connect to"
          },
          "ledBrightness": {
            "type": "integer",
            "default": 128,
            "description": "Brightness of LEDs"
          },
          "fullRefreshMin": {
            "type": "integer",
            "default": 60,
            "description": "Full refresh time of ePaper displays in minutes"
          },
          "screen[0]": {
            "type": "boolean"
          },
          "screen[1]": {
            "type": "boolean"
          },
          "screen[2]": {
            "type": "boolean"
          },
          "screen[3]": {
            "type": "boolean"
          },
          "screen[4]": {
            "type": "boolean"
          },
          "screen[5]": {
            "type": "boolean"
          },
          "tzOffset": {
            "type": "integer",
            "default": 60,
            "description": "Timezone offset in minutes"
          },
          "minSecPriceUpd": {
            "type": "integer",
            "default": 30,
            "description": "Minimum time between price updates in seconds"
          },
          "timePerScreen": {
            "type": "integer",
            "default": 30,
            "description": "Time between screens when rotating in minutes"
          }
        }
      },
      "CustomText": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "minItems": 7,
        "maxItems": 7
      }
    }
  }
}