import argparse
import sys

from lark_common import (
    LarkApiError,
    api_request,
    configure_output_encoding,
    get_tenant_access_token,
    load_dotenv,
)


def parse_args():
    parser = argparse.ArgumentParser(
        description="List chats that the Lark app bot can access."
    )
    parser.add_argument(
        "--page-size",
        type=int,
        default=100,
        help="Number of chats per request. Default: 100.",
    )
    parser.add_argument(
        "--name",
        default="",
        help="Optional keyword to filter chat names locally.",
    )
    return parser.parse_args()


def list_chats(page_size):
    token = get_tenant_access_token()
    page_token = ""
    items = []

    while True:
        query = {"page_size": page_size}
        if page_token:
            query["page_token"] = page_token

        payload = api_request("GET", "/im/v1/chats", token=token, query=query)
        data = payload.get("data", {})
        items.extend(data.get("items", []))

        if not data.get("has_more"):
            break
        page_token = data.get("page_token", "")
        if not page_token:
            break

    return items


def print_chats(chats):
    if not chats:
        print("No chats found.")
        return

    rows = []
    for index, chat in enumerate(chats, 1):
        rows.append(
            [
                str(index),
                chat.get("name") or "",
                chat.get("chat_id") or "",
                chat.get("chat_mode") or "",
                chat.get("chat_type") or "",
            ]
        )

    headers = ["#", "name", "chat_id", "mode", "type"]
    widths = [
        max(len(headers[col]), *(len(row[col]) for row in rows))
        for col in range(len(headers))
    ]

    print("  ".join(headers[col].ljust(widths[col]) for col in range(len(headers))))
    print("  ".join("-" * widths[col] for col in range(len(headers))))
    for row in rows:
        print("  ".join(row[col].ljust(widths[col]) for col in range(len(row))))


def main():
    configure_output_encoding()
    load_dotenv()
    args = parse_args()
    chats = list_chats(args.page_size)

    if args.name:
        keyword = args.name.lower()
        chats = [chat for chat in chats if keyword in (chat.get("name") or "").lower()]

    print_chats(chats)


if __name__ == "__main__":
    try:
        main()
    except (RuntimeError, LarkApiError) as exc:
        print(f"ERROR: {exc}", file=sys.stderr)
        if isinstance(exc, LarkApiError) and exc.log_id:
            print(f"X-Tt-Logid: {exc.log_id}", file=sys.stderr)
        sys.exit(1)
