import aiohttp
import asyncio
import time
from traceback import TracebackException
from types import TracebackType


groups="""hbues
elephantom
vaultech
truemedic"""


websites="""https://hbues.net
https://mail.hbues.net
https://uxmal.hbues.net
https://baizabal.xyz
https://bovedatecnologica.com
https://true-medic.com.mx"""

#basename="""https://gst.hbues.net"""

endpoints="""/info"""

basename = 'https://mail.hbues.net/api'
token = "api_cHl0aG9uOnl4Vll4Y0tRNEdRemhUT3hyeVduamQzbDF6NEpvSw=="

headers = {
  'Content-Type': 'application/json',
  "Authorization": f"Bearer {token}",
  'Accept': 'application/json'
}




class MailManagement:
    "Operations with owm mail server"
    def __init__(self) -> None:
        self._session = aiohttp.ClientSession()
        self._group = None
        self._url = None
        self._basename = None
        self._body = None
        self._headers = None
        self._json = False

    async def __aenter__(self) -> "AsyncRequest":
        return self

    async def __aexit__(
        self,
        exc_type: Exception,
        exc_val: TracebackException,
        traceback: TracebackType,
    ) -> None:
        await self.close()

    async def close(self) -> None:
        await self._session.close()


    @property
    def group(self):
        return self._group
    @group.setter
    def group(self,group:str=None):
        self._group = group

    @property
    def url(self):
        return self._url

    @url.setter
    def url(self,url:str=None):
        self._url = url

    @property
    def body(self):
        return self._body

    @body.setter
    def body(self,body:str=None):
        self._body = body

    @property
    def headers(self):
        return self._headers

    @headers.setter
    def headers(self,headers:str=None):
        self._headers = headers

    @property
    def basename(self):
        return self._basename

    @basename.setter
    def basename(self,basename:str=None):
        self._basename = basename

    @property
    def json(self):
        return self._json

    @json.setter
    def json(self,json:str=False):
        self._json = json

    async def __get(self) -> str:
        try:
            async with self._session.get(url=self._url,headers=self._headers) as response:
                if self._json is True:
                    return await response.json()
                else:
                    return await response.text()
        except Exception as e:
            return "Unable to get url {} due to {}.".format(self._url, e.__class__)


    async def __post(self) -> str:
        try:
            async with self._session.post(url=self._url,headers=self._headers,json=self._body) as response:
                if self._json is True:
                    #print(response.status)
                    return await response.json()
                else:
                    return await response.text()
        except Exception as e:
            print(e)





    async def get_mail_users(self) -> str:
    # NOTE Build principal url
        info = {}
        try:                                                                    
            self._url = f"{self._basename}/principal/{self._group}"
            result = await self.__get()

            info['users'] = result['data'].get("members")
            info['client'] = result['data'].get("description")
            info['clientname'] = result['data'].get('name')

            return info

        except Exception as e:
            print("Unable to get endpoint {} due to {}.".format(self._url, e.__class__))


    async def set_mail_user(self):
        pass        








async def main() -> None:

    async with MailManagement() as request:

        start = time.time()

        request.basename = basename
        request.headers = headers
        request.json = True
        groups = ['vaultech','truemedic']
        for group in groups:

            request.group = group
            users = await request.get_mail_users()
            print(users)
        end = time.time()

        



if __name__ == "__main__":

    asyncio.run(main())
