const Moralis = require("moralis/node");
const logger = require("../logger");


async function getNFTOwners(opts) {
    logger.info('getNFTOwners', opts)
    const options = {
        address: opts.address,
        chain: opts.chain,
    };
    try {
        return await Moralis.Web3API.token.getNFTOwners(options);
    } catch (error) {
        logger.error('getNFTOwners error', error.toString(), JSON.stringify(options))
    }
    return null
}

async function getTokenIdMetadata(opts) {
    logger.info('getNFTOwners', opts)
    const options = {
        address: opts.address,
        token_id: opts.token_id,
        chain: opts.chain,
    };
    try {
        return await Moralis.Web3API.token.getTokenIdMetadata(options);
    } catch (error) {
        logger.error('getTokenIdMetadata', error.toString(), JSON.stringify(opts))
        return null;
    }
}



async function getNFTMetadata(opts) {
    logger.info('getNFTMetadata', opts)
    const options = {
        address: opts.address,
        chain: opts.chain,
    };
    try {
        return await Moralis.Web3API.token.getNFTMetadata(options);
    } catch (error) {
        logger.error('getNFTOwners error', error.toString(), JSON.stringify(options))
    }
}

async function getAllTokenIds(opts) {
    logger.info('getAllTokenIds', opts)
    const options = {
        address: opts.address,
        chain: opts.chain,
    };
    try {
        return await Moralis.Web3API.token.getAllTokenIds(options);
    } catch (error) {
        logger.error('getAllTokenIds error', error.toString(), JSON.stringify(options))
    }
}


async function enableWeb3(chainId, privateKey_) {
    // Enable web3
    await Moralis.enableWeb3({
        chainId: chainId,
        privateKey: privateKey_,
    });
}

async function transferNft(opts) {
    // sending a token with token id = 1
    const options = {
        type: opts.type,
        receiver: opts.toAddress,
        contractAddress: opts.tokenAddress,
        tokenId: opts.tokenId,
    };
    try {
        await enableWeb3(opts.chainId,opts.privateKey)
    } catch (error) {
        logger.error('transferNft enableWeb3', error.toString(), JSON.stringify(options))
        return {
            code: -1,
            errMsg: 'enableWeb3'+error.toString(),
        }
    }
    try {
        return await Moralis.transfer(options);
    } catch (error) {
        logger.error('transferNft', error.toString(), JSON.stringify(options))
        return {
            code: -1,
            errMsg: 'transfer'+error.toString(),
        }
    }
}

module.exports = {
    getNFTOwners,
    getNFTMetadata,
    getTokenIdMetadata,
    getAllTokenIds,
    transferNft,
}