#!/usr/bin/env python3
"""
کانکت‌کردن اکانت کاربری برای ارسال گیفت — فراخوانی‌شده از پنل ادمین (PHP)
دو مرحله‌ای؛ بین دو مرحله، فایل سشن و فایل هَش در workdir نگه داشته می‌شوند.
phone_code_hash دیگر دستی پاس داده نمی‌شود؛ خود اسکریپت ذخیره/بازخوانی می‌کند.

مرحله ۱ (ارسال کد):
    gift_login.py send <api_id> <api_hash> <phone> <workdir>
    خروجی موفق:  OK

مرحله ۲ (ورود):
    gift_login.py signin <api_id> <api_hash> <phone> <workdir> <code> [password]
    خروجی موفق:  OK <session_string>
    اگر رمز دو مرحله‌ای لازم بود و password داده نشده:  NEEDPASS

خروجی خطا:  ERR <message>
"""
import sys, os, asyncio, re


def session_name(phone: str) -> str:
    return "login_" + re.sub(r"\D", "", phone)


def hash_path(workdir: str, phone: str) -> str:
    return os.path.join(workdir, session_name(phone) + ".hash")


async def do_send(api_id, api_hash, phone, workdir):
    from pyrogram import Client
    os.makedirs(workdir, exist_ok=True)
    app = Client(session_name(phone), api_id=api_id, api_hash=api_hash, workdir=workdir)
    await app.connect()
    try:
        sent = await app.send_code(phone)
        # هَش را کنار سشن ذخیره می‌کنیم تا مرحلهٔ signin خودش بخواندش
        with open(hash_path(workdir, phone), "w") as f:
            f.write(sent.phone_code_hash)
        print("OK")
    finally:
        await app.disconnect()


async def do_signin(api_id, api_hash, phone, workdir, code, password):
    from pyrogram import Client
    from pyrogram.errors import SessionPasswordNeeded

    hp = hash_path(workdir, phone)
    if not os.path.isfile(hp):
        print("ERR no phone_code_hash (مرحله ارسال کد را دوباره انجام بده)")
        sys.exit(1)
    with open(hp) as f:
        phone_code_hash = f.read().strip()

    app = Client(session_name(phone), api_id=api_id, api_hash=api_hash, workdir=workdir)
    await app.connect()
    try:
        need_password = False
        try:
            await app.sign_in(phone, phone_code_hash, code)
        except SessionPasswordNeeded:
            need_password = True
        except Exception:
            # احتمالاً کد در فراخوانی قبلی (مرحلهٔ NEEDPASS) مصرف شده و فقط رمز مانده.
            # اگر رمز داریم مستقیم check_password را امتحان می‌کنیم؛ وگرنه خطا را بالا می‌دهیم.
            if password:
                need_password = True
            else:
                raise

        if need_password:
            if not password:
                print("NEEDPASS")
                return
            await app.check_password(password)

        ss = await app.export_session_string()
        # هَش مصرف شد؛ پاکش می‌کنیم
        try:
            os.remove(hp)
        except OSError:
            pass
        print("OK " + ss)
    finally:
        await app.disconnect()


async def main():
    if len(sys.argv) < 2:
        print("ERR missing subcommand")
        sys.exit(1)

    sub = sys.argv[1]
    try:
        if sub == "send":
            api_id, api_hash, phone, workdir = int(sys.argv[2]), sys.argv[3], sys.argv[4], sys.argv[5]
            await do_send(api_id, api_hash, phone, workdir)
        elif sub == "signin":
            api_id, api_hash, phone, workdir = int(sys.argv[2]), sys.argv[3], sys.argv[4], sys.argv[5]
            code = sys.argv[6]
            password = sys.argv[7] if len(sys.argv) > 7 else None
            await do_signin(api_id, api_hash, phone, workdir, code, password)
        else:
            print("ERR unknown subcommand")
            sys.exit(1)
    except Exception as e:
        print(f"ERR {e}")
        print(f"ERR {e}", file=sys.stderr)
        sys.exit(1)


if __name__ == "__main__":
    asyncio.run(main())
