import json
import os
from . import config


def append_file(name, text):
    with open('{}/storage-files/{}.txt'.format(os.getcwd(), name), 'a', encoding='utf-8') as file:
        file.write(text + "\n")


def read_text_file_as_array(name):
    with open('{}/storage-files/{}.txt'.format(os.getcwd(), name), 'r', encoding='utf-8') as file:
        return [x for x in file.read().split('\n') if x != '']


def save_json_file(name, data):
    with open('{}/storage-files/{}.json'.format(os.getcwd(), name), 'w', encoding='utf-8') as file:
        json.dump(data, file, indent=4)


def read_json_file(name):
    path = f"{os.getcwd()}/storage-files/{name}.json"
    if not os.path.exists(path):
        return {}

    with open(path, 'r', encoding='utf-8') as file:
        return json.load(file)


def merge_post_data_by_imdb(series_dict):
    merged = {}
    for series in series_dict.values():
        imdb_id = series.get('imdb_id')

        if series.get('type') == 'series':
            if not isinstance(series.get('download_links'), dict):
                series['download_links'] = {'1': series.get('download_links')}
        else:
            if not isinstance(series.get('download_links'), list):
                series['download_links'] = []

        if imdb_id in merged:
            if series.get('type') == 'series':

                if not isinstance(merged[imdb_id]['download_links'], dict):
                    merged[imdb_id]['download_links'] = {}

                for season, links in series.get('download_links', {}).items():

                    if season in merged[imdb_id]['download_links']:
                        merged[imdb_id]['download_links'][season].extend(links)
                    else:
                        merged[imdb_id]['download_links'][season] = links
            else:
                if not isinstance(merged[imdb_id]['download_links'], list):
                    merged[imdb_id]['download_links'] = []
                merged[imdb_id]['download_links'].extend(series.get('download_links', []))
        else:
            merged[imdb_id] = {
                **series,
                "download_links": series.get("download_links", [] if series.get("type") == "movie" else {})
            }

    for imdb_id, series in merged.items():
        if series.get('type') == 'series' and isinstance(series.get('download_links'), dict):
            series['download_links'] = dict(
                sorted(series['download_links'].items(), key=lambda x: int(x[0]))
            )
        elif series.get('type') == 'movie' and isinstance(series.get('download_links'), list):
            seen = set()
            unique_links = []
            for link in series['download_links']:
                key = (link.get('link'), link.get('quality'), link.get('type'))
                if key not in seen:
                    seen.add(key)
                    unique_links.append(link)
            series['download_links'] = unique_links

    return list(merged.values())


def get_proxies():
    proxies = []

    for proxy in config.proxies:

        if not proxy:
            continue

        list = proxy.split(':')

        proxies.append({
            'https': 'http://{}:{}@{}:{}'.format(list[2], list[3], list[0], list[1]),
        })

    return proxies


def gregorian_to_jalali(gy, gm, gd):
    g_d_m = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334]
    if (gm > 2):
        gy2 = gy + 1
    else:
        gy2 = gy
    days = 355666 + (365 * gy) + ((gy2 + 3) // 4) - ((gy2 + 99) // 100) + ((gy2 + 399) // 400) + gd + g_d_m[gm - 1]
    jy = -1595 + (33 * (days // 12053))
    days %= 12053
    jy += 4 * (days // 1461)
    days %= 1461
    if (days > 365):
        jy += (days - 1) // 365
        days = (days - 1) % 365
    if (days < 186):
        jm = 1 + (days // 31)
        jd = 1 + (days % 31)
    else:
        jm = 7 + ((days - 186) // 30)
        jd = 1 + ((days - 186) % 30)
    return [jy, jm, jd]


def jalali_to_gregorian(jy, jm, jd):
    jy += 1595
    days = -355668 + (365 * jy) + ((jy // 33) * 8) + (((jy % 33) + 3) // 4) + jd
    if (jm < 7):
        days += (jm - 1) * 31
    else:
        days += ((jm - 7) * 30) + 186
    gy = 400 * (days // 146097)
    days %= 146097
    if (days > 36524):
        days -= 1
        gy += 100 * (days // 36524)
        days %= 36524
        if (days >= 365):
            days += 1
    gy += 4 * (days // 1461)
    days %= 1461
    if (days > 365):
        gy += ((days - 1) // 365)
        days = (days - 1) % 365
    gd = days + 1
    if ((gy % 4 == 0 and gy % 100 != 0) or (gy % 400 == 0)):
        kab = 29
    else:
        kab = 28
    sal_a = [0, 31, kab, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
    gm = 0
    while (gm < 13 and gd > sal_a[gm]):
        gd -= sal_a[gm]
        gm += 1

    if gm < 10:
        gm = '0' + str(gm)

    if gd < 10:
        gd = '0' + str(gd)

    return str(gy) + '-' + str(gm) + '-' + str(gd)
