import requests
import base64
from datetime import datetime
from django.conf import settings


class MpesaClient:

    @property
    def base_url(self):
        if settings.MPESA_ENVIRONMENT == 'production':
            return 'https://api.safaricom.co.ke'
        return 'https://sandbox.safaricom.co.ke'

    def get_access_token(self):
        url = f"{self.base_url}/oauth/v1/generate?grant_type=client_credentials"
        credentials = base64.b64encode(
            f"{settings.MPESA_CONSUMER_KEY}:{settings.MPESA_CONSUMER_SECRET}".encode()
        ).decode()
        response = requests.get(
            url, headers={'Authorization': f'Basic {credentials}'}
        )
        return response.json().get('access_token')

    def get_password(self, timestamp):
        raw = f"{settings.MPESA_SHORTCODE}{settings.MPESA_PASSKEY}{timestamp}"
        return base64.b64encode(raw.encode()).decode()

    def stk_push(self, phone, amount, member_id, contribution_type):
        token = self.get_access_token()
        timestamp = datetime.now().strftime('%Y%m%d%H%M%S')

        # Format phone — ensure it starts with 254
        phone = phone.strip().replace('+', '')
        if phone.startswith('0'):
            phone = '254' + phone[1:]

        payload = {
            "BusinessShortCode": settings.MPESA_SHORTCODE,
            "Password": self.get_password(timestamp),
            "Timestamp": timestamp,
            "TransactionType": "CustomerPayBillOnline",
            "Amount": int(amount),
            "PartyA": phone,
            "PartyB": settings.MPESA_SHORTCODE,
            "PhoneNumber": phone,
            "CallBackURL": f"{settings.MPESA_CALLBACK_URL}/api/v1/finance/mpesa/stk-callback/",
            "AccountReference": f"CFC-{member_id}",
            "TransactionDesc": f"Church contribution - {contribution_type}",
        }

        response = requests.post(
            f"{self.base_url}/mpesa/stkpush/v1/processrequest",
            json=payload,
            headers={'Authorization': f'Bearer {token}'},
        )
        return response.json()

    def register_c2b_urls(self):
        token = self.get_access_token()
        payload = {
            "ShortCode": settings.MPESA_SHORTCODE,
            "ResponseType": "Completed",
            "ConfirmationURL": f"{settings.MPESA_CALLBACK_URL}/api/v1/finance/mpesa/c2b-confirmation/",
            "ValidationURL": f"{settings.MPESA_CALLBACK_URL}/api/v1/finance/mpesa/c2b-validation/",
        }
        response = requests.post(
            f"{self.base_url}/mpesa/c2b/v1/registerurl",
            json=payload,
            headers={'Authorization': f'Bearer {token}'},
        )
        return response.json()