"""
این فایل ، جیسون سکشن هایی که با کمک پنجره شناور، کلاسیفای شده اند را می خواند و بر اساس میانگین وزنی، چهار کلاس که بالاترین میانگین وزنی را داشته اند انتخاب و ذخیره می کند
"""
import pandas as pd
import json
        
# with open('./data/large_sections_classes.json', 'r', encoding='utf-8') as input_file:
#     large_sections = json.load(input_file)
    
# with open('./data/error_sections_classes.json', 'r', encoding='utf-8') as input_file:
#     error_sections = json.load(input_file)

# large_sections.extend(error_sections)

# with open('./data/final_large_sections_classes.json', 'w', encoding='utf-8') as output_file:
#     json_data = json.dumps(large_sections, indent=4, ensure_ascii=False)
#     output_file.write(json_data)

# exit()

with open('./data/final_large_sections_classes.json', 'r', encoding='utf-8') as input_file:
    sections = json.load(input_file)

def mean_classes(input_classes):
    pass
    all_classes = []
    for cclass in input_classes:
        for item in cclass:
            all_classes.append({
                'label': item['label'],
                'score': item['score']
            })
    
    # sorted_classes = sorted(all_classes, key=lambda x: x['class'])
    classes_df = pd.DataFrame(all_classes)
    # گروه بندی بر اساس کلاس
    grouped_df = classes_df.groupby("label").agg(
    total_value=("score", "sum"),  # مجموع امتیازها
    count=("score", "count")      # تعداد تکرار هر کلاس
    ).reset_index()
    # تعریف فاکتور وزن بر اساس تعداد تکرار کلاس
    grouped_df["weight"] = grouped_df["count"]
    # بازسازی امتیاز با دخالت دادن وزن
    grouped_df["score"] = grouped_df["total_value"] * grouped_df["weight"]
    # حذف ستون‌های اضافی و ایجاد دیتافریم نهایی
    final_df = grouped_df[["label", "count", "score"]]
    # مرتب سازی دیتافریم نهایی بر اساس بالاترین امتیاز کلاسها
    sorted_df = final_df.sort_values(by="score", ascending=False)
    # تبدیل دیتافریم به دیکشنری
    top_4_classes = sorted_df.head(4).to_dict(orient="records")

    for item in top_4_classes:
        # تبدیل امتیاز در مبنای درصد
        item['score'] = (item['score']*100)/sorted_df['score'].sum()
        item.pop('count')
    
    return top_4_classes

sections_classes_list = []
for index, item in enumerate(sections):
    # if index > 11:
    #     break
    id = item['id']
    content = item['content']
    try:
        classes = item['classes']
        print(f'section: {len(sections)}/{index+1}/{id}')
    except:
        print(f'section: {len(sections)}/{index+1}/{id} --error')
        continue
    
    if id == "qs678693":
        pass
    final_classes = mean_classes(classes)
    
    sections_classes_list.append({
        'id': id,
        'best-class': final_classes[0],
        'other-classes': final_classes[1:]
    })

with open('./data/all_large_sections_final_2.json', 'w', encoding='utf-8') as output_file:
    json_data = json.dumps(sections_classes_list, indent=4, ensure_ascii=False)
    output_file.write(json_data)
    
# with open('./data/errors_final.txt', 'w', encoding='utf-8') as output_file:
#     output_file.write(errors)

print('finished!')

