import json
from collections import defaultdict
from datetime import datetime
import os

def optimize_json(original_json_path, optimized_json_path):
    with open(original_json_path, 'r', encoding='utf-8') as f:
        data = json.load(f)
    
    messages = data.get("messages", [])

    # Создание индекса отправителей
    sender_indices = {}
    next_sender_index = 1

    # Создание маппинга старых ID сообщений на новые
    old_id_to_new_id = {}
    next_message_id = 1

    optimized_data = {}
    
    # Первый проход: назначение новых ID и создание индекса отправителей
    for message in messages:
        sender = message.get('from')
        if sender is None:
            continue  # Пропускаем сообщения от null

        # Назначение нового ID
        old_id = message.get('id')
        new_id = next_message_id
        old_id_to_new_id[old_id] = new_id
        next_message_id += 1

        # Назначение индекса отправителя
        if sender not in sender_indices:
            sender_indices[sender] = next_sender_index
            next_sender_index += 1

    # Второй проход: построение оптимизированной структуры
    for message in messages:
        sender = message.get('from')
        if sender is None:
            continue  # Пропускаем сообщения от null

        new_id = old_id_to_new_id[message.get('id')]
        sender_index = sender_indices[sender]

        # Парсинг даты
        date_str = message.get('date')
        date_obj = datetime.fromisoformat(date_str)
        year = str(date_obj.year)
        month = f"{date_obj.month:02}"
        day = f"{date_obj.day:02}"
        time = date_obj.strftime("%H:%M:%S")

        # Инициализация года, месяца, дня в optimized_data, если нет
        if year not in optimized_data:
            optimized_data[year] = {}
        if month not in optimized_data[year]:
            optimized_data[year][month] = {}
        if day not in optimized_data[year][month]:
            optimized_data[year][month][day] = []

        # Построение записи сообщения
        optimized_message = {
            "id": new_id,
            "sender_index": sender_index,
            "time": time,
            "text": message.get('text', "")
        }

        # Обработка ссылок на ответы
        reply_to_old_id = message.get('reply_to_message_id')
        if reply_to_old_id:
            # Получение нового ID для отвечаемого сообщения
            reply_to_new_id = old_id_to_new_id.get(reply_to_old_id)
            if reply_to_new_id:
                optimized_message["reply_to_id"] = reply_to_new_id

        # Добавление сообщения в соответствующий день
        optimized_data[year][month][day].append(optimized_message)

    # Создание маппинга индексов отправителей на их имена
    sender_mapping = {index: sender for sender, index in sender_indices.items()}

    # Финальная структура JSON
    final_optimized_json = {
        "senders": sender_mapping,
        "messages": optimized_data
    }

    # Сохранение оптимизированного JSON
    with open(optimized_json_path, 'w', encoding='utf-8') as f:
        json.dump(final_optimized_json, f, ensure_ascii=False, indent=2)

    print(f"Оптимизированный JSON сохранен в {optimized_json_path}")

# Пример использования с вводом через консоль
if __name__ == "__main__":
    original_json_path = input("Введите путь к исходному JSON файлу: ")
    optimized_json_name = input("Введите имя для сохранения оптимизированного JSON файла: ")
    
    # Получение пути к текущей директории
    current_directory = os.path.dirname(os.path.abspath(__file__))
    optimized_json_path = os.path.join(current_directory, optimized_json_name)
    
    optimize_json(original_json_path, optimized_json_path)