"""Platform Standard v1 entrypoint for the generic QR service."""
from __future__ import annotations
from flask import Response
from bridge_platform.apps.contracts import ActionContract, AppManifest, WordPressPackageContract
from bridge_platform.apps.envelopes import error_envelope, success_envelope
from .service import QRService, QRServiceError

OBJ={"type":"object"}; OUT={"type":"object","required":["qr_id","status"]}
def action(capability,description,*,side=False,key=False,required=("qr_id","status"),classification="confidential"):
    return ActionContract(capability=capability,description=description,input_schema=OBJ,output_schema={"type":"object","required":list(required)},side_effects=side,idempotent=not key,idempotency_key_required=key,data_classification=classification,errors=("invalid_input","permission_denied","qr_not_found"))

APP_MANIFEST=AppManifest(app_id="qr_service",display_name="QR Service",app_version="1.0.0",description="Generic tenant-aware QR lifecycle, policy and secure resolution service.",actions={
    "health_v1":ActionContract(capability="platform.health",description="Report QR service health.",output_schema={"type":"object","required":["healthy","service"]}),
    "create_qr_v1":action("qr.record.create","Create a generic QR record.",side=True,key=True),
    "activate_qr_v1":action("qr.record.activate","Activate a draft QR.",side=True),
    "suspend_qr_v1":action("qr.record.suspend","Suspend an active QR.",side=True),
    "reactivate_qr_v1":action("qr.record.reactivate","Reactivate a suspended QR.",side=True),
    "revoke_qr_v1":action("qr.record.revoke","Irreversibly revoke a QR.",side=True,key=True),
    "regenerate_qr_v1":action("qr.record.regenerate","Replace a QR with a new token and record.",side=True,key=True,required=("old_qr_id","new_qr")),
    "get_qr_v1":action("qr.record.read","Read one QR record."),
    "list_qrs_v1":action("qr.record.list","List tenant-isolated QR records.",required=("items","limit")),
    "list_resource_qrs_v1":action("qr.resource.list","List QR records for one opaque resource.",required=("items","limit")),
    "render_qr_v1":action("qr.render","Render an authorized QR as PNG or SVG.",required=("qr_id","format","content_type","filename","content_base64")),
    "update_qr_policy_v1":action("qr.policy.update","Update mutable policy fields on a non-terminal QR.",side=True),
    "begin_resolution_v1":action("qr.resolution.begin","Begin secure QR resolution.",side=True,required=("resolution_id","resolution_token","status","expires_at")),
    "continue_resolution_v1":action("qr.resolution.continue","Continue delegated authenticated resolution.",side=True,required=("resolution_id","status","expires_at")),
    "complete_authenticated_resolution_v1":action("qr.resolution.authentication.complete","Complete delegated authenticated resolution.",side=True,required=("resolution_id","status","expires_at")),
    "get_resolution_status_v1":action("qr.resolution.status.read","Read opaque resolution status.",required=("resolution_id","status","expires_at")),
    "consume_resolution_v1":action("qr.resolution.consume","Consume an owner-app resolution context once.",side=True,key=True,required=("resolution_id","owner_app","resource_type","resource_reference","consumed_at")),
    "get_qr_audit_v1":action("qr.audit.read","Read sanitized QR audit history.",required=("items",)),
    "configure_permission_v1":action("qr.permission.configure","Configure tenant app QR permissions.",side=True,required=("requesting_app","enabled")),
},wordpress_package=WordPressPackageContract(package_id="qr_service_wp",version="1.0.0-dev",source_directory="wordpress-pack/qr-service-wp",entrypoint="qr-service-wp.php",plugin_file="qr-service-wp/qr-service-wp.php",capabilities=("qr.record.create","qr.record.read","qr.record.list","qr.render","qr.record.revoke","qr.record.regenerate","qr.resolution.status.read")))

def handle_request(context,action):
    request_id=str((context or {}).get("request_id") or ""); payload=(context or {}).get("payload") or {}; svc=QRService()
    try:
        if action=="health_v1": data={"healthy":True,"service":"qr_service"}
        elif action=="create_qr_v1": data=svc.create(context,payload)
        elif action=="get_qr_v1": data=svc.get(context,str(payload.get("qr_id") or ""))
        elif action in {"list_qrs_v1","list_resource_qrs_v1"}: data=svc.list(context,payload)
        elif action=="render_qr_v1": data=svc.render(context,payload)
        elif action=="update_qr_policy_v1": data=svc.update_policy(context,payload)
        elif action=="activate_qr_v1": data=svc.transition(context,str(payload.get("qr_id") or ""),"active")
        elif action=="suspend_qr_v1": data=svc.transition(context,str(payload.get("qr_id") or ""),"suspended")
        elif action=="reactivate_qr_v1": data=svc.transition(context,str(payload.get("qr_id") or ""),"active")
        elif action=="revoke_qr_v1": data=svc.revoke(context,payload)
        elif action=="regenerate_qr_v1": data=svc.regenerate(context,payload)
        elif action=="begin_resolution_v1": data=svc.begin(context,payload)
        elif action in {"continue_resolution_v1","complete_authenticated_resolution_v1"}: data=svc.continue_resolution(context,payload)
        elif action=="get_resolution_status_v1": data=svc.status(context,payload)
        elif action=="consume_resolution_v1": data=svc.consume_resolution(context,payload)
        elif action=="get_qr_audit_v1": data=svc.audit(context,str(payload.get("qr_id") or ""))
        elif action=="configure_permission_v1": data=svc.configure_permission(context,payload)
        else:return error_envelope(app_id="qr_service",action=action,request_id=request_id,code="action_not_found",message="The requested action is not supported."),404
        return success_envelope(app_id="qr_service",action=action,request_id=request_id,data=data)
    except QRServiceError as exc:return error_envelope(app_id="qr_service",action=action,request_id=request_id,code=exc.code,message=str(exc)),exc.status

def register_qr_service(app):
    from flask import jsonify, request
    @app.route("/q/<token>",methods=["GET","POST"])
    def public_qr(token):
        context={"tenant":{},"request_id":request.headers.get("X-Request-ID",""),"requesting_app":"public","remote_addr":request.remote_addr}
        try:data=QRService().begin(context,{"token":token,"recipient":(request.get_json(silent=True) or {}).get("recipient")},public=True); response=jsonify({"status":"ok","data":data})
        except QRServiceError as exc:response=jsonify({"status":"error","message":"This QR code is invalid or no longer available."});response.status_code=exc.status
        response.headers.update({"Cache-Control":"no-store, private","X-Frame-Options":"DENY","X-Content-Type-Options":"nosniff","Referrer-Policy":"no-referrer"});return response
