// Cached ENS reverse resolution.
// Resolves addresses to ENS names via ethers provider.lookupAddress(),
// caching results in localStorage with a 12-hour TTL.
//
// POPUP ONLY. localStorage does not exist in the Chrome MV3 service worker,
// so this module must not be pulled into src/background/. Anything the
// background context needs to cache goes in extension storage instead.

const { getProvider } = require("./balances");
const { log } = require("./log");

const CACHE_TTL_MS = 43200000; // 12 hours
const CACHE_PREFIX = "ens:";

function getCached(address) {
    const key = CACHE_PREFIX + address.toLowerCase();
    try {
        const raw = localStorage.getItem(key);
        if (!raw) return undefined;
        const entry = JSON.parse(raw);
        if (Date.now() - entry.ts < CACHE_TTL_MS) {
            return entry.name;
        }
    } catch {
        // Corrupt cache entry — treat as miss.
    }
    return undefined;
}

function setCache(address, name) {
    const key = CACHE_PREFIX + address.toLowerCase();
    localStorage.setItem(key, JSON.stringify({ name, ts: Date.now() }));
}

async function resolveEnsName(address, rpcUrl, networkId) {
    const cached = getCached(address);
    if (cached !== undefined) return cached;

    const provider = getProvider(rpcUrl, networkId);
    try {
        const name = (await provider.lookupAddress(address)) || null;
        setCache(address, name);
        return name;
    } catch (e) {
        log.errorf("ENS reverse lookup failed", address, e.message);
        // Don't cache failures — let subsequent lookups retry
        return null;
    }
}

async function resolveEnsNames(addresses, rpcUrl, networkId) {
    const results = new Map();
    await Promise.all(
        addresses.map(async (addr) => {
            results.set(addr, await resolveEnsName(addr, rpcUrl, networkId));
        }),
    );
    return results;
}

module.exports = { resolveEnsName, resolveEnsNames };
