from .base import BaseVideoPlayer
from bs4 import BeautifulSoup
import re
from urllib.parse import urljoin


class SibnetDownloader(BaseVideoPlayer):
    """Downloader for sibnet.ru video player"""

    def can_handle(self, url: str) -> bool:
        return 'sibnet.ru' in url.lower()

    async def get_download_link(self, url: str, target_filename: str = None) -> tuple[str, str]:
        """
        Extract download link from Sibnet video page
        Sibnet uses a JavaScript player with direct MP4 links
        """
        try:
            print(f"[SIBNET] Extracting link from: {url}")

            # If it's already a direct MP4 URL, return it as-is
            if url.endswith('.mp4'):
                print(f"[SIBNET] Direct MP4 URL detected")
                filename = url.split('/')[-1] or "sibnet_video.mp4"
                return url, filename

            # Fetch the video page
            response = await self.client.get(
                url,
                headers={
                    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36'
                }
            )

            # Parse HTML to find the video source
            soup = BeautifulSoup(response.text, 'lxml')

            # Look for player.src in JavaScript
            # Pattern: player.src([{src: "/v/HASH/ID.mp4", type: "video/mp4"},]);
            script_tags = soup.find_all('script')
            video_url = None

            for script in script_tags:
                if script.string:
                    # Look for player.src pattern
                    match = re.search(r'player\.src\(\[\{src:\s*"([^"]+\.mp4)"', script.string)
                    if match:
                        video_url = match.group(1)
                        break

                    # Alternative pattern
                    match = re.search(r'"([^"]+\.mp4)"[^}]*type:\s*"video/mp4"', script.string)
                    if match:
                        video_url = match.group(1)
                        # Make sure it's from /v/ directory
                        if video_url.startswith('/v/'):
                            break
                        video_url = None

            if not video_url:
                # Try to find any .mp4 URL in the page
                mp4_match = re.search(r'"/v/[^"]+\.mp4"', response.text)
                if mp4_match:
                    video_url = mp4_match.group(0).strip('"')

            if not video_url:
                raise Exception("Could not find video URL in Sibnet page")

            # Convert relative URL to absolute
            if video_url.startswith('/'):
                video_url = urljoin('https://video.sibnet.ru/', video_url)

            print(f"[SIBNET] Found video URL: {video_url[:80]}...")

            # Generate filename from URL or use default
            filename_match = re.search(r'/([^/]+)\.mp4', video_url)
            if filename_match:
                filename = f"{filename_match.group(1)}.mp4"
            else:
                filename = "sibnet_video.mp4"

            return video_url, filename

        except Exception as e:
            raise Exception(f"Error extracting Sibnet link: {str(e)}")
