from idem_vra.helpers.mapper import add_properties
from idem_vra.helpers.mapper import omit_properties
from idem_vra.helpers.models import StateReturn
__contracts__ = ["resource"]
TREQ = {"present": {"require": ["vra.iaas.project.present"]}, "absent": {"require": []}}
[docs]async def present(hub, ctx, name: str, **kwargs):
    """
    :param string apiVersion: (optional in query) The version of the API in yyyy-MM-dd format (UTC). If you do not
      specify explicitly an exact version, you will be calling the latest
      supported API version.
    :param string chargeModel: (optional in body)
    :param string createdAt: (optional in body)
    :param string createdBy: (optional in body)
    :param string description: (optional in body)
    :param Any fixedPrice: (optional in body)
    :param string id: (optional in body)
    :param string lastUpdatedAt: (optional in body)
    :param array meteringItems: (optional in body)
    :param string name: (optional in body)
    :param array namedMeteringItems: (optional in body)
    :param array oneTimeMeteringItems: (optional in body)
    :param string orgId: (optional in body)
    :param Any pricingCardAssignmentInfo: (optional in body)
    :param array tagBasedMeteringItems: (optional in body)
    :param array tagBasedOneTimeMeteringItems: (optional in body)
    :param array tagBasedRateFactorItems: (optional in body)
    """
    try:
        state = PricingcardsState(hub, ctx)
        return await state.present(hub, ctx, name, **kwargs)
    except Exception as error:
        hub.log.error("Error during enforcing present state: pricingcards")
        hub.log.error(str(error))
        raise error 
[docs]async def absent(hub, ctx, name: str, **kwargs):
    """
    :param string p_id: (required in path) pricing card Id
    :param string apiVersion: (optional in query) The version of the API in yyyy-MM-dd format (UTC). If you do not
      specify explicitly an exact version, you will be calling the latest
      supported API version.
    """
    """
    :param string name: (required) name of the resource
    """
    try:
        state = PricingcardsState(hub, ctx)
        return await state.absent(hub, ctx, name, **kwargs)
    except Exception as error:
        hub.log.error("Error during enforcing absent state: pricingcards")
        hub.log.error(str(error))
        raise error 
[docs]async def describe(hub, ctx):
    try:
        state = PricingcardsState(hub, ctx)
        return await state.describe(hub, ctx)
    except Exception as error:
        hub.log.error("Error during describe: pricingcards")
        hub.log.error(str(error))
        raise error 
[docs]def is_pending(hub, ret: dict, state: str = None, **pending_kwargs):
    try:
        state = PricingcardsState(hub, None)
        return state.is_pending(hub, ret, state, **pending_kwargs)
    except Exception as error:
        hub.log.error("Error during is_pending: pricingcards")
        hub.log.error(str(error))
        raise error 
[docs]class PricingcardsState:
    def __init__(self, hub, ctx):
        self.hub = hub
        self.ctx = ctx
[docs]    async def present(self, hub, ctx, name: str, **kwargs):
        search_result = (await self.paginate_find(hub, ctx))["ret"]
        for s in search_result.content:
            if name == s["name"] and True:
                hub.log.info(
                    f'Returning resource pricingcards "{s["name"]}" due to existing resource "{name}"'
                )
                s = await self.remap_resource_structure(hub, ctx, s)
                return StateReturn(
                    result=True,
                    comment=f"Resource pricingcards {name} already exists.",
                    old=s,
                    new=s,
                )
        kwargs["name"] = name
        res = (
            await hub.exec.vra.catalog.pricingcards.create_policy_using_post2(
                ctx, **kwargs
            )
        )["ret"]
        res = await self.remap_resource_structure(hub, ctx, res)
        return StateReturn(
            result=True,
            comment=f"Creation of pricingcards {name} success.",
            old=None,
            new=res,
        ) 
[docs]    async def absent(self, hub, ctx, name: str, **kwargs):
        search_result = (await self.paginate_find(hub, ctx))["ret"]
        resource = None
        for s in search_result.content:
            if name == s["name"] and True:
                hub.log.info(
                    f'Found resource pricingcards "{s["name"]}" due to existing resource "{name}"'
                )
                s = await self.remap_resource_structure(hub, ctx, s)
                resource = s
        if resource:
            # it exists!
            delete_kwargs = {}
            delete_kwargs["p_id"] = resource.get("id")
            hub.log.debug(
                f"pricingcards with name = {resource.get('name')} already exists"
            )
            await hub.exec.vra.catalog.pricingcards.delete_policy_using_delete4(
                ctx, **delete_kwargs
            )
            return StateReturn(
                result=True,
                comment=f"Resource with name = {resource.get('name')} deleted.",
                old=resource,
                new=None,
            )
        return StateReturn(
            result=True,
            comment=f"Resource with name = {name} is already absent.",
            old=None,
            new=None,
        ) 
[docs]    async def describe(self, hub, ctx):
        result = {}
        res = await self.paginate_find(hub, ctx)
        for obj in res.get("ret", {}).get("content", []):
            # Keep track of name and id properties as they may get remapped
            obj_name = obj.get("name", "unknown")
            obj_id = obj.get("id", "unknown")
            obj = await self.remap_resource_structure(hub, ctx, obj)
            # Define props
            props = [{key: value} for key, value in obj.items()]
            # Build result
            result[f"{obj_name}-{obj_id.split('-')[-1]}"] = {
                "vra.catalog.pricingcards.present": props
            }
        return result 
[docs]    async def paginate_find(self, hub, ctx, **kwargs):
        """
        Paginate through all resources using their 'find' method.
        """
        res = await hub.exec.vra.catalog.pricingcards.get_policies_using_get4(
            ctx, **kwargs
        )
        numberOfElements = res.get("ret", {}).get("numberOfElements", 0)
        totalElements = res.get("ret", {}).get("totalElements", 0)
        initialElements = numberOfElements
        if numberOfElements != totalElements and totalElements != 0:
            while initialElements < totalElements:
                hub.log.debug(
                    f"Requesting pricingcards with offset={initialElements} out of {totalElements}"
                )
                pres = await hub.exec.vra.catalog.pricingcards.get_policies_using_get4(
                    ctx, skip=initialElements
                )
                initialElements += pres.get("ret", {}).get("numberOfElements", 0)
                aggO = res.get("ret", {}).get("content", [])
                aggN = pres.get("ret", {}).get("content", [])
                res["ret"]["content"] = [*aggO, *aggN]
                res["ret"]["numberOfElements"] = initialElements
        return res 
[docs]    def is_pending(self, hub, ret: dict, state: str = None, **pending_kwargs):
        """
        State reconciliation
        """
        hub.log.debug(f'Running is_pending for resource: {ret.get("__id__", None)}...')
        is_pending_result = False
        hub.log.debug(
            f'is_pending_result for resource "{ret.get("__id__", None)}": {is_pending_result}'
        )
        return is_pending_result 
[docs]    async def remap_resource_structure(self, hub, ctx, obj: dict) -> dict:
        schema_mapper = {"add": [], "omit": ["createdBy", "lastUpdatedAt", "orgId"]}
        # Perform resource mapping by adding properties and omitting properties.
        # Property renaming is addition followed by omission.
        if schema_mapper:
            resource_name = "pricingcards"
            hub.log.debug(f"Remapping resource {resource_name}...")
            obj = await add_properties(obj, schema_mapper.get("add", []))
            obj = omit_properties(obj, schema_mapper.get("omit", []))
        return obj