from bs4 import BeautifulSoup
import sys
import os
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from base import QUALITY_PRIORITY, MOVIEO_TELEGRAM_API, SUDO
from base.utils.funcs import identify_encoder_and_release, identify_quality, identify_seasons, send_request
from base.utils.external_sources.zarfilm import *

def find_title_from_zarfilm(imdb_id: str):
    try:
        print(f'\n***********************\nsearching {imdb_id} in zarfilm\n***********************')
        res = send_request_to_zarfilm(f'https://zarfilm.com/?mobile_type=0&mobile_advsgenre=0&search_order=0&search_network=0&languageSearch=0&advscountry=0&agecat=0&advsqulity=&advencoder=&mobile_dubled=0&mobile_subtitle=0&mobile_online=0&adv3D=0&adv4k=0&imdbID={imdb_id}&minadvsimdbrate=&maxadvsimdbrate=&yaersofmin=&yaersofmax=&advsearch=on')
        soup = BeautifulSoup(res, "html.parser")
        posts = soup.find_all('a', class_='bgbackitem')
        if posts:
            print(f'\n***********************\ntitle founded in zarfilm\n***********************')
            print(f'\n***********************\ntrying to get title data...\n***********************')
            link = posts[0]['href']
            return {'status': True, 'url': link}
        else:
            return {'status': False}
    except:
        return {'status': False}

def extract_dl_links_from_zarfilm(url: str, requested_season: int, requested_quality: str):
    primary_download_links = {}
    try:
        print(f'\n***********************\ntrying to get info from {url}\n***********************')
        res = send_request_to_zarfilm(url)
        soup = BeautifulSoup(res, "html.parser")
        download_boxes = soup.find_all('div', class_='row_season_n_dl')
        if download_boxes:
            is_series = True
            print(f'\n***********************\ntitle is tv show.\n***********************')
            for download_box in download_boxes:
                dl_links = download_box.find_all('div',class_='item_quality_n_row')
                for dl_link in dl_links:
                    quality_meta_data = dl_link.find('div',class_='item_meta_qu_r_n quality_item_meta')
                    quality_data = quality_meta_data.find('div',class_='value_meta_qu').get_text()
                    file_type = quality_meta_data.find('div', class_='label_row_q_n').get_text()
                    file_size = dl_link.find('div',class_='item_meta_qu_r_n size_item_meta').find_all('div')[-1].get_text()
                    print(f'\n----- quality and encoder: {quality_data} file size(s): {file_size}')
                    download_permission = False
                    if 'GB' in file_size:
                        if float(file_size.split(' ')[0]) < 3.99:
                            download_permission = True
                    else:
                        if 'MB' in file_size:
                            if float(file_size.split(' ')[0]) < 3990:
                                download_permission = True
                    if download_permission:
                        _, quality = identify_quality(quality_data)
                        _, encoder = identify_encoder_and_release(quality_data)
                        if (requested_quality == quality) or (requested_quality == 'all'):
                            if encoder == '':
                                encoder = 'unknown'
                            if file_type != 'دوبله':
                                dls = dl_link.find_all('a', class_='dllinkhref')
                                if file_type == 'زیرنویس':
                                    file_type = 'SoftSub'
                                for dl in dls:
                                    dl_url = dl['href']
                                    if dl_url == 'https://zarfilm.com/pricing/':
                                        data = {
                                            'chat_id': SUDO[0],
                                            'text': 'Zarfilm account logged out!'
                                        }
                                        send_request(MOVIEO_TELEGRAM_API, 'sendMessage', data)
                                        return {'status': False}
                                    else:
                                        file_name = dl_url.split('/')[-1].split('?')[0]
                                        season = identify_seasons(file_name)
                                        if (requested_season == season) or (requested_season == 100):
                                            primary_download_links.setdefault(season, {})
                                            primary_download_links[season].setdefault(quality, {})
                                            primary_download_links[season][quality].setdefault(encoder, {})
                                            primary_download_links[season][quality][encoder]['file_size'] = file_size
                                            primary_download_links[season][quality][encoder]['file_type'] = file_type
                                            primary_download_links[season][quality][encoder].setdefault('dl_links', []).append(dl_url)
        else:
            is_series = False
            print(f'\n***********************\ntitle is movie.\n***********************')
            season = 100
            download_boxes = soup.find_all('div', class_='inner_dl_box_n_single')
            for download_box in download_boxes:
                file_type = download_box.find('h3').get_text()
                if file_type == 'نسخه زیرنویس فارسی چسبیده':
                    file_type = 'SoftSub'
                    dl_links = download_box.find_all('div', class_='item_row_dl')
                    for dl_link in dl_links:
                        quality_meta_data = dl_link.find('div', class_='meta_row')
                        quality_data = dl_link.find('span', class_='quality_name').get_text()
                        encoder = dl_link.find('span', class_='encoder_name').get_text()
                        file_size = quality_meta_data.find('div', class_='size_meta').find_all('span')[-1].get_text()
                        print(f'\n----- quality and encoder: {quality_data} file size(s): {file_size}')
                        download_permission = False
                        if 'GB' in file_size:
                            if float(file_size.split(' ')[0]) < 3.99:
                                download_permission = True
                        else:
                            if 'MB' in file_size:
                                if float(file_size.split(' ')[0]) < 3990:
                                    download_permission = True
                        if download_permission:
                            _, quality = identify_quality(quality_data)
                            _, encoder = identify_encoder_and_release(encoder)
                            if (requested_quality == quality) or (requested_quality == 'all'):
                                if encoder == '':
                                    encoder = 'unknown'
                                dls = dl_link.find_all('a', class_='dllink')
                                for dl in dls:
                                    dl_url = dl['href']
                                    if dl_url == 'https://zarfilm.com/pricing/':
                                        data = {
                                            'chat_id': SUDO[0],
                                            'text': 'Zarfilm account logged out!'
                                        }
                                        send_request(MOVIEO_TELEGRAM_API, 'sendMessage', data)
                                        return {'status': False}
                                    else:
                                        primary_download_links.setdefault(season, {})
                                        primary_download_links[season].setdefault(quality, {})
                                        primary_download_links[season][quality].setdefault(encoder, {})
                                        primary_download_links[season][quality][encoder]['file_size'] = file_size
                                        primary_download_links[season][quality][encoder]['file_type'] = file_type
                                        primary_download_links[season][quality][encoder].setdefault('dl_links', []).append(dl_url)
        final_download_links = []
        for season, qualities in primary_download_links.items():
            for q in QUALITY_PRIORITY:
                if q not in qualities:
                    continue

                encoders = qualities[q]

                selected = None
                for encoder, data in encoders.items():
                    if encoder != "unknown":
                        selected = data
                        break

                if not selected:
                    selected = next(iter(encoders.values()))

                final_download_links.extend(selected["dl_links"])

                break
        if final_download_links:
            return {'status': True, 'source': 'zarfilm', 'is_series': is_series, 'dl_links': final_download_links}
        else:
            return {'status': False}
    except:
        return {'status': False}