{
  "openapi": "3.0.3",
  "info": {
    "title": "Avukatim360 Panel API",
    "version": "0.1.0",
    "description": "Current session-cookie based panel API contract for clients, cases, tasks, deadlines, documents, finance, communications and upload flows."
  },
  "servers": [
    {
      "url": "https://app.avukatim360.com.tr"
    }
  ],
  "components": {
    "securitySchemes": {
      "panelSession": {
        "type": "apiKey",
        "in": "cookie",
        "name": "panel_token"
      }
    },
    "schemas": {
      "Error": {
        "type": "object",
        "properties": {
          "error": { "type": "string" }
        },
        "required": ["error"]
      },
      "ClientInput": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "email": { "type": "string" },
          "phone": { "type": "string" },
          "caseType": { "type": "string" }
        },
        "required": ["name"]
      },
      "CaseInput": {
        "type": "object",
        "properties": {
          "clientId": { "type": "string", "nullable": true },
          "title": { "type": "string" },
          "caseNumber": { "type": "string" },
          "counterparty": { "type": "string" },
          "court": { "type": "string" },
          "caseType": { "type": "string" },
          "caseDate": { "type": "string" },
          "hearingDate": { "type": "string" },
          "lastActionDate": { "type": "string" },
          "reminderDate": { "type": "string" },
          "status": { "type": "string" },
          "notes": { "type": "string" },
          "tags": { "type": "array", "items": { "type": "string" } }
        },
        "required": ["title"]
      },
      "TaskInput": {
        "type": "object",
        "properties": {
          "caseId": { "type": "string" },
          "title": { "type": "string" },
          "assignee": { "type": "string" },
          "dueDate": { "type": "string" },
          "status": { "type": "string" }
        },
        "required": ["caseId", "title"]
      },
      "DeadlineInput": {
        "type": "object",
        "properties": {
          "caseId": { "type": "string" },
          "type": { "type": "string" },
          "description": { "type": "string" },
          "startDate": { "type": "string" },
          "daysAllowed": { "type": "integer", "nullable": true },
          "dueDate": { "type": "string" },
          "status": { "type": "string" },
          "note": { "type": "string" }
        },
        "required": ["caseId"]
      },
      "DocumentInput": {
        "type": "object",
        "properties": {
          "caseId": { "type": "string" },
          "title": { "type": "string" },
          "type": { "type": "string" },
          "fileName": { "type": "string" },
          "fileUrl": { "type": "string" },
          "fileSize": { "type": "integer" },
          "tags": { "type": "array", "items": { "type": "string" } },
          "signatureStatus": { "type": "string" },
          "uploadedAt": { "type": "string" }
        },
        "required": ["caseId", "title"]
      },
      "FinancialEntryInput": {
        "type": "object",
        "properties": {
          "caseId": { "type": "string" },
          "type": { "type": "string" },
          "amount": { "type": "number" },
          "date": { "type": "string" },
          "description": { "type": "string" },
          "receiptNo": { "type": "string" }
        },
        "required": ["caseId"]
      },
      "CommunicationInput": {
        "type": "object",
        "properties": {
          "caseId": { "type": "string" },
          "channel": { "type": "string" },
          "date": { "type": "string" },
          "author": { "type": "string" },
          "note": { "type": "string" }
        },
        "required": ["caseId"]
      },
      "LoginInput": {
        "type": "object",
        "properties": {
          "email": { "type": "string", "format": "email" },
          "password": { "type": "string" }
        },
        "required": ["email", "password"]
      },
      "ProfileInput": {
        "type": "object",
        "properties": {
          "name": { "type": "string" },
          "email": { "type": "string", "format": "email" },
          "firmName": { "type": "string" }
        },
        "required": ["name", "email"]
      },
      "ChangePasswordInput": {
        "type": "object",
        "properties": {
          "currentPassword": { "type": "string" },
          "newPassword": { "type": "string", "minLength": 8 }
        },
        "required": ["currentPassword", "newPassword"]
      }
    }
  },
  "security": [
    {
      "panelSession": []
    }
  ],
  "paths": {
    "/api/panel/auth/login": {
      "post": {
        "summary": "Login and create panel session",
        "security": [],
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/LoginInput" } } }
        },
        "responses": { "200": { "description": "Authenticated user and panel_token cookie" }, "400": { "description": "Missing fields" }, "401": { "description": "Invalid credentials" } }
      }
    },
    "/api/panel/auth/logout": {
      "post": {
        "summary": "Logout and clear panel session",
        "responses": { "200": { "description": "Session cleared" } }
      }
    },
    "/api/panel/auth/me": {
      "get": {
        "summary": "Get current user",
        "responses": { "200": { "description": "Current user or null" } }
      },
      "put": {
        "summary": "Update current user profile",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ProfileInput" } } }
        },
        "responses": { "200": { "description": "Updated user" }, "401": { "description": "Unauthorized" } }
      }
    },
    "/api/panel/auth/change-password": {
      "post": {
        "summary": "Change current user password",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ChangePasswordInput" } } }
        },
        "responses": { "200": { "description": "Password changed" }, "400": { "description": "Validation error" }, "401": { "description": "Unauthorized" } }
      }
    },
    "/api/panel/clients": {
      "get": { "summary": "List clients", "responses": { "200": { "description": "Client list" }, "401": { "description": "Unauthorized" } } },
      "post": {
        "summary": "Create client",
        "requestBody": {
          "required": true,
          "content": { "application/json": { "schema": { "$ref": "#/components/schemas/ClientInput" } } }
        },
        "responses": { "201": { "description": "Created client" }, "400": { "description": "Validation error" }, "401": { "description": "Unauthorized" } }
      }
    },
    "/api/panel/clients/{id}": {
      "put": { "summary": "Update client", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Updated client" }, "404": { "description": "Not found" } } },
      "delete": { "summary": "Delete client", "parameters": [{ "name": "id", "in": "path", "required": true, "schema": { "type": "string" } }], "responses": { "200": { "description": "Deleted" }, "404": { "description": "Not found" } } }
    },
    "/api/panel/cases": {
      "get": { "summary": "List cases", "responses": { "200": { "description": "Case list" } } },
      "post": { "summary": "Create case", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CaseInput" } } } }, "responses": { "201": { "description": "Created case" } } }
    },
    "/api/panel/tasks": {
      "get": { "summary": "List tasks", "responses": { "200": { "description": "Task list" } } },
      "post": { "summary": "Create task", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/TaskInput" } } } }, "responses": { "201": { "description": "Created task" } } }
    },
    "/api/panel/deadlines": {
      "get": { "summary": "List deadlines", "responses": { "200": { "description": "Deadline list" } } },
      "post": { "summary": "Create deadline", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DeadlineInput" } } } }, "responses": { "201": { "description": "Created deadline" } } }
    },
    "/api/panel/documents": {
      "get": { "summary": "List documents", "responses": { "200": { "description": "Document list" } } },
      "post": { "summary": "Create document metadata", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/DocumentInput" } } } }, "responses": { "201": { "description": "Created document" } } }
    },
    "/api/panel/finance": {
      "get": { "summary": "List financial entries", "responses": { "200": { "description": "Financial entry list" } } },
      "post": { "summary": "Create financial entry", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/FinancialEntryInput" } } } }, "responses": { "201": { "description": "Created financial entry" } } }
    },
    "/api/panel/communications": {
      "get": { "summary": "List communications", "responses": { "200": { "description": "Communication list" } } },
      "post": { "summary": "Create communication", "requestBody": { "required": true, "content": { "application/json": { "schema": { "$ref": "#/components/schemas/CommunicationInput" } } } }, "responses": { "201": { "description": "Created communication" } } }
    },
    "/api/panel/upload": {
      "post": {
        "summary": "Upload file",
        "requestBody": {
          "required": true,
          "content": {
            "multipart/form-data": {
              "schema": {
                "type": "object",
                "properties": {
                  "file": { "type": "string", "format": "binary" }
                },
                "required": ["file"]
              }
            }
          }
        },
        "responses": { "200": { "description": "Uploaded file URL" }, "400": { "description": "Invalid file" } }
      }
    }
  }
}
