# Модуль М2
import pickle
import os
import matplotlib.pyplot as plt
from m1 import sred, colvo

def ctenie():
    """Чтение данных из бинарного файла"""
    filename = input("Введите имя бинарного файла: ")
    
    if not os.path.exists(filename):
        print(f"Файл {filename} не существует!")
        return None, None
    
    try:
        with open(filename, 'rb') as file:
            data = pickle.load(file)
            if len(data) >= 2:
                A = data[0]
                B = data[1]
                return A, B
            else:
                print("Файл должен содержать как минимум два списка/кортежа")
                return None, None
    except Exception as e:
        print(f"Ошибка при чтении файла: {e}")
        return None, None

def process_data():
    """Основная функция обработки данных"""
    # Чтение данных из файла
    A, B = ctenie()
    
    if A is None or B is None:
        return None
    
    print(f"\nСписок A: {A}")
    print(f"Список B: {B}")
    
    # Применение функции 1
    results = sred(A, B)
    avg_A, avg_B, P = results
    
    print(f"\nСреднее значение A: {avg_A:.2f}")
    print(f"Среднее значение B: {avg_B:.2f}")
    print(f"Пороговое значение P: {P:.2f}")
    
    # Применение функции 2 к спискам A и B
    up_A, down_A = colvo(A, P)
    up_B, down_B = colvo(B, P)
    
    print(f"\nДля списка A:")
    print(f"  Элементов выше P ({P:.2f}): {up_A}")
    print(f"  Элементов не выше P: {down_A}")
    
    print(f"\nДля списка B:")
    print(f"  Элементов выше P ({P:.2f}): {up_B}")
    print(f"  Элементов не выше P: {down_B}")
    
    # Построение графика
    plot_data(A, B, avg_A, avg_B, P)
    
    return results

def plot_data(A, B, avg_A, avg_B, P):
    """Построение графика для списков A и B"""
    plt.figure(figsize=(10, 6))
    
    # Создание индексов для элементов
    indices_A = range(len(A))
    indices_B = range(len(B))
    
    # Построение точек для списка A
    plt.scatter(indices_A, A, color='blue', label='Список A', s=50, alpha=0.7)
    
    # Построение точек для списка B
    plt.scatter(indices_B, B, color='red', label='Список B', s=50, alpha=0.7)
    
    # Горизонтальные линии для средних значений и порога
    plt.axhline(y=avg_A, color='blue', linestyle='--', alpha=0.5, label=f'Среднее A: {avg_A:.2f}')
    plt.axhline(y=avg_B, color='red', linestyle='--', alpha=0.5, label=f'Среднее B: {avg_B:.2f}')
    plt.axhline(y=P, color='green', linestyle='-', alpha=0.7, label=f'Порог P: {P:.2f}')
    
    # Настройка графика
    plt.xlabel('Индекс элемента')
    plt.ylabel('Значение элемента')
    plt.title('Сравнение списков A и B')
    plt.legend()
    plt.grid(True, alpha=0.3)
    
    # Сохранение графика
    plt.savefig('comparison_plot.png', dpi=300, bbox_inches='tight')
    plt.show()
