﻿import json
import os
import time

import requests


def load_dotenv(path):
    if not os.path.exists(path):
        return
    with open(path, "r", encoding="utf-8") as env_file:
        for raw_line in env_file:
            line = raw_line.strip()
            if not line or line.startswith("#") or "=" not in line:
                continue
            key, value = line.split("=", 1)
            key = key.strip()
            value = value.strip().strip('"').strip("'")
            if key and key not in os.environ:
                os.environ[key] = value


ROOT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), ".."))
load_dotenv(os.path.join(ROOT_DIR, ".env"))

BOT_TOKEN = os.getenv("TELEGRAM_BOT_TOKEN", "").strip()
WARRANTY_API_BASE = os.getenv("WARRANTY_API_BASE", "https://gswapi.gscrm.ir").strip()
WARRANTY_API_TOKEN = os.getenv("WARRANTY_API_TOKEN", "").strip()

POLL_TIMEOUT = 30
REQUEST_TIMEOUT = 30

PERSIAN_DIGITS = "۰۱۲۳۴۵۶۷۸۹"
ARABIC_DIGITS = "٠١٢٣٤٥٦٧٨٩"
LATIN_DIGITS = "0123456789"
DIGIT_TRANSLATION = str.maketrans(PERSIAN_DIGITS + ARABIC_DIGITS, LATIN_DIGITS + LATIN_DIGITS)


if not BOT_TOKEN:
    raise SystemExit("TELEGRAM_BOT_TOKEN is missing in .env")


def telegram_api(method, payload=None):
    url = f"https://api.telegram.org/bot{BOT_TOKEN}/{method}"
    response = requests.post(url, json=payload or {}, timeout=REQUEST_TIMEOUT)
    response.raise_for_status()
    data = response.json()
    if not data.get("ok"):
        raise RuntimeError(f"Telegram API error: {data}")
    return data.get("result")


def send_message(chat_id, text):
    telegram_api("sendMessage", {"chat_id": chat_id, "text": text})


def normalize_serial(text):
    normalized = text.translate(DIGIT_TRANSLATION)
    return "".join(normalized.split())


def format_date(value):
    if not value:
        return "-"
    if "T" in value:
        return value.split("T", 1)[0]
    return value


def safe_value(value):
    if value is None:
        return "-"
    if isinstance(value, str):
        return value.strip() or "-"
    return str(value)


def fetch_warranty(serial):
    url = f"{WARRANTY_API_BASE.rstrip('/')}/api/warranty/inquiry/{serial}"
    headers = {"Accept": "application/json"}
    if WARRANTY_API_TOKEN:
        auth_value = WARRANTY_API_TOKEN
        if " " not in auth_value:
            auth_value = f"Basic {auth_value}"
        headers["Authorization"] = auth_value
    response = requests.get(url, headers=headers, timeout=REQUEST_TIMEOUT)
    if response.status_code == 404:
        return []
    response.raise_for_status()
    try:
        data = response.json()
    except json.JSONDecodeError:
        return None
    if not isinstance(data, list):
        return None
    return data


def build_response(items):
    if not items:
        return "برای این سریال، نتیجه ای پیدا نشد. لطفاً شماره را بررسی کنید."

    blocks = []
    for index, item in enumerate(items, start=1):
        header = "اطلاعات گارانتی" if len(items) == 1 else f"اطلاعات گارانتی {index}"
        lines = [
            f"{header}:",
            f"نام محصول: {safe_value(item.get('productName'))}",
            f"سریال محصول: {safe_value(item.get('productSerial'))}",
            f"سریال گارانتی: {safe_value(item.get('warrantySerial'))}",
            f"مدت گارانتی (ماه): {safe_value(item.get('duration'))}",
            f"تاریخ شروع: {format_date(safe_value(item.get('startDate')))}",
            f"تاریخ پایان: {format_date(safe_value(item.get('endDate')))}",
            f"سریال رهگیری: {safe_value(item.get('trackingSerial'))}",
            f"نام شرکت: {safe_value(item.get('warrantySerialName'))}",
            f"نام گارانتی: {safe_value(item.get('warrantyName'))}",
        ]
        blocks.append("\n".join(lines))

    return "\n\n".join(blocks)


def handle_message(message):
    chat = message.get("chat") or {}
    chat_id = chat.get("id")
    if not chat_id:
        return

    text = (message.get("text") or "").strip()
    if not text:
        send_message(chat_id, "لطفاً شماره سریال را به صورت متن ارسال کنید.")
        return

    if text.startswith("/start"):
        send_message(
            chat_id,
            "خوش آمدید!\nلطفاً کد/سریال گارانتی را ارسال کنید.\nمثال: 4001852578344",
        )
        return

    if text.startswith("/help"):
        send_message(chat_id, "برای استعلام گارانتی، شماره سریال را ارسال کنید.")
        return

    serial = normalize_serial(text)
    if not serial:
        send_message(chat_id, "شماره سریال نامعتبر است. لطفاً دوباره ارسال کنید.")
        return

    send_message(chat_id, "در حال بررسی اطلاعات گارانتی...")

    try:
        items = fetch_warranty(serial)
    except requests.RequestException:
        send_message(chat_id, "مشکلی در ارتباط با سرویس گارانتی پیش آمد. لطفاً بعداً تلاش کنید.")
        return
    if items is None:
        send_message(chat_id, "پاسخ سرویس گارانتی نامعتبر بود. لطفاً بعداً تلاش کنید.")
        return

    response_text = build_response(items)
    send_message(chat_id, response_text)


def main():
    offset = 0
    print("Telegram bot is running...")
    while True:
        try:
            updates = telegram_api("getUpdates", {"timeout": POLL_TIMEOUT, "offset": offset})
        except requests.RequestException:
            time.sleep(3)
            continue
        except RuntimeError:
            time.sleep(3)
            continue

        for update in updates:
            offset = max(offset, update.get("update_id", 0) + 1)
            message = update.get("message")
            if message:
                handle_message(message)


if __name__ == "__main__":
    main()
