"""YAML utilities"""

from __future__ import annotations

import typing

import yaml

from apispec.utils import dedent, trim_docstring


def dict_to_yaml(dic: dict, yaml_dump_kwargs: typing.Any | None = None) -> str:
    """Serializes a dictionary to YAML."""
    yaml_dump_kwargs = yaml_dump_kwargs or {}

    # By default, don't sort alphabetically to respect schema field ordering
    yaml_dump_kwargs.setdefault("sort_keys", False)
    return yaml.dump(dic, **yaml_dump_kwargs)


def load_yaml_from_docstring(docstring: str) -> dict:
    """Loads YAML from docstring."""
    split_lines = trim_docstring(docstring).split("\n")

    # Cut YAML from rest of docstring
    for index, line in enumerate(split_lines):
        line = line.strip()
        if line.startswith("---"):
            cut_from = index
            break
    else:
        return {}

    yaml_string = "\n".join(split_lines[cut_from:])
    yaml_string = dedent(yaml_string)
    return yaml.safe_load(yaml_string) or {}


PATH_KEYS = {"get", "put", "post", "delete", "options", "head", "patch"}


def load_operations_from_docstring(docstring: str) -> dict:
    """Return a dictionary of OpenAPI operations parsed from a
    a docstring.
    """
    doc_data = load_yaml_from_docstring(docstring)
    return {
        key: val
        for key, val in doc_data.items()
        if key in PATH_KEYS or key.startswith("x-")
    }
