#!.venv/bin/python
"""This module generates the OpenAPI specification for the EOS application  defined in `akkudoktoreos.server.eos`.

The script can be executed directly to generate the OpenAPI specification
either to the standard output or to a specified file.

Usage:
    scripts/generate_openapi.py [--output-file OUTPUT_FILE]

Arguments:
    --output-file : Optional. The file path to write the OpenAPI specification to.

Example:
    scripts/generate_openapi.py --output-file openapi.json
"""

import argparse
import json
import os
import sys
from pathlib import Path

# Add the src directory to sys.path so import akkudoktoreos works in all cases
PROJECT_ROOT = Path(__file__).parent.parent
SRC_DIR = PROJECT_ROOT / "src"
sys.path.insert(0, str(SRC_DIR))

from akkudoktoreos.core.coreabc import get_config
from akkudoktoreos.server.eos import app


def generate_openapi() -> dict:
    # Make minimal config to make the generation reproducable
    config_eos = get_config(init={
            "with_init_settings": True,
            "with_env_settings": False,
            "with_dotenv_settings": False,
            "with_file_settings": False,
            "with_file_secret_settings": False,
        })

    openapi_spec = app.openapi()

    config_schema = (
        openapi_spec
        .get("components", {})
        .get("schemas", {})
        .get("ConfigEOS", {})
        .get("properties", {})
    )

    # ---- General settings ----
    general = config_schema.get("general", {}).get("default")
    if general:
        general.update({
            "config_file_path": "/home/user/.config/net.akkudoktoreos.net/EOS.config.json",
            "config_folder_path": "/home/user/.config/net.akkudoktoreos.net",
            "data_folder_path": "/home/user/.local/share/net.akkudoktoreos.net",
            "data_output_path": "/home/user/.local/share/net.akkudoktoreos.net/output",
        })

    # ---- Logging settings ----
    logging_cfg = config_schema.get("logging", {}).get("default")
    if logging_cfg:
        logging_cfg["file_path"] = "/home/user/.local/share/net.akkudoktoreos.net/output/eos.log"

    return openapi_spec


def main():
    """Main function to run the generation of the OpenAPI specification."""
    parser = argparse.ArgumentParser(description="Generate OpenAPI Specification")
    parser.add_argument(
        "--output-file", type=str, default=None, help="File to write the OpenAPI Specification to"
    )

    args = parser.parse_args()

    try:
        openapi_spec = generate_openapi()
        openapi_spec_str = json.dumps(openapi_spec, indent=2)
        if args.output_file:
            # Write to file
            with open(args.output_file, "w", encoding="utf-8", newline="\n") as f:
                f.write(openapi_spec_str)
        else:
            # Write to std output
            print(openapi_spec_str)

    except Exception as e:
        print(f"Error during OpenAPI specification generation: {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == "__main__":
    main()
