// DragonX Wallet - ImGui Edition
// Copyright 2024-2026 The Hush Developers
// Released under the GPLv3

#pragma once

#include <string>

namespace dragonx {
namespace util {

/**
 * @brief Parsed payment URI data
 */
struct PaymentURI {
    std::string address;
    double amount = 0.0;
    std::string label;
    std::string memo;
    std::string message;
    bool valid = false;
    std::string error;
};

/**
 * @brief Parse a DragonX/HUSH payment URI
 * 
 * Supports format: drgx:<address>?amount=<amount>&label=<label>&memo=<memo>&message=<message>
 * Also supports hush: prefix for backwards compatibility
 * 
 * @param uri The payment URI to parse
 * @return PaymentURI struct with parsed data
 */
PaymentURI parsePaymentURI(const std::string& uri);

/**
 * @brief URL decode a string
 * @param encoded URL-encoded string
 * @return Decoded string
 */
std::string urlDecode(const std::string& encoded);

/**
 * @brief URL-encode a string (RFC 3986 unreserved kept; ' ' -> %20; others -> %HH).
 */
std::string urlEncode(const std::string& value);

/**
 * @brief Build a canonical DragonX payment URI: drgx:<address>[?amount=..&label=..&memo=..],
 *        with query parameters URL-encoded. amount<=0 and empty label/memo are omitted.
 *
 * Single source of truth so the receive tab and the request-payment dialog can't diverge on the
 * scheme or encoding (the receive tab previously emitted an unparseable "dragonx:" URI with a raw memo).
 */
std::string buildPaymentUri(const std::string& address, double amount = 0.0,
                            const std::string& label = "", const std::string& memo = "");

/**
 * @brief Check if a string is a valid payment URI
 * @param str String to check
 * @return true if it starts with drgx: or hush:
 */
bool isPaymentURI(const std::string& str);

} // namespace util
} // namespace dragonx
