# -*- coding: utf-8 -*-
"""
LVT Shared Infrastructure — Internationalization (i18n).

Bilingual translation system (English / Vietnamese) with persistent
language preference stored via QSettings.

The translation dictionary covers all menu items, messages, and UI labels
used across the LVT Plugin Suite.

Author: Lộc Vũ Trung (LVT) / Slow Forest
License: GPL-3.0
"""

from qgis.PyQt.QtCore import QSettings

# QSettings key for persisting the language choice
_SETTINGS_KEY = "LVT4U/language"

# Default language
_DEFAULT_LANG = "en"

# Translation dictionary: English key → Vietnamese translation
# English is the base language (key = display text)
_TRANSLATIONS = {
    # --- Menu items ---
    "Map Layout": "Xây dựng Layout bản đồ",
    "KML": "KML",
    "SHP → KML/KMZ": "SHP → KML/KMZ",
    "KML/KMZ → SHP": "KML/KMZ → SHP",
    "Create MBTiles": "Tạo MBTiles",
    "Create GeoJSON EUDR": "Tạo GeoJSON EUDR",
    "EUDR": "EUDR",
    "Export GeoJSON": "Xuất GeoJSON",
    "Reference Documents": "Tài liệu tham khảo",
    "Package Map": "Đóng gói bản đồ",
    "Thematic Map": "Bản đồ chuyên đề",
    "Circular 16/2023": "Theo TT 16/2023",
    "Plot Labels": "Nhãn lô",
    "Basemap": "Bản đồ nền",
    "Google Maps": "Google Maps",
    "Google Satellite": "Google Satellite",
    "Google Hybrid": "Google Hybrid",
    "Legal Documents": "Văn bản pháp lý",
    "Font Converter": "Chuyển đổi font chữ",
    "Coordinate System": "Hệ tọa độ",
    "CRS Conversion": "Chuyển đổi hệ tọa độ",
    "Define CRS": "Định nghĩa hệ tọa độ",
    "CRS Catalog": "Danh mục hệ tọa độ",
    "About": "Thông tin",
    "Circular 33": "Theo TT 33",
    "Style Library": "Thư viện định dạng",
    "Excel → GIS": "Chuyển Excel vào bản đồ",
    "Thematic Map": "Bản đồ chuyên đề",
    "Forest Status Thematic Map": "Bản đồ chuyên đề hiện trạng rừng",
    "Create Thematic Map": "Tạo bản đồ chuyên đề",
    "Create Plot Labels": "Tạo nhãn lô",
    "Apply Style": "Áp dụng kiểu",
    "Apply": "Áp dụng",
    "Plot Labels": "Nhãn lô",
    "Close": "Đóng",
    "Legal Docs": "Văn bản pháp lý",
    "Appendix 1": "Phụ lục 1",
    "Biodiversity": "Đa dạng sinh học",

    # --- Flycam Photos ---
    "Flycam Photos": "Ảnh Flycam",
    "📥 Import": "📥 Nhập ảnh",
    "👁️ View": "👁️ Xem ảnh",
    "🔄 Update": "🔄 Cập nhật",
    "📤 Export": "📤 Xuất ảnh",
    "Input folder:": "Thư mục ảnh:",
    "Output file:": "File đầu ra:",
    "Select folder containing photos...": "Chọn thư mục chứa ảnh...",
    "Output vector file path...": "Đường dẫn file vector đầu ra...",
    "Relative root:": "Thư mục gốc tương đối:",
    "Optional — for relative paths": "Tùy chọn — cho đường dẫn tương đối",
    "Web root:": "Đường dẫn web:",
    "Optional — URL prefix for KML": "Tùy chọn — URL tiền tố cho KML",
    "Only import photos within current canvas extent":
        "Chỉ nhập ảnh trong phạm vi bản đồ hiện tại",
    "🚀 Import Photos": "🚀 Nhập ảnh",
    "Photo Layer": "Lớp ảnh",
    "Layer:": "Lớp:",
    "🖱️ Click Photos on Map": "🖱️ Click ảnh trên bản đồ",
    "Click tool active — click on photo points in the map.":
        "Công cụ click đã kích hoạt — click vào điểm ảnh trên bản đồ.",
    "Sync Layer with Photo Folder": "Đồng bộ lớp với thư mục ảnh",
    "🔄 Update Layer": "🔄 Cập nhật lớp",
    "Export Photos from Layer": "Xuất ảnh từ lớp",
    "📤 Export All Photos": "📤 Xuất tất cả ảnh",
    "Select photo folder": "Chọn thư mục ảnh",
    "Save output file": "Lưu file đầu ra",
    "Select relative root folder": "Chọn thư mục gốc tương đối",
    "Select export folder": "Chọn thư mục xuất",
    "No JPEG photos found in the selected folder.":
        "Không tìm thấy ảnh JPEG trong thư mục đã chọn.",
    "Please select a valid input folder.":
        "Vui lòng chọn thư mục đầu vào hợp lệ.",
    "Please specify an output file.":
        "Vui lòng chỉ định file đầu ra.",
    "Please select a photo layer.":
        "Vui lòng chọn lớp ảnh.",
    "Please select a layer to update.":
        "Vui lòng chọn lớp cần cập nhật.",
    "Please select a layer.":
        "Vui lòng chọn lớp.",
    "Please select an output folder.":
        "Vui lòng chọn thư mục đầu ra.",
    "Flycam Photo Viewer": "Xem ảnh Flycam",
    "Previous photo": "Ảnh trước",
    "Next photo": "Ảnh tiếp",
    "Fit to window": "Vừa cửa sổ",
    "Rotate 90° clockwise": "Xoay 90° theo chiều kim đồng hồ",
    "Rotate to azimuth (north-up)": "Xoay theo phương vị (hướng Bắc lên)",
    "Save current view as image": "Lưu ảnh hiện tại",
    "Save Image As": "Lưu ảnh thành",

    # --- Messages ---
    "{module} — Coming soon!": "{module} — Sắp ra mắt!",
    "{name} added successfully.": "{name} đã được thêm thành công.",
    "{name} is already loaded.": "{name} đã được tải rồi.",
    "Failed to load {name}.": "Không thể tải {name}.",

    # --- About dialog ---
    "Author": "Tác giả",
    "Version": "Phiên bản",
    "License": "Giấy phép",
    "Language": "Ngôn ngữ",
    "English": "English",
    "Vietnamese": "Tiếng Việt",
    "Close": "Đóng",
    "Settings saved. Restart QGIS to apply.": "Đã lưu. Khởi động lại QGIS để áp dụng.",
    "Expertise": "Phạm vi chuyên môn",
    "FSC, Silviculture & Digital Transformation Expert": "Chuyên gia FSC, Kỹ thuật lâm sinh, và Chuyển đổi số",
    "FSC/CoC Forest Certification": "Hệ thống chứng chỉ rừng FSC/CoC",
    "EU Deforestation Regulation (EUDR)": "Quy định chống phá rừng châu Âu (EUDR)",
    "Webapp / Appsheet Applications": "Ứng dụng Webapp / Appsheet",
    "QGIS GIS / Data Management": "Hệ thống thông tin địa lý QGIS / Quản lý DATA",
    "Silviculture": "Kỹ thuật Lâm sinh",

    # --- Common ---
    "OK": "OK",
    "Cancel": "Hủy",
    "Apply": "Áp dụng",
    "Browse...": "Chọn...",
    "Output folder": "Thư mục đầu ra",
    "Input layer": "Layer đầu vào",
    "Output file": "File đầu ra",
    "Select": "Chọn",
    "Error": "Lỗi",
    "Warning": "Cảnh báo",
    "Success": "Thành công",
    "Processing...": "Đang xử lý...",

    # --- Font Converter ---
    "Font Converter": "Chuyển đổi font chữ",
    "Convert font TCVN3/VNI ↔ Unicode, export Shapefile or MapInfo TAB.": "Chuyển font TCVN3/VNI ↔ Unicode, xuất Shapefile hoặc MapInfo TAB.",
    "Conversion:": "Chuyển đổi:",
    "No conversion": "Không chuyển font",
    "Format:": "Định dạng:",
    "Export CRS:": "CRS xuất:",
    "Convert & Export": "Chuyển đổi & Xuất",
    "Guide": "Hướng dẫn",
    "Help": "Hướng dẫn",
    "Close": "Đóng",

    # --- Layout ---
    "Create Layout": "Tạo khung",
    "Map Layout": "Xây dựng Layout bản đồ",
    "Layout Mode": "Chế độ Layout",
    "Map Title": "Tên bản đồ",
    "Study Area": "Khu vực",
    "Date": "Ngày",
    "Paper Size": "Khổ giấy",
    "Custom Size": "Kích thước tự chọn",
    "Orientation": "Hướng",
    "Scale": "Tỷ lệ",
    "Data Sources": "Nguồn dữ liệu xây dựng bản đồ",

    # --- Layer Editor ---
    "Layer Editor": "Biên tập Layer",
    "Group Mode": "Chế độ nhóm",
    "Auto Group (by geometry)": "Nhóm tự động (theo hình học)",
    "Manual Group": "Nhóm thủ công",
    "Point Layers": "Lớp Điểm",
    "Line Layers": "Lớp Đường",
    "Polygon Layers": "Lớp Vùng",
    "Raster Layers": "Lớp Raster",
    "Refresh": "Làm mới",
    "Apply All": "Áp dụng tất cả",
    "Group in Panel": "Nhóm trong Panel",
    "Save Preset": "Lưu cấu hình",
    "Load Preset": "Tải cấu hình",
    "Coordinate Converter": "Chuyển đổi tọa độ",

    # --- TopoFix module ---
    "TopoFix": "TopoFix",
    "Topology Check & Fix": "Kiểm tra & Sửa lỗi Topology",
    "Select layer": "Chọn lớp bản đồ",
    "Refresh layers": "Cập nhật lớp",
    "Check errors": "Kiểm tra lỗi",
    "Error type": "Loại lỗi",
    "Result": "Kết quả",
    "Highlight": "Tô sáng",
    "Fix": "Sửa",
    "Show": "Hiển thị",
    "Parameters": "Tham số",
    "Gap tolerance (ha)": "Ngưỡng khoảng hở (ha)",
    "Sliver max area (ha)": "Diện tích sliver tối đa (ha)",
    "Sliver ratio (P/sqrt A)": "Tỷ lệ sliver (P/căn A)",
    "Must-not-overlap min (m2)": "Ngưỡng chồng đè tối thiểu (m2)",
    "Missing node tolerance": "Dung sai nút thiếu",
    "Tiny polygon min (ha)": "Diện tích polygon nhỏ (ha)",
    "Max vertices": "Số đỉnh tối đa",
    "Select All": "Chọn tất cả",
    "Check Errors": "Kiểm tra lỗi",
    "Stop": "Dừng",
    "Fix Errors": "Sửa lỗi",
    "Clear Highlight": "Xóa tô sáng",
    "No layer selected": "Chưa chọn lớp bản đồ",
    "No checks selected": "Chưa chọn loại lỗi",
    "Save fixed layer": "Lưu lớp đã sửa",
    "Proceed with fixing? This creates a new file.":
        "Tiến hành sửa lỗi? Sẽ tạo file mới.",
    "Fix complete! Layer added to map.":
        "Sửa lỗi hoàn thành! Đã thêm lớp vào bản đồ.",
    "Duplicates": "Trùng lặp",
    "Invalid Geometry": "Hình học không hợp lệ",
    "Multipart": "Đa phần (Multipart)",
    "Overlaps": "Chồng đè (Overlaps)",
    "Gaps": "Khoảng hở (Gaps)",
    "Must Not Overlap": "Cắt thông minh",
    "Sliver Polygons": "Vùng hình kim (Sliver)",
    "Redundant Vertices": "Đỉnh dư thừa",
    "Unclosed Rings": "Vòng không khép kín",
    "Missing Nodes": "Thiếu nút trên cạnh chung",
    "Tiny Polygons": "Polygon nhỏ (Tiny)",
    "Help": "Hướng dẫn",
    "Algorithm Principles": "Nguyên lý thuật toán",
    "User Guide": "Hướng dẫn sử dụng",
    "Research Plan": "Kế hoạch nghiên cứu",
    "Auto-fixing invalid geometry...": "Đang tự động sửa hình học...",
    "Fixing": "Đang sửa",
    "Proceed with fixing? A temporary layer will be created.":
        "Tiến hành sửa lỗi? Sẽ tạo lớp tạm để xem trước.",
    "Fix complete! Temporary layer added for review."
    " Re-Scan to verify, then save manually.":
        "Sửa lỗi hoàn thành! Đã thêm lớp tạm để xem."
        " Chạy lại kiểm tra để xác nhận, sau đó tự lưu.",
    "No displayable geometries": "Không có hình học hiển thị được",
    "Scan All Errors": "Kiểm tra tất cả lỗi",
    "Re-Scan": "Kiểm tra lại",
    "Count": "Số lỗi",
    "Errors Found": "Kết quả lỗi",
    "No errors found! Layer is clean.":
        "Không phát hiện lỗi! Dữ liệu sạch.",
    "errors found": "lỗi phát hiện",
    "Advanced Parameters": "Tham số nâng cao",
    "No fix types selected": "Chưa chọn loại sửa lỗi",
    "Output CRS": "CRS đầu ra",
    "Output CRS:": "CRS đầu ra:",
    "Keep original CRS": "Giữ nguyên CRS gốc",
    "Result — VN-2000": "Kết quả — VN-2000",
    "Select VN-2000 meridian": "Chọn kinh tuyến trục VN-2000",
    # --- FSC Plot Layout ---
    "FSC Plot Layout": "Bản đồ trích lục FSC",
    "Data Selection": "Chọn dữ liệu",
    "Main layer": "Layer chính",
    "Plot ID field": "Trường mã lô",
    "Month field": "Trường tháng KT",
    "Auxiliary layers": "Layer phụ trợ",
    "Contour lines": "Đường đồng mức",
    "Sub-compartment boundary": "Ranh tiểu khu",
    "Roads": "Giao thông",
    "Compartment labels": "Số hiệu TK/Khoảnh",
    "Plot Selection": "Chọn lô khai thác",
    "Filter": "Lọc",
    "All communes": "Tất cả xã",
    "All months": "Tất cả tháng",
    "All years": "Tất cả năm",
    "Owner": "Chủ rừng",
    "Plot ID": "Mã lô",
    "Area": "Diện tích",
    "Month": "Tháng",
    "Year": "Năm",
    "Select All": "Chọn tất cả",
    "Deselect All": "Bỏ chọn tất cả",
    "Selected": "Đã chọn",
    "Map Settings": "Cài đặt bản đồ",
    "Title": "Tiêu đề",
    "Subtitle": "Dòng phụ",
    "Organization": "Đơn vị xây dựng",
    "Scale": "Tỷ lệ",
    "Custom": "Tùy chỉnh",
    "Signatures": "Ô ký",
    "Plot owner": "Chủ rừng",
    "Group representative": "Đại diện nhóm chứng chỉ",
    "Output": "Đầu ra",
    "Output folder": "Thư mục đầu ra",
    "Select output folder": "Chọn thư mục đầu ra",
    "Separate PDFs": "Nhiều file PDF riêng",
    "Merged PDF": "Gộp 1 file PDF",
    "Export PDF": "Xuất PDF",
    "Please select a main layer.": "Vui lòng chọn layer chính.",
    "Please select an output folder.": "Vui lòng chọn thư mục đầu ra.",
    "Please select at least one plot.": "Vui lòng chọn ít nhất một lô.",
    "Done": "Hoàn thành",
    "Export complete": "Xuất bản đồ hoàn thành",
    "Export failed": "Xuất bản đồ thất bại",
    "Owner field": "Trường chủ rừng",
    "Area field": "Trường diện tích",
    "Commune field": "Trường xã",
    "Year field": "Trường năm",
    "Load data": "Tải dữ liệu",
    "Plot label": "Nhãn lô",
    "Show label": "Hiển thị nhãn",
    "Numerator": "Tử số",
    "Denominator": "Mẫu số",
    "Show legend": "Hiển thị chú giải",
    "Open output after export": "Mo san pham sau khi xuat",

    # --- Satellite Downloader ---
    "Satellite Downloader": "Tải ảnh vệ tinh",
    "Satellite Image Downloader": "Tải ảnh vệ tinh",
    "LVT4U — Satellite Image Downloader":
        "LVT4U — Tải ảnh vệ tinh",
    "Satellite:": "Vệ tinh:",
    "From:": "Từ:",
    "To:": "Đến:",
    "Layer": "Lớp bản đồ",

    "Map View": "Khung nhìn bản đồ",
    "Bands:": "Kênh ảnh:",
    "Cloud max:": "Mây tối đa:",
    "Resolution:": "Độ phân giải:",

    "  Search Images": "  Tìm kiếm ảnh",
    "  Reset": "  Đặt lại",
    "Ready": "Sẵn sàng",
    "Date": "Ngày",
    "Cloud %": "Mây %",
    "Tile ID": "Mã tile",
    "Preview": "Xem trước",
    "Click an image in the table\nto preview cloud coverage":
        "Chọn ảnh trong bảng\nđể xem trước độ che phủ mây",
    "Loading preview...": "Đang tải xem trước...",
    "Preview failed": "Không thể xem trước",
    "Preview not available": "Không có ảnh xem trước",
    "Select All": "Chọn tất cả",
    "Deselect All": "Bỏ chọn tất cả",
    "{n} selected": "{n} đã chọn",
    "Format:": "Định dạng:",
    "Folder:": "Thư mục:",
    "Add to QGIS": "Thêm vào QGIS",
    "  Download Selected": "  Tải ảnh đã chọn",
    "Close": "Đóng",
    "Select output folder": "Chọn thư mục đầu ra",
    "Select at least one image.": "Vui lòng chọn ít nhất một ảnh.",
    "No polygon layer selected.": "Chưa chọn lớp polygon.",
    "Layer is empty or not found.": "Lớp trống hoặc không tìm thấy.",

    "Searching satellite catalog...": "Đang tìm kiếm dữ liệu vệ tinh...",
    "Found {n} images": "Tìm thấy {n} ảnh",
    "Downloading {n}/{total}: {date}...":
        "Đang tải {n}/{total}: {date}...",
    "Downloaded {n} images ({s:.1f} MB)":
        "Đã tải {n} ảnh ({s:.1f} MB)",
    "Downloaded {n} images to:\n{d}":
        "Đã tải {n} ảnh về:\n{d}",
    "A task is running. Please wait.":
        "Đang chạy tác vụ. Vui lòng đợi.",
    "Layer '{name}' added.": "Đã thêm lớp '{name}'.",
    "Help": "Hướng dẫn",
    "No valid geometries in layer.":
        "Không có hình học hợp lệ trong lớp.",
    "Creating composite & downloading...":
        "Đang tạo ảnh tổng hợp & tải...",
    "Planet WMTS Settings": "Cài đặt Planet WMTS",
    "Enter your Planet WMTS URL below. It will be saved for future sessions.\nLeave empty to disable Planet basemap.":
        "Nhập URL Planet WMTS bên dưới. Sẽ được lưu cho các lần sau.\nĐể trống nếu không dùng Planet basemap.",
    "Save": "Lưu",
    "Load Basemap": "Tải bản đồ nền",
    "Planet WMTS URL saved!": "Đã lưu URL Planet WMTS!",
    "Planet WMTS URL cleared.": "Đã xóa URL Planet WMTS.",
    "Please enter a Planet WMTS URL first.":
        "Vui lòng nhập URL Planet WMTS trước.",
    "Planet Basemap added to QGIS!":
        "Đã thêm Planet Basemap vào QGIS!",
    "Planet Basemap added to QGIS! (XYZ fallback)":
        "Đã thêm Planet Basemap vào QGIS! (phương thức XYZ)",
    "Could not load Planet basemap. Check your URL and API key.":
        "Không thể tải Planet basemap. Kiểm tra URL và API key.",
}


def current_language():
    """Return the currently selected language code.

    Returns:
        str: "en" or "vi".
    """
    return QSettings().value(_SETTINGS_KEY, _DEFAULT_LANG)


def set_language(lang_code):
    """Persist the language preference.

    Args:
        lang_code: "en" for English, "vi" for Vietnamese.
    """
    if lang_code in ("en", "vi"):
        QSettings().setValue(_SETTINGS_KEY, lang_code)


def tr(text):
    """Translate the given text based on the current language setting.

    If the current language is English, the original text is returned.
    If Vietnamese is selected, the translation is looked up in the dictionary.
    If no translation is found, the original English text is returned as fallback.

    Args:
        text: English text to translate.

    Returns:
        str: Translated text (or original if no translation available).
    """
    if current_language() == "vi":
        return _TRANSLATIONS.get(text, text)
    return text
