"""
utils.py — Tiện ích dùng chung
"""
import os
import sys

CONTRACT_DOWNLOAD_URL = "https://update.ini.vn/inihd/inihd.zip"
CONTRACT_GUIDE_FILENAME = "guid-contract.html"
_PROJECT_ROOT = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))

def get_resource_path(relative_path: str) -> str:
    """
    Lấy đường dẫn đến tài nguyên tĩnh (được đóng gói bên trong EXE).
    """
    if hasattr(sys, '_MEIPASS'):
        base_path = sys._MEIPASS
    else:
        base_path = _PROJECT_ROOT
    return os.path.join(base_path, relative_path)

def get_app_data_path(relative_path: str) -> str:
    """
    Lấy đường dẫn đến dữ liệu người dùng (nằm cùng thư mục với file EXE).
    Dùng cho settings.json, companies/, backups/...
    """
    if hasattr(sys, 'frozen'):
        # Nếu đang chạy từ file EXE
        base_path = os.path.dirname(sys.executable)
    else:
        # Nếu đang chạy từ mã nguồn (dev)
        base_path = _PROJECT_ROOT
    return os.path.join(base_path, relative_path)

def get_runtime_file_path(relative_path: str) -> str:
    """
    Ưu tiên file nằm cạnh EXE/mã nguồn để người dùng có thể mở trực tiếp.
    Nếu chưa có bản ngoài, fallback sang tài nguyên đóng gói trong bundle.
    """
    app_data_path = get_app_data_path(relative_path)
    if os.path.exists(app_data_path):
        return app_data_path
    return get_resource_path(relative_path)


def get_contract_guide_path() -> str:
    """
    Khi chạy mã nguồn, ưu tiên file guide trong src để chỉ có một nguồn nội dung.
    Khi chạy từ EXE, ưu tiên file guide nằm cạnh EXE rồi mới fallback vào bundle.
    """
    if hasattr(sys, 'frozen'):
        return get_runtime_file_path(CONTRACT_GUIDE_FILENAME)

    source_path = os.path.join(_PROJECT_ROOT, "src", CONTRACT_GUIDE_FILENAME)
    if os.path.exists(source_path):
        return source_path
    return get_runtime_file_path(CONTRACT_GUIDE_FILENAME)

def build_contract_software_guide_block() -> str:
    """Khối hướng dẫn phần mềm cần chèn vào email hợp đồng."""
    return (
        "💻 Phần mềm ký hợp đồng INI HD:\n"
        f"  • Link tải phần mềm: {CONTRACT_DOWNLOAD_URL}\n"
        f"  • File hướng dẫn sử dụng: {CONTRACT_GUIDE_FILENAME} (đính kèm trong email)"
    )

def get_company_tax_id() -> str:
    """Lấy trực tiếp MST hiện tại từ settings.json"""
    base_dir = get_app_data_path("")
    settings_path = os.path.join(base_dir, "settings.json")
    mst_folder = ""
    
    if os.path.exists(settings_path):
        import json
        try:
            with open(settings_path, 'r', encoding='utf-8') as f:
                settings = json.load(f)
                tax_id = settings.get("company", {}).get("tax_id", "").strip()
                if tax_id:
                    import re
                    tax_id = re.sub(r'[\\/*?:"<>|]', "", tax_id)
                    if tax_id:
                        mst_folder = tax_id
        except:
            pass
    return mst_folder

def get_company_root_path(relative_path: str = "") -> str:
    """
    Lấy đường dẫn root của Công ty theo Mã số thuế (MST).
    Thư mục MST nằm đồng cấp với file EXE (get_app_data_path).
    """
    mst_folder = get_company_tax_id()
    base_dir = get_app_data_path("")
    company_root = os.path.join(base_dir, mst_folder)
    os.makedirs(company_root, exist_ok=True)
    
    if relative_path:
        return os.path.join(company_root, relative_path)
    return company_root


def clean_old_trash(days: int = 30):
    """Xóa các file trong thùng rác đã lưu quá thời gian (mặc định 30 ngày)."""
    trash_dir = get_company_root_path("trash")
    if not os.path.exists(trash_dir):
        return
    import time
    now = time.time()
    cutoff = days * 24 * 3600
    for fname in os.listdir(trash_dir):
        fpath = os.path.join(trash_dir, fname)
        if os.path.isfile(fpath):
            try:
                if now - os.path.getmtime(fpath) > cutoff:
                    os.remove(fpath)
            except Exception:
                pass

def move_to_trash(filepath: str):
    """
    Đưa file vào thùng rác ({MST}/trash/) thay vì xóa vĩnh viễn. 
    Tự động đổi tên để tránh trùng lặp và dọn thư mục trash cũ.
    """
    if not filepath or not os.path.exists(filepath):
        return
    
    trash_dir = get_company_root_path("trash")
    os.makedirs(trash_dir, exist_ok=True)
    
    import shutil
    from datetime import datetime
    
    base_name = os.path.basename(filepath)
    name, ext = os.path.splitext(base_name)
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    new_name = f"{name}_{timestamp}{ext}"
    trash_path = os.path.join(trash_dir, new_name)
    
    try:
        shutil.move(filepath, trash_path)
    except Exception as e:
        print(f"[Trash] Lỗi khi chuyển file vào thùng rác: {e}")
        
    clean_old_trash(30)

