"""This module contains utilities to support API links."""
from dynamic_rest.conf import settings
from dynamic_rest.routers import DynamicRouter


def merge_link_object(serializer, data, instance):
    """Add a 'links' attribute to the data that maps field names to URLs.

    NOTE: This is the format that Ember Data supports, but alternative
          implementations are possible to support other formats.
    """
    link_object = {}

    if not getattr(instance, "pk", None):
        # If instance doesn't have a `pk` field, we'll assume it doesn't
        # have a canonical resource URL to hang a link off of.
        # This generally only affects Ephemeral Objects.
        return data

    link_fields = serializer.get_link_fields()
    for name, field in link_fields.items():
        # For included fields, omit link if there's no data.
        if name in data and not data[name]:
            continue

        link = getattr(field, "link", None)
        if link is None:
            base_url = ""
            if settings.ENABLE_HOST_RELATIVE_LINKS:
                # if the resource isn't registered, this will default back to
                # using resource-relative urls for links.
                base_url = (
                    DynamicRouter.get_canonical_path(
                        serializer.get_resource_key(), instance.pk
                    )
                    or ""
                )
            link = f"{base_url}{name}/"
        # Default to DREST-generated relation endpoints.
        elif callable(link):
            link = link(name, field, data, instance)

        link_object[name] = link

    if link_object:
        data["links"] = link_object
    return data
