import argparse
import os
import shutil
import subprocess
import sys


def clean():
    """Xóa thư mục build và dist cũ."""
    print("--- Đang dọn dẹp thư mục build/dist cũ... ---")
    dirs_to_delete = ["dist", "build", "src/dxlabs.egg-info"]
    for directory in dirs_to_delete:
        if os.path.exists(directory):
            shutil.rmtree(directory)
            print(f"Đã xóa {directory}")


def build():
    """Build project thành .tar.gz và .whl."""
    print("\n--- Đang build package... ---")
    try:
        subprocess.run([sys.executable, "-m", "build"], check=True)
    except subprocess.CalledProcessError:
        print(
            "Lỗi: Build thất bại. Hãy đảm bảo bạn đã cài đặt thư viện 'build' (pip install build)."
        )
        sys.exit(1)


def check():
    """Kiểm tra tính hợp lệ của package với twine."""
    print("\n--- Đang kiểm tra package với twine... ---")
    try:
        subprocess.run([sys.executable, "-m", "twine", "check", "dist/*"], check=True)
    except subprocess.CalledProcessError:
        print("Lỗi: Kiểm tra package thất bại.")
        sys.exit(1)


def upload(test=False):
    """Upload package lên PyPI hoặc TestPyPI."""
    if test:
        print("\n--- Đang upload lên TestPyPI... ---")
        repo_args = ["--repository", "testpypi"]
    else:
        print("\n--- Đang upload lên PyPI chính thức... ---")
        repo_args = []

    try:
        cmd = (
            [sys.executable, "-m", "twine", "upload"]
            + repo_args
            + ["dist/*"]
            + ["--verbose"]
        )
        subprocess.run(cmd, check=True)
        print("\n--- Upload thành công! ---")
    except subprocess.CalledProcessError:
        print("\nLỗi: Upload thất bại. Hãy kiểm tra lại credentials của bạn.")
        sys.exit(1)


def main():
    parser = argparse.ArgumentParser(
        description="Script build và upload package dxlabs lên PyPI."
    )
    parser.add_argument(
        "--test",
        action="store_true",
        help="Upload lên TestPyPI thay vì PyPI chính thức.",
    )
    parser.add_argument(
        "--no-upload", action="store_true", help="Chỉ build mà không upload."
    )
    args = parser.parse_args()

    # Đảm bảo đang ở thư mục gốc của project
    if not os.path.exists("pyproject.toml"):
        print(
            "Lỗi: Vui lòng chạy script này từ thư mục gốc của project (nơi có pyproject.toml)."
        )
        sys.exit(1)

    clean()
    build()
    check()

    if not args.no_upload:
        upload(test=args.test)
    else:
        print("\n--- Đã build xong. Skip bước upload. ---")


if __name__ == "__main__":
    main()
