import requests
import base64
import logging
from datetime import datetime
from flask import jsonify

class MpesaAPI:
    BASE_URL = "https://api.safaricom.co.ke"  # Live URL
    CONSUMER_KEY = "OfGC2410JaAGPRXjsSDeRPqV9DDEGqwvflsmnjfupR3LEKPo"
    CONSUMER_SECRET = "npo9WeHJEQ9vAt6eLmMLl60ubEpmoOOHRbsQTfxAqn5Q6ppFr8SFdDnfsG3Rp9pu"
    SHORTCODE = "4160337"
    PASSKEY = "24bc7367063b51cbfae01fc5c362c7abe6855bbb97826079be2b41f7835e6e48"
    CALLBACK_URL = "https://www.techcodesoftwaresolutions.co.ke/juakalienterprises/callback"

    @classmethod
    def get_token(cls):
        """Get OAuth Token for M-Pesa API."""
        url = f"{cls.BASE_URL}/oauth/v1/generate?grant_type=client_credentials"
        credentials = f"{cls.CONSUMER_KEY}:{cls.CONSUMER_SECRET}"
        encoded_credentials = base64.b64encode(credentials.encode()).decode()

        headers = {"Authorization": f"Basic {encoded_credentials}"}
        response = requests.get(url, headers=headers)

        if response.status_code == 200:
            token = response.json().get("access_token")
            logging.info(f"M-Pesa Access Token: {token}")  # Log the token
            return token
        else:
            logging.error(f"Failed to get M-Pesa token: {response.text}")  # Log the error response
            return None

    @classmethod
    def stk_push(cls, phone_number, amount):
        """Initiate STK Push Request."""
        access_token = cls.get_token()
        if not access_token:
            return {"error": "Failed to authenticate with M-Pesa."}

        timestamp = datetime.now().strftime("%Y%m%d%H%M%S")
        password = base64.b64encode(f"{cls.SHORTCODE}{cls.PASSKEY}{timestamp}".encode()).decode()

        url = f"{cls.BASE_URL}/mpesa/stkpush/v1/processrequest"
        headers = {
            "Authorization": f"Bearer {access_token}",
            "Content-Type": "application/json",
            "Accept": "application/json"
        }
        payload = {
            "BusinessShortCode": cls.SHORTCODE,
            "Password": password,
            "Timestamp": timestamp,
            "TransactionType": "CustomerPayBillOnline",
            "Amount": amount,
            "PartyA": phone_number,
            "PartyB": cls.SHORTCODE,
            "PhoneNumber": phone_number,
            "CallBackURL": cls.CALLBACK_URL,
            "AccountReference": "Deposit",
            "TransactionDesc": "Deposit to Wallet"
        }

        response = requests.post(url, json=payload, headers=headers)
        logging.info(f"STK Push Response: {response.json()}")  # Log response
        return response.json()
