import base64
import json

import base58
from neo3 import wallet


def dict_to_attrs(attrs: dict) -> str:
    """
    This function takes a dictionary of object's attributes and converts them
    into string. The string is passed to `--attributes` key of neofs-cli.

    Args:
        attrs (dict): object attributes in {"a": "b", "c": "d"} format.

    Returns:
        (str): string in "a=b,c=d" format.
    """
    return ",".join(f"{key}={value}" for key, value in attrs.items())


def __fix_wallet_schema(wallet: dict) -> None:
    # Temporary function to fix wallets that do not conform to the schema
    # TODO: get rid of it once issue  is solved
    if "name" not in wallet:
        wallet["name"] = None
    for account in wallet["accounts"]:
        if "extra" not in account:
            account["extra"] = None


def get_wallet_public_key(wallet_path: str, wallet_password: str, format: str = "hex") -> str:
    #  Get public key from wallet file
    with open(wallet_path, "r") as file:
        wallet_content = json.load(file)
    __fix_wallet_schema(wallet_content)

    wallet_from_json = wallet.Wallet.from_json(wallet_content, password=wallet_password)
    public_key_hex = str(wallet_from_json.accounts[0].public_key)

    # Convert public key to specified format
    if format == "hex":
        return public_key_hex
    if format == "base58":
        public_key_base58 = base58.b58encode(bytes.fromhex(public_key_hex))
        return public_key_base58.decode("utf-8")
    if format == "base64":
        public_key_base64 = base64.b64encode(bytes.fromhex(public_key_hex))
        return public_key_base64.decode("utf-8")
    raise ValueError(f"Invalid public key format: {format}")