# -*- coding: utf-8 -*-
import os
import sys
import xbmc
import xbmcvfs
import xbmcaddon
addon = xbmcaddon.Addon(id='plugin.video.get_tmdb')

# ШАГ 1: Добавляем путь к site-packages в sys.path
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
site_packages_path = os.path.join(CURRENT_DIR, 'resources', 'site-packages')
if site_packages_path not in sys.path:
    sys.path.insert(0, site_packages_path)

from tmdb.api import TMDB
from sqldb.database import MonitorDB
# Инициализация
db = MonitorDB()
tmdb_api = TMDB()

# Путь к сериалам из настроек плагина
SHOWS_PATH = addon.getSetting("shows_path") or "special://profile/addon_data/plugin.video.get_tmdb/Shows/"
SHOWS_PATH = SHOWS_PATH.replace('\\', '/')
if not SHOWS_PATH.endswith('/'):
    SHOWS_PATH += '/'

def create_strm_file(show_name, year_param, season, episode, tmdb_id):
    """Добавление нового .strm файла в уже существующую папку сериала"""
    # Собираем точное имя папки, созданной ранее: Название (Год)
    name = show_name + " (" + str(year_param) + ")"
    for char in ['/', '\\', '?', ':', '"', '*', '|']:
        name = name.replace(char, " " if char in ['/', '\\'] else "")

    folder_path = SHOWS_PATH + name + '/'

    # Если папки сериала почему-то нет на диске, сервис её не трогает
    if not xbmcvfs.exists(folder_path):
        xbmc.log(f"[ShowMonitor] Папка {folder_path} не найдена. Пропуск.", level=xbmc.LOGWARNING)
        return False

    # Формат строго по стандарту S01E01
    file_name = "{0} S{1:02d}E{2:02d}.strm".format(name, season, episode)
    file_path = folder_path + file_name

    if xbmcvfs.exists(file_path):
        return False

    # ПРАВИЛЬНЫЙ ФОРМАТ ССЫЛКИ (как при ручном добавлении)
    uri = "plugin://plugin.video.get_tmdb/?action=play_episode&id={0}&season={1}&episode={2}".format(tmdb_id, season, episode)

    try:
        f = xbmcvfs.File(file_path, 'w')
        if f:
            f.write(uri)
            f.close()
        xbmc.log(f"[ShowMonitor] Добавлена новая серия: {file_path}", level=xbmc.LOGINFO)
        return True
    except Exception as e:
        xbmc.log(f"[ShowMonitor] Ошибка записи файла {file_name}: {e}", level=xbmc.LOGERROR)
        return False

def check_updates(debug_mode=False):
    """Основная функция проверки обновлений через API TMDB"""
    xbmc.log(f"[ShowMonitor] Старт проверки. Режим отладки: {debug_mode}", level=xbmc.LOGINFO)
    tracked_shows = db.get_tracked_shows()

    if not tracked_shows:
        xbmc.log("[ShowMonitor] Список отслеживания пуст.", level=xbmc.LOGINFO)
        return

    library_updated = False

    for show in tracked_shows:
        tmdb_id = show['tmdb_id']
        show_name = show['show_name']
        status = show['status']
        local_season = show['last_season']
        local_episode = show['last_episode']

        if status in ['Ended', 'Canceled']:
            xbmc.log(f"[ShowMonitor] Сериал '{show_name}' имеет статус {status}. Пропуск.", level=xbmc.LOGINFO)
            continue

        if debug_mode and local_episode > 1:
            xbmc.log(f"[ShowMonitor][DEBUG] Имитируем старую базу. Было: S{local_season}E{local_episode}", level=xbmc.LOGINFO)
            local_episode -= 1

        tmdb_data = tmdb_api.get_tv_show(tmdb_id)
        if not tmdb_data:
            xbmc.log(f"[ShowMonitor] Не удалось получить данные для ID {tmdb_id}", level=xbmc.LOGWARNING)
            continue
        show_name = tmdb_data.get('original_name') or tmdb_data.get('name', show['show_name'])
        year_param = (tmdb_data.get('first_air_date', '0000')[:4])

        last_episode_meta = tmdb_data.get('last_episode_to_air')
        if not last_episode_meta:
            continue

        server_season = last_episode_meta.get('season_number', 0)
        server_episode = last_episode_meta.get('episode_number', 0)
        server_status = tmdb_data.get('status', 'Returning Series')

        if server_season > local_season or (server_season == local_season and server_episode > local_episode):
            xbmc.log(f"[ShowMonitor] Найдена новая серия для '{show_name}' через API плагина!", level=xbmc.LOGINFO)

            for s_meta in tmdb_data.get('seasons', []):
                s_num = s_meta.get('season_number', 0)
                if s_num == 0:
                    continue
                if local_season <= s_num <= server_season:
                    ep_count = s_meta.get('episode_count', 0)
                    for e_num in range(1, ep_count + 1):
                        if (s_num > local_season) or (s_num == local_season and e_num > local_episode):
                            if s_num == server_season and e_num > server_episode:
                                break
                            # Передаем год для корректного поиска папки
                            if create_strm_file(show_name, year_param, s_num, e_num, tmdb_id):
                                library_updated = True

            db.insert_show(tmdb_id, show_name, server_season, server_episode, server_status)

    if library_updated:
        xbmc.log("[ShowMonitor] Медиатека обновлена. Сканирование папки Kodi.", level=xbmc.LOGINFO)
        xbmc.executebuiltin(f'UpdateLibrary(video, "{SHOWS_PATH}")')

if __name__ == '__main__':
    monitor = xbmc.Monitor()
    xbmc.log("[ShowMonitor] Сервис мониторинга серий успешно запущен!", level=xbmc.LOGINFO)
    CHECK_INTERVAL = 3600
    monitor.waitForAbort(10)
    xbmc.log("[ShowMonitor] Переходим к регулярным проверкам.", level=xbmc.LOGINFO)
    # Бесконечный цикл работы сервиса
    while not monitor.abortRequested():
        try:
            check_updates(debug_mode=False)
        except Exception as e:
            xbmc.log(f"[ShowMonitor] Критическая ошибка в цикле сервиса: {e}", level=xbmc.LOGERROR)
        for _ in range(CHECK_INTERVAL):
            if monitor.waitForAbort(1):
                break

    xbmc.log("[ShowMonitor] Сервис остановлен.", level=xbmc.LOGINFO)