import json
import account
import os
import time
import datetime

# Plugin Data
info = {
    "name": "Multi Wallet Functions",
    "description": "Access and manage multiple wallets at once",
    "version": "1.0",
    "author": "Nathan.Woodburn/"
}

# Functions
functions = {
    "balance": {
        "name": "Wallet Balances",
        "type": "default",
        "description": "List balances of all wallets",
        "params": {},
        "returns": {
            "result": 
            {
                "name": "Result",
                "type": "list"
            }
        }
    },
    "domains": {
        "name": "Domains",
        "type": "default",
        "description": "List number of domains in each wallet",
        "params": {},
        "returns": {
            "result": 
            {
                "name": "Result",
                "type": "list"
            }
        }
    },
    "find": {
        "name": "Find domain wallet",
        "type": "default",
        "description": "Find which wallet owns a domain",
        "params": {
            "domain": {
                "name": "List of Domain to find",
                "type": "text"
            }
        },
        "returns": {
            "result": 
            {
                "name": "Result",
                "type": "text"
            }
        }
    },
    "expiring": {
        "name": "Expiring Domains",
        "type": "default",
        "description": "List domains that are expiring and their wallet",
        "params": {
            "days": {
                "name": "Days until expiry (default 30)",
                "type": "number"
            }
        },
        "returns": {
            "result": 
            {
                "name": "Result",
                "type": "text"
            }
        }
    },
    "export": {
        "name": "Export Domains",
        "type": "default",
        "description": "Export domains to a file",
        "params": {
        },
        "returns": {
            "result": 
            {
                "name": "result.csv",
                "type": "file"
            }
        }
    },
    "dash": {
        "name": "Dashboard widget",
        "type": "dashboard",
        "description": "List total balance of all wallets on your dashboard",
        "params": {},
        "returns": {
            "result": 
            {
                "name": "Total Holdings",
                "type": "text"
            }
        }
    },
    "enable": {
        "name": "Enable Dashboard widget",
        "type": "default",
        "description": "Enable the dashboard widget",
        "params": {},
        "returns": {
            "result": 
            {
                "name": "Result",
                "type": "text"
            }
        }
    },
    "disable": {
        "name": "Disable Dashboard widget",
        "type": "default",
        "description": "Disable the dashboard widget",
        "params": {},
        "returns": {
            "result": 
            {
                "name": "Result",
                "type": "text"
            }
        }
    }
}

if not os.path.exists("user_data/multiwallet.json"):
        with open("user_data/multiwallet.json", "w") as f:
            json.dump({
                 "enabled": False,
                 "lastUpdate": 0
            }, f)

def balance(params, authentication):
    wallets = account.listWallets()
    balances = []
    total = 0
    available = 0
    for wallet in wallets:
        info = account.getBalance(wallet)
        balances.append(f"{wallet}: Available: {info['available']:,.2f} HNS, Total: {info['total']:,.2f} HNS")
        total += info['total']
        available += info['available']

    balances.append(f"Total: Available: {available:,.2f} HNS, Total: {total:,.2f} HNS")

    return {"result": balances}

def expiring(params, authentication):
    days = params['days']
    if days == None or days == '':
        days = 30
    else:
        days = int(days)
    wallets = account.listWallets()
    expiring = ''
    
    for wallet in wallets:
        walletExpiring = []
        domains = account.getDomains(wallet)
        for domain in domains:
            if 'stats' in domain and 'daysUntilExpire' in domain['stats']:
                if domain['stats']['daysUntilExpire'] <= days:
                    walletExpiring.append({"domain": domain['name'], "wallet": wallet, "days": domain['stats']['daysUntilExpire']})
        if len(walletExpiring) > 0:
            expiring += f"<div class='row'><div class='col-md-12'><h3>Expiring Domains in {wallet}</h3><table class='table table-striped'><thead><tr><th>Domain</th><th>Days Until Expiration</th></tr></thead><tbody>"
            for domain in walletExpiring:
                expiring += f"<tr><td>{domain['domain']}</td><td>{domain['days']}</td></tr>"
            expiring += "</tbody></table></div></div>"
    return {"result": expiring}

def BlocksToDate(blocks):
    date = datetime.datetime.now() + datetime.timedelta(minutes=blocks*10)
    return date.strftime("%Y-%m-%d %H:%M:%S")

def export(params, authentication):
    wallets = account.listWallets()
    result = "name,expiry,expiryBlock,value,wallet"
    currentBlock = account.getBlockHeight()

    for wallet in wallets:
        domains = account.getDomains(wallet)
        for domain in domains:
            if 'stats' in domain and 'renewalPeriodEnd' in domain['stats']:
                expiryBlock = domain['stats']['renewalPeriodEnd']
                result += f"\n{domain['name']},{BlocksToDate(expiryBlock - currentBlock)},{expiryBlock},{domain['value']/1000000},{wallet}"
            else:
                result += f"\n{domain['name']},N/A,N/A,{domain['value']/1000000},{wallet}"
    
    return {"result": result}

def dash(params, authentication):
    with open("user_data/multiwallet.json", "r") as f:
        multiwallet = json.load(f)

    if multiwallet['enabled'] == False:
        return {"result": None}
    # Check time
    currentTime = int(time.time())
    if currentTime - multiwallet['lastUpdate'] < 60*10:
        return {"result": f"Available: {multiwallet['total']['available']:,.2f} HNS<br>Total: {multiwallet['total']['total']:,.2f} HNS"}
    
    wallets = account.listWallets()
    total = 0
    available = 0
    for wallet in wallets:
        info = account.getBalance(wallet)
        total += info['total']
        available += info['available']

    multiwallet['total'] = {
        "available": available,
        "total": total
    }
    multiwallet['lastUpdate'] = currentTime
    with open("user_data/multiwallet.json", "w") as f:
        json.dump(multiwallet, f)

    return {"result": f"Available: {available:,.2f} HNS<br>Total: {total:,.2f} HNS"}

def domains(params, authentication):
    wallets = account.listWallets()
    domains = []
    total = 0
    for wallet in wallets:
        numDomains = len(account.getDomains(wallet))
        domains.append(f"{wallet}: {numDomains}")
        total += numDomains

    domains.append(f"Total: {total}")
    return {"result": domains}

def find(params, authentication):
    wallets = account.listWallets()
    domain_owners = {}
    for wallet in wallets:
        domains = account.getDomains(wallet)
        for domain in domains:
            if domain['name'] in params['domain'].split(","):
                domain_owners[domain['name']] = wallet
    if len(domain_owners) > 0:
        result = ''
        for domain, wallet in domain_owners.items():
            result += f"{domain}: {wallet}<br>"
        return {"result": result}
    else:
        return {"result": "Not found"}

def enable(params, authentication):
    with open("user_data/multiwallet.json", "r") as f:
        multiwallet = json.load(f)
    multiwallet['enabled'] = True
    with open("user_data/multiwallet.json", "w") as f:
        json.dump(multiwallet, f)
    return {"result": "Success"}

def disable(params, authentication):
    with open("user_data/multiwallet.json", "r") as f:
        multiwallet = json.load(f)
    multiwallet['enabled'] = False
    with open("user_data/multiwallet.json", "w") as f:
        json.dump(multiwallet, f)    
    return {"result": "Success"}