"""Bilingual localization: Vietnamese (vi) and English (en)."""

_lang = "vi"


def set_lang(lang: str):
    global _lang
    _lang = lang if lang in ("vi", "en") else "vi"


def get_lang() -> str:
    return _lang


def t(key: str, **kw) -> str:
    text = _DICTS.get(_lang, _VI).get(key, key)
    return text.format(**kw) if kw else text


def color_name(color_val: str) -> str:
    if _lang == "vi":
        return "Đỏ" if color_val == "red" else "Đen"
    return "Red" if color_val == "red" else "Black"


# ── Vietnamese ─────────────────────────────────────────────────────────

_VI: dict[str, str] = {
    # Main menu
    "title": "CỜ TƯỚNG",
    "subtitle": "Xiangqi trên Terminal",
    "menu_lan": "Chơi qua mạng LAN",
    "menu_local": "Chơi 2 người (cùng máy)",
    "menu_help": "Hướng dẫn cách chơi",
    "menu_lang": "Ngôn ngữ / Language",
    "menu_quit": "Thoát",
    "choose": "Chọn",
    "invalid_choice": "Lựa chọn không hợp lệ.",
    "goodbye": "Tạm biệt!",
    # Network menu
    "net_title": "CHƠI QUA MẠNG LAN",
    "net_create": "Tạo phòng",
    "net_join": "Tham gia phòng",
    "net_back": "Quay lại",
    # Room
    "room_created": "PHÒNG ĐÃ ĐƯỢC TẠO!",
    "room_id": "Mã phòng",
    "room_addr": "Địa chỉ",
    "room_share": "Chia sẻ mã phòng cho đối thủ.",
    "room_waiting": "Đang chờ đối thủ kết nối...",
    "room_cancel": "Nhấn Ctrl+C để hủy.",
    "room_timeout": "Hết thời gian chờ.",
    "room_cancelled": "Đã hủy phòng.",
    # Join
    "join_title": "THAM GIA PHÒNG",
    "join_prompt": "Nhập mã phòng (4 ký tự) hoặc IP:PORT",
    "join_searching": "Đang tìm phòng {rid}...",
    "join_connecting": "Đang kết nối tới {addr}...",
    "join_not_found": "Không tìm thấy phòng hoặc không thể kết nối.",
    "join_error": "Lỗi kết nối: không nhận được thông tin trận đấu.",
    "join_invalid_addr": "Địa chỉ không hợp lệ.",
    "join_invalid_id": "Mã phòng phải có 4 ký tự.",
    # Connection
    "connected": "Kết nối thành công!",
    "you_are": "Bạn là quân {color}.",
    "disconnected": "Đối thủ đã ngắt kết nối!",
    # Game
    "turn": "Lượt",
    "you_tag": "(Bạn)",
    "opp_tag": "(Đối thủ)",
    "move_num": "Nước thứ",
    "red_cap": "Đỏ bắt",
    "black_cap": "Đen bắt",
    # Check / game over
    "check": "Chiếu tướng!",
    "general_captured": "Tướng bị bắt! {color} thắng!",
    "draw_agree": "Hai bên đồng ý hòa cờ!",
    "draw_stalemate": "Hòa cờ! (Hết nước đi)",
    "draw_repetition": "Hòa cờ! (Lặp thế cờ 3 lần)",
    "opponent_resigned": "Đối thủ đã đầu hàng! Bạn thắng!",
    "you_resigned": "Bạn đã đầu hàng.",
    "resigned_win": "{color} thắng do đối thủ đầu hàng!",
    "win_label": "THẮNG!",
    "draw_label": "HÒA CỜ!",
    # Input
    "select_prompt": "Chọn quân hoặc nhập nước đi",
    "dest_prompt": "Đích đến (Enter để hủy)",
    "help_hint": "h=trợ giúp",
    "invalid_cmd": "Lệnh không hợp lệ. Gõ h để xem trợ giúp.",
    "invalid_move": "Nước đi không hợp lệ!",
    "no_moves": "Quân này không có nước đi hợp lệ.",
    "invalid_dest": "Vị trí đích không hợp lệ.",
    "no_piece": "Không có quân của bạn ở đây.",
    "undo_done": "Đã hoàn tác nước đi.",
    "undo_none": "Không có nước đi nào để hoàn tác.",
    "no_undo_net": "Không thể hoàn tác trong chế độ mạng.",
    "press_enter": "Nhấn Enter để tiếp tục...",
    "back_enter": "Nhấn Enter để quay lại...",
    # Draw offer
    "draw_sent": "Đã gửi yêu cầu hòa. Chờ đối thủ...",
    "draw_offer_recv": "Đối thủ xin hòa. Chấp nhận? (y/n)",
    "draw_accepted": "Đối thủ chấp nhận hòa!",
    "draw_declined": "Đối thủ từ chối hòa.",
    "you_declined": "Bạn đã từ chối hòa.",
    "opp_declined_moved": "Đối thủ từ chối hòa và đã đi nước.",
    # Waiting
    "waiting": "Đang chờ đối thủ...",
    # Help
    "help_title": "HƯỚNG DẪN CHƠI CỜ TƯỚNG",
    "help_text": """\
[bold]CÁCH NHẬP NƯỚC ĐI:[/]
[dim]•[/] Chọn quân: nhập vị trí      [dim](vd: e9)[/]
[dim]•[/] Di chuyển: nhập vị trí đích  [dim](vd: e8)[/]
[dim]•[/] Nhập trực tiếp:              [dim](vd: e9 e8)[/]
[dim]•[/] Hủy chọn: nhấn [cyan]Enter[/]

[bold]CÁC QUÂN CỜ:[/]
[red1]帥[/]/[green3]將[/]  Tướng   ─  1 ô ngang/dọc, chỉ trong cung
[red1]仕[/]/[green3]士[/]  Sĩ      ─  1 ô chéo, chỉ trong cung
[red1]相[/]/[green3]象[/]  Tượng   ─  2 ô chéo (chữ điền), không qua sông
[red1]馬[/]/[green3]馬[/]  Mã      ─  Hình chữ L, bị cản chân
[red1]車[/]/[green3]車[/]  Xe      ─  Thẳng ngang/dọc không giới hạn
[red1]炮[/]/[green3]砲[/]  Pháo    ─  Đi thẳng, ăn phải nhảy qua 1 quân
[red1]兵[/]/[green3]卒[/]  Tốt     ─  Tiến 1, qua sông được đi ngang

[bold]LUẬT ĐẶC BIỆT:[/]
[dim]•[/] Khi bị chiếu tướng, bạn sẽ được cảnh báo
[dim]•[/] Bạn không bắt buộc phải chặn chiếu
[dim]•[/] Nếu tướng bị bắt, bạn thua cuộc
[dim]•[/] Tượng không qua sông, Mã bị cản chân
[dim]•[/] Pháo đi thẳng, ăn nhảy qua đúng 1 quân

[bold]LỆNH:[/]
[cyan]r[/] ─ Đầu hàng      [cyan]d[/] ─ Xin hòa
[cyan]u[/] ─ Hoàn tác       [cyan]q[/] ─ Thoát
[cyan]h[/] ─ Trợ giúp""",
}


# ── English ────────────────────────────────────────────────────────────

_EN: dict[str, str] = {
    # Main menu
    "title": "CHINESE CHESS",
    "subtitle": "Xiangqi on Terminal",
    "menu_lan": "Play over LAN",
    "menu_local": "Local 2 players",
    "menu_help": "How to play",
    "menu_lang": "Language / Ngôn ngữ",
    "menu_quit": "Quit",
    "choose": "Choose",
    "invalid_choice": "Invalid choice.",
    "goodbye": "Goodbye!",
    # Network menu
    "net_title": "PLAY OVER LAN",
    "net_create": "Create room",
    "net_join": "Join room",
    "net_back": "Back",
    # Room
    "room_created": "ROOM CREATED!",
    "room_id": "Room ID",
    "room_addr": "Address",
    "room_share": "Share the room ID with your opponent.",
    "room_waiting": "Waiting for opponent to connect...",
    "room_cancel": "Press Ctrl+C to cancel.",
    "room_timeout": "Timed out waiting.",
    "room_cancelled": "Room cancelled.",
    # Join
    "join_title": "JOIN ROOM",
    "join_prompt": "Enter room ID (4 chars) or IP:PORT",
    "join_searching": "Searching for room {rid}...",
    "join_connecting": "Connecting to {addr}...",
    "join_not_found": "Room not found or unable to connect.",
    "join_error": "Connection error: did not receive game info.",
    "join_invalid_addr": "Invalid address.",
    "join_invalid_id": "Room ID must be 4 characters.",
    # Connection
    "connected": "Connected!",
    "you_are": "You are {color}.",
    "disconnected": "Opponent disconnected!",
    # Game
    "turn": "Turn",
    "you_tag": "(You)",
    "opp_tag": "(Opponent)",
    "move_num": "Move",
    "red_cap": "Red captured",
    "black_cap": "Black captured",
    # Check / game over
    "check": "Check!",
    "general_captured": "General captured! {color} wins!",
    "draw_agree": "Both sides agreed to draw!",
    "draw_stalemate": "Draw! (No valid moves)",
    "draw_repetition": "Draw! (Threefold repetition)",
    "opponent_resigned": "Opponent resigned! You win!",
    "you_resigned": "You resigned.",
    "resigned_win": "{color} wins by opponent's resignation!",
    "win_label": "WINS!",
    "draw_label": "DRAW!",
    # Input
    "select_prompt": "Select piece or enter move",
    "dest_prompt": "Destination (Enter to cancel)",
    "help_hint": "h=help",
    "invalid_cmd": "Invalid command. Press h for help.",
    "invalid_move": "Invalid move!",
    "no_moves": "This piece has no valid moves.",
    "invalid_dest": "Invalid destination.",
    "no_piece": "No piece of yours here.",
    "undo_done": "Move undone.",
    "undo_none": "Nothing to undo.",
    "no_undo_net": "Cannot undo in network mode.",
    "press_enter": "Press Enter to continue...",
    "back_enter": "Press Enter to go back...",
    # Draw offer
    "draw_sent": "Draw offer sent. Waiting for opponent...",
    "draw_offer_recv": "Opponent offers a draw. Accept? (y/n)",
    "draw_accepted": "Opponent accepted the draw!",
    "draw_declined": "Opponent declined the draw.",
    "you_declined": "You declined the draw.",
    "opp_declined_moved": "Opponent declined and made a move.",
    # Waiting
    "waiting": "Waiting for opponent...",
    # Help
    "help_title": "HOW TO PLAY XIANGQI",
    "help_text": """\
[bold]HOW TO ENTER MOVES:[/]
[dim]•[/] Select piece: enter position   [dim](e.g.: e9)[/]
[dim]•[/] Move: enter destination        [dim](e.g.: e8)[/]
[dim]•[/] Enter directly:               [dim](e.g.: e9 e8)[/]
[dim]•[/] Cancel: press [cyan]Enter[/]

[bold]PIECES:[/]
[red1]帥[/]/[green3]將[/]  General   ─  1 step orthogonally, palace only
[red1]仕[/]/[green3]士[/]  Advisor   ─  1 step diagonally, palace only
[red1]相[/]/[green3]象[/]  Elephant  ─  2 steps diag., can't cross river
[red1]馬[/]/[green3]馬[/]  Horse     ─  L-shape, can be blocked
[red1]車[/]/[green3]車[/]  Chariot   ─  Any distance orthogonally
[red1]炮[/]/[green3]砲[/]  Cannon    ─  Straight; jumps over 1 to capture
[red1]兵[/]/[green3]卒[/]  Soldier   ─  1 fwd, sideways after crossing

[bold]SPECIAL RULES:[/]
[dim]•[/] You are warned when in check
[dim]•[/] You are NOT forced to block check
[dim]•[/] If your general is captured, you lose
[dim]•[/] Elephants can't cross river, horses can be blocked
[dim]•[/] Cannons move straight, jump over 1 piece to capture

[bold]COMMANDS:[/]
[cyan]r[/] ─ Resign        [cyan]d[/] ─ Offer draw
[cyan]u[/] ─ Undo          [cyan]q[/] ─ Quit
[cyan]h[/] ─ Help""",
}

_DICTS: dict[str, dict[str, str]] = {"vi": _VI, "en": _EN}
