import os, subprocess, shlex
from pathlib import Path

'''
執行已經寫好的腳本 並提供主程式檢查目前下載的 python script
'''
def list_scripts(directory, extensions):
    path = Path(directory)
    if not path.exists() or not path.is_dir():
        print(f"資料夾 {directory} 不存在或不是一個資料夾。")
        return []
    return [f for f in path.iterdir() if f.is_file() and f.suffix in extensions]

def run_script(args, filename):
    if not os.path.exists(filename):
        print("沒有找到可執行的程式檔案。")
        return
    return execute_script(args, filename)

def execute_script(args, script_path):
    try:
        if Path(script_path).suffix == '.py':
            # 將 args 解析成命令列參數列表（若沒有參數則傳空列表）, 使用者如果需要傳遞包含空白的參數，可以透過引號來保護該參數 (['arg1', 'arg with spaces', 'arg3'])
            arg_list = shlex.split(args) if args else []
            # 將參數加入命令列中，目標 script 可透過 sys.argv 讀取
            process = subprocess.Popen(
                ['python', str(script_path)] + arg_list, 
                stdout=subprocess.PIPE,
                stderr=subprocess.PIPE,
                text=True
            )
            stdout, stderr = process.communicate()
            if stderr:
                print(f"執行警告/錯誤: {stderr}")
            return stdout
        else:
            print(f"不支援的檔案類型: {script_path}")
            return None
    except subprocess.CalledProcessError as e:
        print(f"執行 {script_path} 時發生錯誤: {e}")
        return None
    except Exception as e:
        print(f"執行 {script_path} 時發生未預期的錯誤: {e}")
        return None

'''
Test the script service including execute_script, run_script, and list_scripts

def main():
    directory = './test_script'  # 修改為您的腳本目錄
    extensions = ['.py']
    
    # 列出所有可執行的腳本
    scripts = list_scripts(directory, extensions)
    if not scripts:
        print("找不到可執行的腳本。")
        return
    
    # 顯示可用腳本
    print("可用的腳本：")
    for i, script in enumerate(scripts, 1):
        print(f"{i}. {script.name}")
    
    # 選擇腳本
    try:
        choice = int(input("請選擇要執行的腳本編號: ")) - 1
        if 0 <= choice < len(scripts):
            selected_script = scripts[choice]
            
            # 取得輸入參數 (以空白分隔)
            args = input("請輸入要傳遞給腳本的參數 (以空白分隔): ")
            
            # 執行腳本並獲取結果
            result = run_script(args, selected_script)
            if result:
                print(f"執行結果：\n{result}")
        else:
            print("無效的選擇。")
    except ValueError:
        print("請輸入有效的數字。")

if __name__ == "__main__":
    main()
'''
