#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import re
import json
import urllib.parse
import requests
import time
import os

INPUT_FILE = "linkss.txt"
OUTPUT_FILE = "linkss-back.txt"

TOKEN = "d70819df76f2475eab11eee5aee4a26a"
USER_ID = "1174608"
API_BASE = "https://api-tviz.com/api-path/win/2/single"
REQUEST_TIMEOUT = 8


# -----------------------------------
#   استخراج real URL از url=
# -----------------------------------
def extract_real_url(url: str):
    if "url=" not in url:
        return url
    try:
        encoded = url.split("url=")[1].split("&")[0]
        return urllib.parse.unquote(encoded)
    except:
        return url


# -----------------------------------
#   گرفتن آخرین قسمت URL (نام فایل)
# -----------------------------------
def get_exact_filename(url: str):
    try:
        path = urllib.parse.urlparse(url).path
        filename = path.split("/")[-1].split("?")[0]
        return urllib.parse.unquote(filename)
    except:
        return None


# -----------------------------------
#   پیمایش عمیق JSON
# -----------------------------------
def extract_all_strings(obj):
    if isinstance(obj, dict):
        for v in obj.values():
            yield from extract_all_strings(v)
    elif isinstance(obj, list):
        for item in obj:
            yield from extract_all_strings(item)
    elif isinstance(obj, str):
        yield obj


# -----------------------------------
#   پیدا کردن URL در JSON
#   بدون هیچ شرط endswith
# -----------------------------------
def find_url_in_json(json_data, target_filename: str):

    target_lower = target_filename.lower()

    for value in extract_all_strings(json_data):

        urls = re.findall(r'https?://[^\s\'"<>]+', value)
        if not urls:
            continue

        for url in urls:
            decoded = urllib.parse.unquote(url)
            decoded_lower = decoded.lower()

            # فقط شرط اصلی: نام فایل target داخل URL باشد
            # همین! بدون هیچ شرط دیگری.
            if target_lower in decoded_lower:
                return decoded  # لینک کامل با کوئری‌ها

    return None


# -----------------------------------
#   درخواست API
# -----------------------------------
def fetch_api_link(post_id: str, target_filename: str):

    params = {"post_id": post_id, "token": TOKEN, "user_id": USER_ID}

    try:
        r = requests.get(API_BASE, params=params, timeout=REQUEST_TIMEOUT)

        if r.status_code != 200:
            print(f"  HTTP {r.status_code}")
            return None

        try:
            json_data = r.json()
        except:
            print("  API JSON decode error")
            return None

        found = find_url_in_json(json_data, target_filename)

        if found:
            print(f"  MATCH: {os.path.basename(found).split('?')[0]}")
        else:
            print(f"  NO MATCH for: {target_filename}")

        return found

    except Exception as e:
        print(f"  ERROR: {e}")
        return None


# -----------------------------------
#   اجرای اصلی
# -----------------------------------
with open(INPUT_FILE, "r", encoding="utf-8", errors="replace") as infile, \
     open(OUTPUT_FILE, "w", encoding="utf-8") as outfile:

    for lineno, line in enumerate(infile, 1):
        line = line.rstrip("\n")

        if not line.strip():
            outfile.write("\n")
            continue

        if line.count(";") != 3:
            outfile.write(line + "\n")
            continue

        parts = line.split(";", 3)
        if len(parts) < 4:
            outfile.write(line + "\n")
            continue

        post_id = parts[0].strip()
        original_url = extract_real_url(parts[-1].strip())

        target_filename = get_exact_filename(original_url)

        if not target_filename:
            parts[-1] = original_url
            note = "invalid"
        else:
            print(f"[{lineno}] post_id={post_id} | target='{target_filename}'")
            api_link = fetch_api_link(post_id, target_filename)

            if api_link:
                parts[-1] = api_link
                note = "replaced"
            else:
                parts[-1] = original_url
                note = "kept"

        outfile.write(";".join(parts) + "\n")
        print(f"  → {note}\n")

        time.sleep(0.12)

print(f"\nتمام! '{OUTPUT_FILE}' نوشته شد.")
# جایگزینی فایل اصلی با نسخه جدید
os.remove(INPUT_FILE)
os.rename(OUTPUT_FILE, INPUT_FILE)
print("فایل اصلی با نسخه جدید جایگزین شد.")
