#!/usr/bin/env python3
# https://github.com/anilibria/anilibria-winmaclinux/issues/191
# anilibria-db-uploader
# Скрипт для ручной отправки данных о просмотрах на сервер
# после обновления 2.2.19~>2.2.21
# Спасибо trueromanus (x6doj2tubzrf@mail.ru), Keleth (http://brainstorage.me/Ke1eth)

import json
import requests
import sys
from pathlib import Path


cache_path = Path.home() / ".local" / "share" / "EmptyFlow" / "AnilibriaDesktopClient"
v2token = None
old_seen_marks = []
old_seen_releases = []
metadata = None
request = []


def read_token():
    global v2token
    with open(cache_path / 'userconfiguration.cache') as f:
        data = json.load(f)
        v2token = data['v2token']


def read_old_seen_marks():
    global old_seen_marks
    global old_seen_releases
    with open(cache_path / 'seenmark.cache') as f:
        data = json.load(f)
        for item in data:
            x = item.split(".")
            old_seen_marks.append({"release_id": int(x[0]), "seria": int(x[1])})
            old_seen_releases.append(int(x[0]))


def read_metadata():
    global metadata
    with open(cache_path / 'metadata') as f:
        metadata = json.load(f)


def prepare_request():
    global metadata
    global request
    global old_seen_marks
    for i in range(0, int(metadata['countEpisodes'])):
        print("Обрабатываем эпизод: " + str(i))
        episodes = None
        f_name = 'episodes' + str(i) + '.cache'
        with open(cache_path / f_name) as f:
            episodes = json.load(f)
        for episode in episodes:
            if episode['releaseId'] not in old_seen_releases:
                continue
            series = []
            for om in old_seen_marks:
                if om['release_id'] == episode['releaseId']:
                    series.append(om['seria'])
            print(series)
            sorted_items = sorted(episode['items'], key=lambda d: d['sortOrder'])
            for sort in sorted_items:
                if sort['sortOrder'] not in series:
                    continue
                request.append({'time': 0, 'is_watched': True, 'release_episode_id': sort['id']})


def send_request():
    global request
    headers = {'Authorization': f'Bearer {v2token}'}
    response = requests.post('https://anilibria.top/api/v1/accounts/users/me/views/timecodes',
                             json=request, headers=headers)
    if response.status_code != 200:
        print("не удалось отправить данные")
        print(response.content)
        sys.exit(5)


# ----------


read_token()
if v2token is None or v2token == '':
    print("Пользователь не авторизован на сервисе")
    sys.exit(1)

read_old_seen_marks()
if len(old_seen_marks) == 0:
    print("Не найдены старые метки просмотра или они пусты!")
    sys.exit(2)

read_metadata()
if metadata is None:
    print("Не удалось прочитать данные о эпизодах")
    sys.exit(3)

print("Найдено " + str(metadata['countEpisodes']) + " эпизодов")

prepare_request()
if len(request) == 0:
    print("Нет данных для отправки сервису")
    sys.exit(4)

send_request()
print("Данные синхронизированы")
