"""
Methods for the orgs namespace

https://docs.github.com/en/rest/reference/orgs
"""

from __future__ import annotations

from typing import Any, Dict

from ..const import GitHubRequestKwarg, HttpMethod
from ..models.organization import (
    GitHubOrganizationMinimalModel,
    GitHubOrganizationModel,
)
from ..models.response import GitHubResponseModel
from .base import BaseNamespace
from .projects import GitHubOrganizationProjectsNamespace


class GitHubOrgsNamespace(BaseNamespace):
    """Methods for the orgs namespace"""

    def __post_init__(self) -> None:
        self._projects = GitHubOrganizationProjectsNamespace(self._client)

    @property
    def projects(self) -> GitHubOrganizationProjectsNamespace:
        """Property to access the users projects namespace"""
        return self._projects

    async def list(
        self,
        **kwargs: Dict[GitHubRequestKwarg, Any],
    ) -> GitHubResponseModel[list[GitHubOrganizationMinimalModel]]:
        """
         List organizations


        https://docs.github.com/en/rest/reference/orgs#list-organizations
        """
        response = await self._client.async_call_api(
            endpoint="/organizations",
            **kwargs,
        )
        response.data = [GitHubOrganizationMinimalModel(org) for org in response.data or []]
        return response

    async def get(
        self,
        org: str,
        **kwargs: Dict[GitHubRequestKwarg, Any],
    ) -> GitHubResponseModel[GitHubOrganizationModel]:
        """
         Get a organization

         **Arguments**:

         `org`

         The organization to return, example "octocat"

        https://docs.github.com/en/rest/reference/orgs#get-an-organization
        """
        response = await self._client.async_call_api(
            endpoint=f"/orgs/{org}",
            **kwargs,
        )
        response.data = GitHubOrganizationModel(response.data)
        return response

    async def update(
        self,
        org: str,
        data: dict[str, Any],
        **kwargs: Dict[GitHubRequestKwarg, Any],
    ) -> GitHubResponseModel[GitHubOrganizationModel]:
        """
         Update an organization

         **Arguments**:

         `org`

         The organization to update, example "octocat"

         `data`

         A dictionary of data to update.

        https://docs.github.com/en/rest/reference/orgs#update-an-organization
        """
        response = await self._client.async_call_api(
            endpoint=f"/orgs/{org}",
            data=data,
            method=HttpMethod.PATCH,
            **kwargs,
        )
        response.data = GitHubOrganizationModel(response.data)
        return response
