import matplotlib.pyplot as plt
import pandas as pd
from loguru import logger

# Утилита для выкапывания строк из датафреймов, исключая время
def extractSeries(df):
    series = []
    for index in range(len(df)):
        seria = df.iloc[index][1:]
        seria = seria.apply(extractData)      
        series.append(seria)  
    return series

# Утилита для подсчета мин макс и среднего
def countMinMaxMean(sequence):
    sequence = list(sequence)
    mean = 0
    for item in sequence:
        mean += item
    mean = mean / len(sequence)
    
    return min(sequence), max(sequence), mean

# Выкапываение координат с серий для графиков
def extractXYfromSeries(seria):
    x = []
    y = []
    for block in seria:
        x.append(block[0])
        y.append(block[1])
    return x, y

# Аналогично, только с датафрейма
def extractXYfromDF(df):
    for times in range(len(df)):
        x = []
        y = []
        seria = df.iloc[times][1:]
        seria = seria.apply(extractData)        
        for block in seria:
            x.append(block[0])
            y.append(block[1])
        drawFrame(x,y)
    return x, y

# Стриппер для данных внутри элементов дф - перевод из строки в питонский список
def extractData(item):
    out = []
    items = str(item).split(',')
    for item in items: out.append(int(item))
    return out

# Выкапывание датафреймов в папке
def extractDfs(directoryPath):
    dfs = []
    for path in directoryPath.iterdir():
        if path.is_file():
            dfs.append(loadDf(path))
    return dfs

# Выкапывание единственного датафрейма
def extractDf(dfPath):
    df = []
    if dfPath.is_file(): df = loadDf(dfPath)
    return df


# Рисование какой-нибудь штуки на скатере
def drawFrame(x, y):
    fig, ax = plt.subplots()
    ax.scatter(x, y)   
    ax.set_xticks(range(100,900,100))
    ax.set_yticks(range(100,900,100))
    plt.rcParams["figure.figsize"] = (20,20) 
    plt.show()

# Разделение на левую и правую части, если они монолитны
def LeftRightSplit(x, y, length):
    length = int(length/2)
    return x[:length], x[length:], y[:length], y[length:]

# Утилита для загрузки через пандас
def loadDf(path):
    return pd.read_csv(path).drop(columns = ['Unnamed: 0'])

    # Итоговый подсчет длинны рук
def countFullLength(pairSequence):
    oneDimention = []
    sequence = pairSequence
    for pair in sequence:
        oneDimention.append(pair[0])
        oneDimention.append(pair[1])
    
    return countMinMaxMean(oneDimention)

# Вывод всех коордов, с учетом ошибки
def getCoordinates(df):
        if df.empty: logger.error('Dataframe is missing, reconstruct Metrika class object')
        else: 
            series = extractSeries(df)
            return series