import requests

from configs.firebase import db
from functions.Response import API_Error
from functions.Shopify.Auth import apiVersion, createHeader
from functions.Shops import getShopById


def getPlan(planId):
    ref = db.document(f"plans/{planId}").get()
    return ref.to_dict()
def createRecurringCharge(params):
    shopId  = params.get("shopId")
    uid = params.get("currentUser").get("uid")
    shop =getShopById(shopId, True)
    headers = createHeader(shop.get("accessToken"))
    url = f'{shop.get("url")}/admin/api/{apiVersion}/recurring_application_charges.json'
    planId = params.get("planId")
    plan = getPlan(planId)
    hostname = params.get("hostname")
    data = {
        "recurring_application_charge":{
            "name":plan.get("name"),
            "price":plan.get("price"),
            "return_url":f"https://{hostname}/pricing"},
        }
    res = requests.post(url, headers=headers, json=data)
    if res.status_code == 201:
        charge = res.json().get("recurring_application_charge")
        charge['shopId'] = shopId
        charge['planId'] = planId
        charge['uid'] = uid
        saveCharge(charge)
        return res.json()
    raise API_Error(res.text, res.status_code)
    
def saveCharge(charge): 
    db.document(f"shopifyCharges/{charge.get('id')}").set(charge, merge=True)

def confirmCharge(params):
    chargeId = params.get("chargeId")
    charge = db.document(f"shopifyCharges/{chargeId}").get().to_dict()
    if not charge: raise API_Error("Charge not found.")
    uid = charge.get("uid")
    planId = charge.get("planId")
    shopId  = charge.get("shopId")
    shop = getShopById(shopId, True)
    url = f"{shop.get('url')}/admin/api/{apiVersion}/recurring_application_charges/{chargeId}.json"
    headers = createHeader(shop.get('accessToken'))
    res = requests.get(url, headers=headers)
    if res.status_code == 200:
        newCharge = res.json().get("recurring_application_charge")
        if newCharge.get("status") == "active":
            db.document(f"users/{uid}").update({
                "planId": planId,
                "subscriptionId": chargeId,
                "subscriptionProvider": "SHOPIFY"
            })
            saveCharge(newCharge)
            return dict(chargeId=chargeId, message="User upgraded.")
        raise  API_Error(f"Payment is still {newCharge.get('status')}", 400)
    raise API_Error(res.text, res.status_code)