import time
import os
from typing import Dict, Any, Optional
from automation.platform_handlers.base_handler import BasePlatformHandler

class TikTokHandler(BasePlatformHandler):
    PLATFORM_NAME = "TikTok"
    BASE_URL = "https://www.tiktok.com/tiktokstudio/upload"

    def phase_upload(self, page, flyer_path: str, guide: Optional[Dict[str, Any]] = None) -> bool:
        """
        Sesi 1: Upload Media
        Membuka halaman Creator Upload TikTok Studio, memeriksa login, dan mengunggah berkas.
        """
        upload_url = (guide and guide.get("direct_upload_url")) or self.BASE_URL
        self.log(f"Membuka halaman Creator Upload TikTok ({upload_url})...")
        page.goto(upload_url, wait_until="domcontentloaded", timeout=45000)
        time.sleep(4)
        self.dismiss_common_modals(page)
        self.setup_clipboard_interceptor(page)

        # Cek apakah akun membutuhkan login
        if self.check_login_required(page, guide):
            self.log("TikTok meminta login. Silakan login akun TikTok terlebih dahulu di jendela Chrome Bot!", "ERROR")
            return False

        # Upload Media
        self.log("Mengunggah file media ke TikTok...")
        abs_flyer = os.path.abspath(flyer_path)
        file_uploaded = False

        file_inputs = page.locator("input[type='file'], input[accept*='video'], input[accept*='image']").all()
        for finp in file_inputs:
            try:
                finp.set_input_files(abs_flyer)
                file_uploaded = True
                self.log("Media berhasil dipasang ke input file TikTok.")
                time.sleep(4)
                break
            except Exception:
                continue

        if not file_uploaded and self.brain:
            self.log("Input file TikTok belum ditemukan via CSS. Memanggil AI Vision...", "WARN")
            v_res = self.consult_vision(page, "Cari tombol 'Select video' atau area kotak drag-and-drop unggah file di TikTok Studio.")
            if v_res.get("coordinates_percent"):
                self.click_visual_target(page, v_res, step_name="tiktok_upload_area")
                time.sleep(1.5)
                try:
                    page.locator("input[type='file']").first.set_input_files(abs_flyer)
                    file_uploaded = True
                    time.sleep(3)
                except Exception:
                    pass

        # Verifikasi proses upload
        is_verified = False
        for _ in range(5):
            preview = page.locator("div[class*='preview'], div[class*='stage'], div[class*='player'], div:has-text('Uploaded')").first
            if preview.is_visible(timeout=1500) or file_uploaded:
                is_verified = True
                self.log("Verifikasi Sesi 1 Sukses: Media terpasang di TikTok Studio!", "SUCCESS")
                break
            time.sleep(1.5)

        return is_verified

    def phase_metadata(self, page, title: str, caption: str, target_link: Optional[str] = None, guide: Optional[Dict[str, Any]] = None) -> bool:
        """
        Sesi 2: Content & Metadata
        Mengisi caption pada editor TikTok Studio.
        """
        self.log("Mengisi caption TikTok...")
        full_caption = f"{title}\n{caption}"
        if target_link:
            full_caption += f"\n{target_link}"

        caption_box = page.locator("div[contenteditable='true'], div[role='combobox'], .caption-markup-focusable, div[data-placeholder*='caption']").first
        if caption_box.is_visible(timeout=8000):
            caption_box.click()
            time.sleep(0.5)
            page.keyboard.type(full_caption[:150], delay=15)
            time.sleep(2)
            self.log("Sesi 2 Sukses: Caption TikTok berhasil diisi.", "SUCCESS")
            return True
        else:
            self.log("Kolom caption TikTok tidak ditemukan.", "ERROR")
            return False

    def phase_publish(self, page, guide: Optional[Dict[str, Any]] = None) -> bool:
        """
        Sesi 3: Publish
        Menekan tombol Post / Publish pada TikTok Studio.
        """
        self.log("Menekan tombol Post / Publish TikTok...")
        post_btn = page.locator("button[data-e2e='post-publish-button'], button:has-text('Post'), button:has-text('Posting'), button:has-text('Publish')").first
        submitted = False
        if post_btn.is_visible(timeout=5000):
            post_btn.click()
            submitted = True
        elif self.brain:
            self.log("Tombol Post TikTok tidak ditemukan via CSS. Memanggil AI Vision...", "WARN")
            v_res = self.consult_vision(page, "Cari tombol merah 'Post' atau 'Posting' di bagian bawah halaman TikTok Studio.")
            if v_res.get("coordinates_percent"):
                submitted = self.click_visual_target(page, v_res, step_name="tiktok_post_btn")

        if not submitted:
            return False

        self.log("Menunggu proses posting di server TikTok (8 detik)...")
        time.sleep(8)
        return True

    def phase_extract_link(self, page, title: str, guide: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
        """
        Sesi 4: Ekstraksi Tautan Postingan
        Mendeteksi permalink video spesifik (/video/...) dari TikTok Studio atau clipboard interceptor.
        """
        self.log("Mendeteksi tautan postingan spesifik TikTok...")
        post_url = None

        # 1. Cek clipboard interceptor
        c = self.get_intercepted_clipboard(page)
        if c and "/video/" in c:
            post_url = c
            self.log(f"Tautan video terdeteksi dari clipboard interceptor: {post_url}", "SUCCESS")

        # 2. Cek tautan Manage your posts / View video
        if not post_url:
            try:
                video_link = page.locator("a[href*='/video/']").first
                if video_link.is_visible(timeout=3000):
                    href = video_link.get_attribute("href")
                    if href and "/video/" in href:
                        post_url = href if href.startswith("http") else f"https://www.tiktok.com{href}"
                        self.log(f"Tautan video TikTok terverifikasi: {post_url}", "SUCCESS")
            except Exception:
                pass

        # 3. Cek URL browser langsung
        if not post_url and "/video/" in page.url:
            post_url = page.url
            self.log(f"URL browser mengarah ke video TikTok: {post_url}", "SUCCESS")

        if not post_url or "/video/" not in post_url:
            self.log("Tautan video spesifik TikTok (/video/...) tidak dapat disalin otomatis. Tidak mencatat link profil.", "ERROR")
            return {
                "success": False,
                "post_url": None,
                "message": "FAILED: Konten terkirim tapi tautan video spesifik (/video/...) tidak dapat disalin."
            }

        self.log(f"Posting TikTok sukses! Tautan: {post_url}", "SUCCESS")
        return {
            "success": True,
            "post_url": post_url,
            "message": "Konten berhasil diunggah & diverifikasi di TikTok!"
        }
