#!.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 fastapi.openapi.utils import get_openapi

from akkudoktoreos.server.eos import app


def generate_openapi() -> dict:
    """Generate the OpenAPI specification.

    Returns:
        openapi_spec (dict): OpenAPI specification.
    """
    openapi_spec = get_openapi(
        title=app.title,
        version=app.version,
        openapi_version=app.openapi_version,
        description=app.description,
        routes=app.routes,
    )

    # Fix file path for general settings to not show local/test file path
    general = openapi_spec["components"]["schemas"]["ConfigEOS"]["properties"]["general"]["default"]
    general["config_file_path"] = "/home/user/.config/net.akkudoktoreos.net/EOS.config.json"
    general["config_folder_path"] = "/home/user/.config/net.akkudoktoreos.net"

    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 os.name == "nt":
            openapi_spec_str = openapi_spec_str.replace("127.0.0.1", "0.0.0.0")
        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()
