# (c) cavaliba.com  - data/api - asset.py

"""
/api/assets/: generic read/search endpoint over any Instance (by id, by
classname+keyname, or full-text search within a classname).

Method inventory: asset.
"""

from django.views.decorators.csrf import csrf_exempt

import app_data.api.helper as helper
from app_data.api.aaa import start_api
from app_data.data import Instance
from app_data.search import get_instance_from_query
from app_home.log import DEBUG, ERROR, log

# permission: MULTI


#  ----------------------------------------------------------------------------
# /api/assets/
# /<id>/
# /<skey>/<key>/
#  ----------------------------------------------------------------------------
@csrf_exempt
def asset(request, id=None, skey=None, key=None):
    """Return a single Instance (by id, or by classname+keyname) if read-permitted,
    else a paginated/searchable list of Instances within classname skey."""

    aaa_api = start_api(request)
    if not aaa_api["is_allowed"]:
        log(ERROR, aaa=aaa_api, app="api/asset", view="asset", action="GET", status="KO",
            data="denied")  # fmt: skip
        return helper.send_denied()

    search = request.GET.get("search", "")
    expand = helper.get_expand(request)
    refs = helper.get_refs(request)
    rev = helper.get_rev(request)
    fields = helper.get_field(request)

    log(DEBUG, aaa=aaa_api, app="api/asset", view="asset", action="GET", status="OK",
        data=f"id={id} schema={skey} key={key} search={search}")  # fmt: skip

    instance = None
    end = False

    # single by id
    if id:
        instance = Instance.from_id(id)
        end = True

    if skey and key:
        instance = Instance.from_keyname(skey, key)
        end = True

    if instance:
        if instance.has_read_permission(aaa_api):
            if expand:
                # field filter isn't supported by the ui_detail (PAGES) shape
                reply = instance.get_dict_for_ui_detail()
            else:
                reply = instance.get_dict_for_export(refs=refs, rev=rev, fields=fields)
            return helper.send_response(request, [reply], 200)
        else:
            log(ERROR, aaa=aaa_api, app="api/asset", view="asset", action="GET", status="KO",
                data=f"denied id={id} schema={skey} key={key}")  # fmt: skip
            return helper.send_denied()

    if end:
        log(ERROR, aaa=aaa_api, app="api/asset", view="asset", action="GET", status="KO",
            data=f"not found id={id} schema={skey} key={key}")  # fmt: skip
        return helper.send_not_found()

    # multi list / search
    reply = []

    page = helper.get_page(request)
    size = helper.get_size(request)
    instances = get_instance_from_query(query=search, classname=skey, page=page, size=size)

    if instances and len(instances) > 0:
        for iobj in instances:
            if expand:
                instance = Instance(iobj=iobj, expand=True)
                if instance:
                    if instance.has_read_permission(aaa_api):
                        reply.append(instance.get_dict_for_ui_detail())
            else:
                instance = Instance(iobj=iobj, expand=False)
                if instance:
                    if instance.has_read_permission(aaa_api):
                        reply.append(instance.get_dict_for_export(refs=refs, fields=fields))

    if len(reply) == 0:
        log(ERROR, aaa=aaa_api, app="api/asset", view="asset", action="GET", status="KO",
            data=f"no match schema={skey} search={search}")  # fmt: skip
        return helper.send_not_found()

    return helper.send_response(request, reply, 200)
