import aiohttp
import logging

async def request_zibal_payment(merchant: str, amount_toman: int, callback_url: str, description: str) -> dict:
    """
    درخواست لینک پرداخت از زیبال
    amount_toman: مبلغ به تومان (که به ریال تبدیل می‌شود)
    """
    url = "https://gateway.zibal.ir/v1/request"
    amount_rial = int(amount_toman) * 10
    
    payload = {
        "merchant": merchant,
        "amount": amount_rial,
        "callbackUrl": callback_url,
        "description": description
    }
    
    try:
        async with aiohttp.ClientSession() as session:
            async with session.post(url, json=payload, timeout=aiohttp.ClientTimeout(total=10)) as response:
                if response.status == 200:
                    data = await response.json()
                    # زیبال در صورت موفقیت کد 100 برمی‌گرداند
                    if data.get("result") == 100:
                        track_id = data.get("trackId")
                        payment_url = f"https://gateway.zibal.ir/start/{track_id}"
                        return {"status": True, "payment_url": payment_url, "track_id": track_id}
                    else:
                        code = data.get('result')
                        msg = f"خطای زیبال: {code}"
                        if code in [102, 103, 104]:
                            msg += " (احتمالاً آی‌پی سرور در پنل زیبال تایید نشده یا مرچنت اشتباه است)"
                        return {"status": False, "message": msg}
                else:
                    return {"status": False, "message": f"خطای ارتباط با زیبال: {response.status}"}
    except Exception as e:
        logging.error(f"Zibal request exception: {e}")
        return {"status": False, "message": str(e)}

async def verify_zibal_payment(merchant: str, track_id: int) -> dict:
    """
    تایید تراکنش پرداخت زیبال
    """
    url = "https://gateway.zibal.ir/v1/verify"
    payload = {
        "merchant": merchant,
        "trackId": int(track_id)
    }
    
    try:
        async with aiohttp.ClientSession() as session:
            async with session.post(url, json=payload, timeout=aiohttp.ClientTimeout(total=10)) as response:
                if response.status == 200:
                    data = await response.json()
                    result = data.get("result")
                    # 100: پرداخت با موفقیت تایید شد. 101: قبلا تایید شده.
                    if result in [100, 101]:
                        amount_toman = (data.get("amount") / 10) if data.get("amount") else 0
                        return {"status": True, "ref_number": data.get("refNumber"), "amount": amount_toman}
                    else:
                        return {"status": False, "message": f"پرداخت تایید نشد. کد نتیجه: {result}"}
                else:
                    return {"status": False, "message": f"خطای ارتباط با سرور زیبال: {response.status}"}
    except Exception as e:
        logging.error(f"Zibal verify exception: {e}")
        return {"status": False, "message": str(e)}
