# -*- coding: utf-8 -*-

import json
import os
import re
from collections import defaultdict, Counter
from datetime import datetime
import string

def clean_messages(input_file_path, output_file_path, stats_file_path, average_lengths_file_path, activity_file_path, word_frequency_file_path):
    # Проверяем, существует ли входной файл
    if not os.path.exists(input_file_path):
        print(f"Входной файл '{input_file_path}' не найден.")
        return

    try:
        # Открываем и загружаем исходный JSON-файл
        with open(input_file_path, 'r', encoding='utf-8') as infile:
            data = json.load(infile)
    except json.JSONDecodeError as e:
        print(f"Ошибка декодирования JSON: {e}")
        return

    cleaned_messages = []
    user_message_counts = {}
    user_message_lengths = defaultdict(list)
    activity_by_hour = defaultdict(int)
    activity_by_weekday = defaultdict(int)
    word_counter = Counter()

    # Загружаем стоп-слова для русского языка
    russian_stopwords = set([
        # Добавьте сюда список русских стоп-слов
        'и', 'в', 'во', 'не', 'что', 'он', 'на', 'я', 'с', 'со',
        'как', 'а', 'то', 'все', 'она', 'так', 'его', 'но', 'да',
        'ты', 'к', 'у', 'же', 'вы', 'за', 'бы', 'по', 'только', 'ее',
        'мне', 'было', 'вот', 'от', 'меня', 'еще', 'нет', 'о', 'из',
        'ему', 'теперь', 'когда', 'даже', 'ну', 'вдруг', 'ли', 'если',
        'уже', 'или', 'ни', 'быть', 'был', 'него', 'до', 'вас', 'нибудь',
        'опять', 'уж', 'вам', 'ведь', 'там', 'потом', 'себя', 'ничего',
        'ей', 'может', 'они', 'тут', 'где', 'есть', 'надо', 'ней', 'для',
        'мы', 'тебя', 'их', 'чем', 'была', 'сам', 'чтобы', 'без', 'будто',
        'чего', 'раз', 'тоже', 'себе', 'под', 'будет', 'ж', 'тогда', 'кто',
        'этот', 'того', 'потому', 'этого', 'какой', 'совсем', 'ним', 'здесь',
        'этом', 'один', 'почти', 'мой', 'тем', 'чтобы', 'нее', 'кажется', 'сюда',
        'туда', 'этой'
        # Это примерный список, вы можете добавить больше стоп-слов
    ])

    # Проходим по всем сообщениям
    for message in data.get('messages', []):
        # Получаем имя пользователя из поля 'from'
        user = message.get('from', 'Неизвестный пользователь')

        # Обновляем счетчик сообщений для пользователя
        user_message_counts[user] = user_message_counts.get(user, 0) + 1

        # Создаем словарь с необходимыми полями
        cleaned_message = {
            'id': message.get('id'),
            'date': message.get('date'),
            'from': user,
            'text': ''
        }

        # Обрабатываем поле 'text', объединяя все текстовые элементы
        text_content = message.get('text', '')
        cleaned_text = extract_text(text_content)
        cleaned_message['text'] = cleaned_text

        # Добавляем очищенное сообщение в список
        cleaned_messages.append(cleaned_message)

        # Подсчитываем длину сообщения для анализа средней длины
        message_length = len(cleaned_text)
        user_message_lengths[user].append(message_length)

        # Анализ активности по времени
        message_date = message.get('date')
        if message_date:
            dt = datetime.fromisoformat(message_date)
            hour = dt.hour
            weekday = dt.strftime('%A')
            activity_by_hour[hour] += 1
            activity_by_weekday[weekday] += 1

        # Частотный анализ слов
        words = tokenize_text(cleaned_text)
        words = [word for word in words if word.lower() not in russian_stopwords]
        word_counter.update(words)

    # Сохраняем очищенные данные в новый файл
    try:
        with open(output_file_path, 'w', encoding='utf-8') as outfile:
            json.dump({'messages': cleaned_messages}, outfile, ensure_ascii=False, indent=2)
        print(f"Очищенные данные успешно сохранены в '{output_file_path}'.")
    except Exception as e:
        print(f"Ошибка при сохранении файла: {e}")

    # Сохраняем статистику количества сообщений
    try:
        with open(stats_file_path, 'w', encoding='utf-8') as stats_file:
            json.dump(user_message_counts, stats_file, ensure_ascii=False, indent=2)
        print(f"Статистика количества сообщений сохранена в '{stats_file_path}'.")
    except Exception as e:
        print(f"Ошибка при сохранении файла статистики: {e}")

    # Подсчет средней длины сообщений для каждого пользователя
    user_average_lengths = {}
    for user, lengths in user_message_lengths.items():
        average_length = sum(lengths) / len(lengths)
        user_average_lengths[user] = average_length

    # Сохранение средней длины сообщений
    try:
        with open(average_lengths_file_path, 'w', encoding='utf-8') as avg_len_file:
            json.dump(user_average_lengths, avg_len_file, ensure_ascii=False, indent=2)
        print(f"Средняя длина сообщений сохранена в '{average_lengths_file_path}'.")
    except Exception as e:
        print(f"Ошибка при сохранении файла средней длины сообщений: {e}")

    # Сохранение активности по часам
    try:
        with open(activity_file_path, 'w', encoding='utf-8') as activity_file:
            activity_data = {
                'by_hour': dict(sorted(activity_by_hour.items())),
                'by_weekday': dict(activity_by_weekday)
            }
            json.dump(activity_data, activity_file, ensure_ascii=False, indent=2)
        print(f"Активность пользователей сохранена в '{activity_file_path}'.")
    except Exception as e:
        print(f"Ошибка при сохранении файла активности: {e}")

    # Сохранение частотного анализа слов (топ-50 слов)
    try:
        with open(word_frequency_file_path, 'w', encoding='utf-8') as wf_file:
            most_common_words = word_counter.most_common(50)
            json.dump(dict(most_common_words), wf_file, ensure_ascii=False, indent=2)
        print(f"Частотный анализ слов сохранен в '{word_frequency_file_path}'.")
    except Exception as e:
        print(f"Ошибка при сохранении файла частотного анализа слов: {e}")

def extract_text(text_content):
    """
    Извлекает текст из поля 'text', которое может быть строкой, списком или словарем.
    """
    if isinstance(text_content, str):
        return text_content
    elif isinstance(text_content, list):
        text_parts = []
        for item in text_content:
            if isinstance(item, str):
                text_parts.append(item)
            elif isinstance(item, dict) and 'text' in item:
                text_parts.append(item['text'])
        return ''.join(text_parts)
    elif isinstance(text_content, dict) and 'text' in text_content:
        return text_content['text']
    else:
        return ''

def tokenize_text(text):
    """
    Разбивает текст на слова, удаляя знаки препинания.
    """
    text = text.lower()
    text = text.translate(str.maketrans('', '', string.punctuation))
    words = text.split()
    return words

if __name__ == "__main__":
    input_file = r"C:\Users\Admin\Downloads\AyuGram Desktop\ChatExport_2024-09-22\result.json"
    output_file = r'C:\Users\Admin\Downloads\AyuGram Desktop\ChatExport_2024-09-22\cleaned_result.json'
    stats_file = r'C:\Users\Admin\Downloads\AyuGram Desktop\ChatExport_2024-09-22\user_statistics.json'
    average_lengths_file = r'C:\Users\Admin\Downloads\AyuGram Desktop\ChatExport_2024-09-22\user_average_lengths.json'
    activity_file = r'C:\Users\Admin\Downloads\AyuGram Desktop\ChatExport_2024-09-22\user_activity.json'
    word_frequency_file = r'C:\Users\Admin\Downloads\AyuGram Desktop\ChatExport_2024-09-22\word_frequency.json'

    clean_messages(
        input_file_path=input_file,
        output_file_path=output_file,
        stats_file_path=stats_file,
        average_lengths_file_path=average_lengths_file,
        activity_file_path=activity_file,
        word_frequency_file_path=word_frequency_file
    )