from flask import Blueprint, request

from functions.Response import API_Error

webhooksV2 = Blueprint("webhooksV2", __name__)

import json
import traceback
from typing import Callable

from flask import Request, Response

from configs.firebase import SERVER_TIMESTAMP, db
from V2.functions.Users import main as Users
from V2.Params import Params, PublicParams

mimetype='application/json'
post_headers = {"Access-Control-Request-Methods": "POST, GET, OPTIONS, DELETE, PUT", "Access-Control-Request-Headers": "Content-Type, Authorization, x-uid, x-api-key,X-Api-Key, X-Uid", 'Access-Control-Allow-Origin': '*', "Content-Type":mimetype}


def webhookResponse(function: Callable[[PublicParams], dict | list], request: Request, id=None) -> Response:
    try:
        if request.method == "OPTIONS": return Response("", status=200, headers=post_headers, mimetype=mimetype)
        parameters = dict(request.args.to_dict())
        parameters.update(request.json if request.json else {})
        domainhostname = request.headers.get("domain-hostname")
        try: enterprise = Users.getEnterpriseByHostname(domainhostname)
        except: enterprise=None
        params = PublicParams(
            enterprise=enterprise,
            hostname=request.headers.get('domain-hostname', "https://app.riverr.app"),
            id=id if id else parameters.get('id'),
            args=parameters,
            headers=dict(request.headers)
        )
        data  = function(params)
        return Response(json.dumps(data, default=str), 200, post_headers, mimetype=mimetype)
    except API_Error as e:
        print(traceback.format_exc())
        return e.response()
    except Exception as e:
        print(traceback.format_exc())
        return Response(json.dumps(dict(status=500, message='Internal Server Error', meta={"error": str(e)})), status=500, headers=post_headers, mimetype=mimetype)


@webhooksV2.post("/<type>/<platformId>")
def stripeWebhook():
    return webhookResponse("Stripe", request)