"""
STT Python Binding
==================

A Python interface for the Spherical Triangular Tessellation (STT) generator.

This module provides access to the C++ STT library for generating spherical 
triangular tessellations on various reference systems.

Basic Usage:
------------
>>> import stt
>>> generator = stt.SttGenerator()
>>> generator.set_tree_depth(3, 8)
>>> generator.set_reference_system("WGS84")
>>> generator.run("output.msh")

Quick Creation:
--------------
>>> import stt
>>> info = stt.create_stt(3, 8, "WGS84", "output.msh")
>>> print(info)

Progress Callback (for Jupyter notebooks):
-----------------------------------------
>>> import stt
>>> def my_progress(description, percentage):
...     print(f"{description}: {percentage:.1f}%")
...
>>> generator = stt.SttGenerator()
>>> generator.set_progress_callback(my_progress)
>>> generator.run("output.msh")

Advanced Usage:
--------------
>>> import stt
>>> generator = stt.SttGenerator()
>>> params = {
...     "output_msh": "output.msh",
...     "output_vertex": "vertices.txt",
...     "control_points": "points.txt",
...     "topography": "topo.txt"
... }
>>> generator.run_full(params)
"""

from .stt import (
    SttGenerator,
    create_stt,
    WGS84,
    EARTH,
    MOON,
    __version__
)

__all__ = [
    'SttGenerator',
    'create_stt',
    'WGS84',
    'EARTH',
    'MOON',
    '__version__',
    'get_info',
    'help'
]

# 模块信息
__author__ = 'STT Development Team'
__email__ = 'yizhang-geo@zju.edu.cn'
__license__ = 'MIT'
__url__ = 'https://github.com/your-repo/stt'

def get_info():
    """获取STT模块信息"""
    return {
        'version': __version__,
        'author': __author__,
        'email': __email__,
        'license': __license__,
        'url': __url__
    }

def help():
    """显示帮助信息"""
    print(__doc__)

# Jupyter notebook进度条支持
try:
    # 尝试导入tqdm用于更好的进度条支持
    from tqdm import tqdm
    HAS_TQDM = True
    
    class TqdmProgressCallback:
        """使用tqdm的进度回调"""
        def __init__(self, description="Progress"):
            self.pbar = tqdm(total=100, desc=description)
            self.current_description = description
        
        def __call__(self, description, percentage):
            if description != self.current_description:
                self.pbar.set_description(description)
                self.current_description = description
            self.pbar.n = int(percentage)
            self.pbar.refresh()
            if percentage >= 100:
                self.pbar.close()
        
        def close(self):
            if self.pbar:
                self.pbar.close()
    
    def create_tqdm_callback(description="STT Progress"):
        """创建tqdm进度回调"""
        return TqdmProgressCallback(description)
    
    __all__.extend(['TqdmProgressCallback', 'create_tqdm_callback'])
    
except ImportError:
    HAS_TQDM = False
    
    class SimpleProgressCallback:
        """简单的文本进度回调"""
        def __init__(self, description="Progress"):
            self.current_description = description
            self.last_percentage = -1
        
        def __call__(self, description, percentage):
            if description != self.current_description:
                print(f"\n{description}:")
                self.current_description = description
            if int(percentage) != int(self.last_percentage):
                print(f"  {percentage:.1f}%", end='\r')
                self.last_percentage = percentage
            if percentage >= 100:
                print("  100.0%")
    
    def create_simple_callback(description="STT Progress"):
        """创建简单进度回调"""
        return SimpleProgressCallback(description)
    
    __all__.extend(['SimpleProgressCallback', 'create_simple_callback'])

# 自动选择最佳的进度回调
def create_progress_callback(description="STT Progress", use_tqdm=None):
    """
    创建适合的进度回调函数
    
    参数:
        description: 进度条描述
        use_tqdm: 是否强制使用tqdm，None表示自动选择
    
    返回:
        进度回调函数
    """
    if use_tqdm is None:
        use_tqdm = HAS_TQDM
    
    if use_tqdm and HAS_TQDM:
        return create_tqdm_callback(description)
    else:
        return create_simple_callback(description)