"""
    pygments.lexers.teraterm
    ~~~~~~~~~~~~~~~~~~~~~~~~

    Lexer for Tera Term macro files.

    :copyright: Copyright 2006-2023 by the Pygments team, see AUTHORS.
    :license: BSD, see LICENSE for details.
"""

import re

from pygments.lexer import RegexLexer, include, bygroups
from pygments.token import Text, Comment, Operator, Name, String, Number, Keyword, Error

__all__ = ["TeraTermLexer"]


class TeraTermLexer(RegexLexer):
    """
    For Tera Term macro source code.

    .. versionadded:: 2.4
    """

    name = "Tera Term macro"
    url = "https://ttssh2.osdn.jp/"
    aliases = ["teratermmacro", "teraterm", "ttl"]
    filenames = ["*.ttl"]
    mimetypes = ["text/x-teratermmacro"]

    tokens = {
        "root": [
            include("comments"),
            include("labels"),
            include("commands"),
            include("builtin-variables"),
            include("user-variables"),
            include("operators"),
            include("numeric-literals"),
            include("string-literals"),
            include("all-whitespace"),
            (r"\S", Text),
        ],
        "comments": [
            (r";[^\r\n]*", Comment.Single),
            (r"/\*", Comment.Multiline, "in-comment"),
        ],
        "in-comment": [
            (r"\*/", Comment.Multiline, "#pop"),
            (r"[^*/]+", Comment.Multiline),
            (r"[*/]", Comment.Multiline),
        ],
        "labels": [
            (r"(?i)^(\s*)(:[a-z0-9_]+)", bygroups(Text.Whitespace, Name.Label)),
        ],
        "commands": [
            (
                r"(?i)\b(" r"basename|" r"beep|" r"bplusrecv|" r"bplussend|" r"break|" r"bringupbox|"
                # 'call' is handled separately.
                r"callmenu|"
                r"changedir|"
                r"checksum16|"
                r"checksum16file|"
                r"checksum32|"
                r"checksum32file|"
                r"checksum8|"
                r"checksum8file|"
                r"clearscreen|"
                r"clipb2var|"
                r"closesbox|"
                r"closett|"
                r"code2str|"
                r"connect|"
                r"continue|"
                r"crc16|"
                r"crc16file|"
                r"crc32|"
                r"crc32file|"
                r"cygconnect|"
                r"delpassword|"
                r"dirname|"
                r"dirnamebox|"
                r"disconnect|"
                r"dispstr|"
                r"do|"
                r"else|"
                r"elseif|"
                r"enablekeyb|"
                r"end|"
                r"endif|"
                r"enduntil|"
                r"endwhile|"
                r"exec|"
                r"execcmnd|"
                r"exit|"
                r"expandenv|"
                r"fileclose|"
                r"fileconcat|"
                r"filecopy|"
                r"filecreate|"
                r"filedelete|"
                r"filelock|"
                r"filemarkptr|"
                r"filenamebox|"
                r"fileopen|"
                r"fileread|"
                r"filereadln|"
                r"filerename|"
                r"filesearch|"
                r"fileseek|"
                r"fileseekback|"
                r"filestat|"
                r"filestrseek|"
                r"filestrseek2|"
                r"filetruncate|"
                r"fileunlock|"
                r"filewrite|"
                r"filewriteln|"
                r"findclose|"
                r"findfirst|"
                r"findnext|"
                r"flushrecv|"
                r"foldercreate|"
                r"folderdelete|"
                r"foldersearch|"
                r"for|"
                r"getdate|"
                r"getdir|"
                r"getenv|"
                r"getfileattr|"
                r"gethostname|"
                r"getipv4addr|"
                r"getipv6addr|"
                r"getmodemstatus|"
                r"getpassword|"
                r"getspecialfolder|"
                r"gettime|"
                r"gettitle|"
                r"getttdir|"
                r"getver|"
                # 'goto' is handled separately.
                r"if|"
                r"ifdefined|"
                r"include|"
                r"inputbox|"
                r"int2str|"
                r"intdim|"
                r"ispassword|"
                r"kmtfinish|"
                r"kmtget|"
                r"kmtrecv|"
                r"kmtsend|"
                r"listbox|"
                r"loadkeymap|"
                r"logautoclosemode|"
                r"logclose|"
                r"loginfo|"
                r"logopen|"
                r"logpause|"
                r"logrotate|"
                r"logstart|"
                r"logwrite|"
                r"loop|"
                r"makepath|"
                r"messagebox|"
                r"mpause|"
                r"next|"
                r"passwordbox|"
                r"pause|"
                r"quickvanrecv|"
                r"quickvansend|"
                r"random|"
                r"recvln|"
                r"regexoption|"
                r"restoresetup|"
                r"return|"
                r"rotateleft|"
                r"rotateright|"
                r"scprecv|"
                r"scpsend|"
                r"send|"
                r"sendbreak|"
                r"sendbroadcast|"
                r"sendfile|"
                r"sendkcode|"
                r"sendln|"
                r"sendlnbroadcast|"
                r"sendlnmulticast|"
                r"sendmulticast|"
                r"setbaud|"
                r"setdate|"
                r"setdebug|"
                r"setdir|"
                r"setdlgpos|"
                r"setdtr|"
                r"setecho|"
                r"setenv|"
                r"setexitcode|"
                r"setfileattr|"
                r"setflowctrl|"
                r"setmulticastname|"
                r"setpassword|"
                r"setrts|"
                r"setspeed|"
                r"setsync|"
                r"settime|"
                r"settitle|"
                r"show|"
                r"showtt|"
                r"sprintf|"
                r"sprintf2|"
                r"statusbox|"
                r"str2code|"
                r"str2int|"
                r"strcompare|"
                r"strconcat|"
                r"strcopy|"
                r"strdim|"
                r"strinsert|"
                r"strjoin|"
                r"strlen|"
                r"strmatch|"
                r"strremove|"
                r"strreplace|"
                r"strscan|"
                r"strspecial|"
                r"strsplit|"
                r"strtrim|"
                r"testlink|"
                r"then|"
                r"tolower|"
                r"toupper|"
                r"unlink|"
                r"until|"
                r"uptime|"
                r"var2clipb|"
                r"wait|"
                r"wait4all|"
                r"waitevent|"
                r"waitln|"
                r"waitn|"
                r"waitrecv|"
                r"waitregex|"
                r"while|"
                r"xmodemrecv|"
                r"xmodemsend|"
                r"yesnobox|"
                r"ymodemrecv|"
                r"ymodemsend|"
                r"zmodemrecv|"
                r"zmodemsend"
                r")\b",
                Keyword,
            ),
            (r"(?i)(call|goto)([ \t]+)([a-z0-9_]+)", bygroups(Keyword, Text.Whitespace, Name.Label)),
        ],
        "builtin-variables": [
            (
                r"(?i)("
                r"groupmatchstr1|"
                r"groupmatchstr2|"
                r"groupmatchstr3|"
                r"groupmatchstr4|"
                r"groupmatchstr5|"
                r"groupmatchstr6|"
                r"groupmatchstr7|"
                r"groupmatchstr8|"
                r"groupmatchstr9|"
                r"inputstr|"
                r"matchstr|"
                r"mtimeout|"
                r"param1|"
                r"param2|"
                r"param3|"
                r"param4|"
                r"param5|"
                r"param6|"
                r"param7|"
                r"param8|"
                r"param9|"
                r"paramcnt|"
                r"params|"
                r"result|"
                r"timeout"
                r")\b",
                Name.Builtin,
            ),
        ],
        "user-variables": [
            (r"(?i)[a-z_][a-z0-9_]*", Name.Variable),
        ],
        "numeric-literals": [
            (r"(-?)([0-9]+)", bygroups(Operator, Number.Integer)),
            (r"(?i)\$[0-9a-f]+", Number.Hex),
        ],
        "string-literals": [
            (r"(?i)#(?:[0-9]+|\$[0-9a-f]+)", String.Char),
            (r"'[^'\n]*'", String.Single),
            (r'"[^"\n]*"', String.Double),
            # Opening quotes without a closing quote on the same line are errors.
            (r"('[^']*)(\n)", bygroups(Error, Text.Whitespace)),
            (r'("[^"]*)(\n)', bygroups(Error, Text.Whitespace)),
        ],
        "operators": [
            (r"and|not|or|xor", Operator.Word),
            (r"[!%&*+<=>^~\|\/-]+", Operator),
            (r"[()]", String.Symbol),
        ],
        "all-whitespace": [
            (r"\s+", Text.Whitespace),
        ],
    }

    # Turtle and Tera Term macro files share the same file extension
    # but each has a recognizable and distinct syntax.
    def analyse_text(text):
        if re.search(TeraTermLexer.tokens["commands"][0][0], text):
            return 0.01
