# Copyright: (c) 2024, Luca Bilke <luca@bil.ke>
# MIT License (see LICENSE)

from __future__ import annotations

from typing import Any
import yaml
from pydantic import BaseModel, ConfigDict

from ansible.module_utils.basic import AnsibleModule


class Result(BaseModel):
    model_config = ConfigDict(frozen=True)

    changed: bool = False
    diff: dict[str, Any] = {}


class Settings(BaseModel):
    model_config = ConfigDict(frozen=True)

    projects_dir: str = "/usr/local/share/ez_compose/"


class State(BaseModel):
    model_config = ConfigDict(frozen=True)

    module: AnsibleModule
    result: Result
    settings: Settings
    compose_filename: str
    before: dict[str, Any] = {}
    after: dict[str, Any] = {}


def new_state(module: AnsibleModule) -> State:
    settings = Settings(**module.params["settings"])

    return State(
        module=module,
        result=Result(),
        settings=settings,
        compose_filename=(
            f"{settings.projects_dir}/"
            + f"{module.params['project_name']}/"
            + f"{module.params['name']}.yml"
        ),
    )


def get_compose(state: State) -> State:
    file = state.compose_filename

    with open(file, "r") as stream:
        compose = yaml.safe_load(stream)

    return state.model_copy(update={"before": compose})


def write_compose(state: State) -> State:
    file = state.compose_filename

    with open(file, mode="w") as stream:
        yaml.dump(state.after, stream)

    return state