import json
import logging

import requests
from django.conf import settings
from paytmchecksum import PaytmChecksum

from app.api import api
from app.api.api_accessor import APIAccessor
from app.util import util

log = logging.getLogger(__name__)


class PaytmAccessor(APIAccessor):
    CREATE_ORDER_URL = settings.PAYTM_HOST + "/theia/api/v1/initiateTransaction?mid={}&orderId={}"

    @classmethod
    def create_order(cls, amount, order_id, hashed_user_id, redirect_url):
        paytm_params = dict()

        paytm_params["body"] = {
            "requestType": "Payment",
            "mid": settings.PAYTM_MERCHANT_MID,
            "websiteName": settings.PAYTM_WEBSITE_HOME,
            "orderId": order_id,
            "callbackUrl": redirect_url,
            "txnAmount": {
                "value": str(amount),
                "currency": "INR",
            },
            "userInfo": {
                "custId": hashed_user_id,
            },
        }

        checksum = PaytmChecksum.generateSignature(json.dumps(paytm_params["body"]), settings.PAYTM_MERCHANT_KEY)

        paytm_params["head"] = {
            "signature": checksum
        }

        post_data = json.dumps(paytm_params)
        status, response = cls.request(
            requests.request, method="post", url=PaytmAccessor.CREATE_ORDER_URL.format(
                settings.PAYTM_MERCHANT_MID, order_id), data=post_data,
            headers={"Content-type": "application/json"})
        
        if not util.is_status_failed(status):
            if response.get("body", {}).get("resultInfo", {}).get("resultStatus") != 'S':
                return api.UNABLE_TO_GENERATE_PAYMENT_LINK, None

            return api.SUCCESS, response

        return api.UNABLE_TO_GENERATE_PAYMENT_LINK, None

    @staticmethod
    def get_payment_context(order_id, txn_token, amount, redirect_url):
        return {
            "order_id": order_id,
            "txn_token": txn_token,
            "amount": amount,
            "mid": settings.PAYTM_MERCHANT_MID,
            "host": settings.PAYTM_HOST,
            "redirect_url": redirect_url
        }
