from .base import BaseVideoPlayer
from bs4 import BeautifulSoup
import re
import httpx


class UnFichierDownloader(BaseVideoPlayer):
    """Downloader for 1fichier.com"""

    def can_handle(self, url: str) -> bool:
        return any(domain in url.lower() for domain in ["1fichier.com", "1fichier.fr"])

    async def get_download_link(self, url: str) -> tuple[str, str]:
        try:
            # Initial page
            response = await self.client.get(url)
            response.raise_for_status()

            # Check if we need to wait (download button)
            soup = BeautifulSoup(response.text, 'lxml')

            # Check for direct download link
            download_link = soup.find('a', class_='btn btn-download')
            if download_link and download_link.get('href'):
                download_url = download_link['href']
                # Follow to get headers for filename
                head_resp = await self.client.head(download_url)
                filename = self._extract_filename_from_headers(head_resp.headers)
                if not filename:
                    filename = download_url.split('/')[-1] or "downloaded_file"
                return download_url, filename

            # Alternative: look for any download link in the page
            for link in soup.find_all('a', href=True):
                href = link['href']
                if href.startswith('http') and '1fichier' not in href:
                    # Try to head the URL to see if it's a file
                    try:
                        head_resp = await self.client.head(href, timeout=5.0)
                        if 'content-length' in head_resp.headers or 'attachment' in head_resp.headers.get('content-disposition', ''):
                            filename = self._extract_filename_from_headers(head_resp.headers)
                            if not filename:
                                filename = href.split('/')[-1] or "downloaded_file"
                            return href, filename
                    except:
                        continue

            raise Exception("Could not find download link on page")

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