import asyncio
import json
#import csv
from binance import AsyncClient
from binance.client import Client
from binance.enums import *
from binance.exceptions import BinanceAPIException, BinanceOrderException

api_key = '8VLvEFhyBTmZOp8XZDLHhuRy0WpFHAlKzp9RLGRN5laRvPB4lmuuC3kDoeK9a14q'
api_secret = 'cZdRIINvixBiMsD4JR81rNYURthJQIjuXvMmIkZaDtno3q1MbHjY9WAuoGZ95KBj'

#выдача и запись в файлы данных о кошельке 
async def get_account(client):
    avg_price = await client.get_account()
    arr = []
    arr1 = []
    for key in avg_price["balances"]:
        #print(i)
        #print(key['asset'])
        if key['asset'] == 'BTC':
            #print(key['free'])
            arr.append(key)
        if key['asset'] == 'RVN':
            #print(key['free'])
            arr.append(key)
        
        if key['free'] != '0.00000000' and key['free'] != '0.00':
            arr1.append(key)

    for key in arr:
        print(key)

    with open('btc_bars2.csv', 'w') as d:
        for line in arr:
            d.write(f'{line["asset"]}, {line["free"]}\n')
    
    with open('btc_bars3.csv', 'w') as d:
        for line in arr1:
            d.write(f'{line["asset"]}, {line["free"]}\n')

#универсальная функция, осзволяющая ставить лимитный ордер на покупку или продажу 
async def create_order(client, symbol, side, type, qua, price):
    #покупка
    try:
        buy_limit = await client.create_order(
            symbol = symbol,
            side = side,
            type = type,
            timeInForce = 'GTC',
            quantity = qua,
            price = price)
        await writeFileOutput(buy_limit)
        print(buy_limit)     

    except BinanceAPIException as e:
        # error handling goes here
        print(e)
    except BinanceOrderException as e:
        # error handling goes here
        print(e)

#запрос текущего курса по не пустым криптовалютам 
async def get_currency(client):
    avg_price = await client.get_account()
    arr = []
    for key in avg_price["balances"]:
        if key['free'] != '0.00000000' and key['free'] != '0.00':
            str = f"{key['asset']} {key['free']}"
            arr.append(str)
    for key in arr:
        print(key)
    with open('talk/output.txt', 'w') as d:
        d.write(json.dumps(arr))
    



# чтение файла input
async def readFileINPUT(client):
    with open("talk/input.txt", 'r') as file:
        inputTXT = file.read()

    accArr = []
    inputTXT = inputTXT.split("\n")
    i = 0
    #построчно читаем файл как строку
    for n in inputTXT:
        j = 0
        #читаем самый первый символ в строке 
        if n[0] == "0":
            #разделяем по пробелам
            n = n.split(" ")
            #добавляем индекс записи 
            accArr.append([i])
            for key in n:
                #выбиаем строку количества и преобр в тип float
                if j == 4:
                    key = float(key)
                accArr[i].append(key)
                j += 1
        #если  1, то выдача информации по паре за определенный промежуток времени 
        elif n[0] == "1":
            #резделяем по пробелам 
            n = n.split(" ")
            #добавляем индекс записи 
            accArr.append([i])
            for key in n:
                #выбираем строки, которые отвечают за интервал времени 
                if (j == 3) or (j == 4):
                    #Заменяем разделитель на пробелы 
                    arr_to_str = key.replace("|", " ")
                    #преобразуем в строку 
                    key = ""
                    for str in arr_to_str:
                        key += str
                #добавляем в массив 
                accArr[i].append(key)
                j += 1
            
            #Вызов функции на получение истории по конкретной паре
            await get_info_param(client, accArr[i][2], accArr[i][3], accArr[i][4], accArr[i][5])
        #выдача данных об кошельке аккаунта 
        elif n[0] == "2":
            await get_currency(client)

        i += 1
    #for key in accArr:
    #    print(key)
    return accArr

#запрос на получение истории по конкретной паре 
async def get_info_param(client, symbol, interval, start, end):
    klines = await client.get_historical_klines(symbol, interval, start, end)
    print(json.dumps(klines, indent=2))
    with open('talk/spot_margin.txt', 'w') as d:
        for line in klines:
            d.write(f'{line}\n')


#-------------------------------------Работа с файлами-----------------------
#очистка файла 
async def clearFile():
    with open('input.txt', 'w') as d:
        d.write("")

#запись ответа в output
async def writeFileOutput(mess):
    with open('perem/output.txt', 'w') as d:
        d.write(json.dumps(mess))

#получение обфчного файла 
async def readFile(name):
    with open(name, "r") as file:
        contents = file.read()
    return contents

#получение json файла 
async def readJSONFile(name):
    with open(name, 'r') as file:
        jsonn = json.load(file)
    return jsonn
#-------------------------------------Работа с файлами-----------------------


async def main():
    client = await AsyncClient.create(api_key, api_secret)
    #print(client.response.headers)

    #await get_account(client)

    #await create_order(client, 'RVNBTC', 'BUY', 'LIMIT', 200, '0.000001')

    #contents = await readJSONFile("create_order.json")
    #print(type(contents))    

    #for key in contents:
    #    print(key)

    #await get_info_param(client, "RVNBTC", "1h", "1 June, 2021", "23 July, 2021")



    
#==============================
    getArrInput = await readFileINPUT(client)

    '''
    #блок добления на условия для дальнейшего последовательноо сценария 
    for key in getArrInput:
        #если 0, то устанавливаем ордер 
        if key[1] == '0':
            #await create_order(client, key[2], key[3], key[4], key[5], key[6])
            await create_order(client, "RVNBNB", "SELL", "LIMIT", 195.0, "0.00034")
        #если  1, то выдача информации по паре за определенный промежуток времени 
        elif key[1] == '1':
            await get_info_param(client, "RVNBTC", "1h", "1 June, 2021", "23 July, 2021")
    '''

#==============================
    


    await client.close_connection()

if __name__ == "__main__":

    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    #input()