"""API documentation routes for AgentForms.

Serves the interactive API documentation page at /api/docs.
"""
from flask import Blueprint, render_template, jsonify, request
import json
import os

APP_URL = os.environ.get("APP_URL", "https://agentforms.io")

api_docs_bp = Blueprint("api_docs", __name__, url_prefix="/api/docs")


@api_docs_bp.route("/")
def docs_index():
    """GET /api/docs/ — API documentation page."""
    return render_template("api_docs.html")


@api_docs_bp.route("/openapi.json")
def openapi_spec():
    """GET /api/docs/openapi.json — OpenAPI 3.0 specification."""
    spec = {
        "openapi": "3.0.3",
        "info": {
            "title": "AgentForms API",
            "description": "RESTful API for building, managing, and embedding forms. Submit data, retrieve submissions, manage forms, email templates, and campaigns.",
            "version": "2.0.0",
            "contact": {
                "name": "AgentForms Support",
                "url": f"{APP_URL}/support",
                "email": "agentforms@protonmail.com"
            }
        },
        "servers": [
            {"url": APP_URL, "description": "Production"},
            {"url": "http://localhost:5060", "description": "Local Development"}
        ],
        "components": {
            "securitySchemes": {
                "ApiKeyAuth": {
                    "type": "apiKey",
                    "in": "header",
                    "name": "Authorization",
                },
                "BearerAuth": {
                    "type": "http",
                    "scheme": "bearer"
                }
            }
        },
        "paths": {
            "/api/submit": {
                "post": {
                    "summary": "Submit form data (public)",
                    "tags": ["Submissions"],
                    "parameters": [
                        {"name": "token", "in": "query", "required": True, "schema": {"type": "string"}, "description": "Form token"}
                    ],
                    "requestBody": {
                        "required": True,
                        "content": {
                            "application/json": {
                                "schema": {
                                    "type": "object",
                                    "additionalProperties": True
                                }
                            }
                        }
                    },
                    "responses": {
                        "200": {"description": "Submission created"},
                        "400": {"description": "Validation error"}
                    }
                }
            },
            "/api/v2/forms": {
                "get": {
                    "summary": "List forms",
                    "tags": ["Forms"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "200": {"description": "List of forms"},
                        "401": {"description": "Unauthorized"}
                    }
                },
                "post": {
                    "summary": "Create form",
                    "tags": ["Forms"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "201": {"description": "Form created"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/forms/{formToken}": {
                "get": {
                    "summary": "Get form details",
                    "tags": ["Forms"],
                    "security": [{"ApiKeyAuth": []}],
                    "parameters": [
                        {"name": "formToken", "in": "path", "required": True, "schema": {"type": "string"}}
                    ],
                    "responses": {
                        "200": {"description": "Form data"},
                        "404": {"description": "Not found"}
                    }
                }
            },
            "/api/v2/forms/{formToken}/config": {
                "get": {
                    "summary": "Get form configuration",
                    "tags": ["Forms"],
                    "security": [{"ApiKeyAuth": []}],
                    "parameters": [
                        {"name": "formToken", "in": "path", "required": True, "schema": {"type": "string"}}
                    ],
                    "responses": {
                        "200": {"description": "Form config"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/forms/{formToken}/submissions": {
                "get": {
                    "summary": "List submissions",
                    "tags": ["Submissions"],
                    "security": [{"ApiKeyAuth": []}],
                    "parameters": [
                        {"name": "formToken", "in": "path", "required": True, "schema": {"type": "string"}},
                        {"name": "limit", "in": "query", "schema": {"type": "integer", "default": 50}},
                        {"name": "offset", "in": "query", "schema": {"type": "integer", "default": 0}}
                    ],
                    "responses": {
                        "200": {"description": "List of submissions"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/forms/{formToken}/submissions/{subId}": {
                "get": {
                    "summary": "Get submission",
                    "tags": ["Submissions"],
                    "security": [{"ApiKeyAuth": []}],
                    "parameters": [
                        {"name": "formToken", "in": "path", "required": True, "schema": {"type": "string"}},
                        {"name": "subId", "in": "path", "required": True, "schema": {"type": "integer"}}
                    ],
                    "responses": {
                        "200": {"description": "Submission data"},
                        "404": {"description": "Not found"}
                    }
                }
            },
            "/api/v2/forms/{formToken}/analytics": {
                "get": {
                    "summary": "Form analytics",
                    "tags": ["Analytics"],
                    "security": [{"ApiKeyAuth": []}],
                    "parameters": [
                        {"name": "formToken", "in": "path", "required": True, "schema": {"type": "string"}}
                    ],
                    "responses": {
                        "200": {"description": "Analytics data"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/forms/{formToken}/fields": {
                "put": {
                    "summary": "Update form fields",
                    "tags": ["Forms"],
                    "security": [{"ApiKeyAuth": []}],
                    "parameters": [
                        {"name": "formToken", "in": "path", "required": True, "schema": {"type": "string"}}
                    ],
                    "responses": {
                        "200": {"description": "Fields updated"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/templates": {
                "get": {
                    "summary": "List templates",
                    "tags": ["Templates"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "200": {"description": "List of templates"},
                        "401": {"description": "Unauthorized"}
                    }
                },
                "post": {
                    "summary": "Create template",
                    "tags": ["Templates"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "201": {"description": "Template created"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/templates/render": {
                "post": {
                    "summary": "Render template",
                    "tags": ["Templates"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "200": {"description": "Rendered template"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/email/send": {
                "post": {
                    "summary": "Send email",
                    "tags": ["Email"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "200": {"description": "Email sent"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/campaigns": {
                "get": {
                    "summary": "List campaigns",
                    "tags": ["Campaigns"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "200": {"description": "List of campaigns"},
                        "401": {"description": "Unauthorized"}
                    }
                },
                "post": {
                    "summary": "Create campaign",
                    "tags": ["Campaigns"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "201": {"description": "Campaign created"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/api/v2/keys": {
                "get": {
                    "summary": "List API keys",
                    "tags": ["Keys"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "200": {"description": "List of API keys"},
                        "401": {"description": "Unauthorized"}
                    }
                },
                "post": {
                    "summary": "Create API key",
                    "tags": ["Keys"],
                    "security": [{"ApiKeyAuth": []}],
                    "responses": {
                        "201": {"description": "Key created"},
                        "401": {"description": "Unauthorized"}
                    }
                }
            },
            "/health": {
                "get": {
                    "summary": "Health check",
                    "tags": ["System"],
                    "responses": {
                        "200": {"description": "Service healthy"}
                    }
                }
            },
            "/health/ready": {
                "get": {
                    "summary": "Readiness check",
                    "tags": ["System"],
                    "responses": {
                        "200": {"description": "Service ready"}
                    }
                }
            }
        }
    }
    return jsonify(spec)


@api_docs_bp.route("/try", methods=["POST"])
def try_endpoint():
    """POST /api/docs/try — Test API endpoint."""
    data = request.get_json()
    if not data:
        return jsonify({"error": "Request body required"}), 400
    
    endpoint = data.get("endpoint")
    method = data.get("method", "GET")
    
    return jsonify({
        "message": "This is a test endpoint. In production, you would test actual API calls here.",
        "endpoint": endpoint,
        "method": method
    })
