const conf = {
  comments: {
    lineComment: "//",
    blockComment: ["/*", "*/"]
  },
  brackets: [
    ["[", "]"],
    ["(", ")"],
    ["{", "}"]
  ],
  autoClosingPairs: [
    { open: '"', close: '"', notIn: ["string", "comment"] },
    { open: "'", close: "'", notIn: ["string", "comment"] },
    { open: "[", close: "]", notIn: ["string", "comment"] },
    { open: "(", close: ")", notIn: ["string", "comment"] },
    { open: "{", close: "}", notIn: ["string", "comment"] }
  ]
};
const language = {
  defaultToken: "",
  tokenPostfix: ".msdax",
  ignoreCase: true,
  brackets: [
    { open: "[", close: "]", token: "delimiter.square" },
    { open: "{", close: "}", token: "delimiter.brackets" },
    { open: "(", close: ")", token: "delimiter.parenthesis" }
  ],
  keywords: [
    // Query keywords
    "VAR",
    "RETURN",
    "NOT",
    "EVALUATE",
    "DATATABLE",
    "ORDER",
    "BY",
    "START",
    "AT",
    "DEFINE",
    "MEASURE",
    "ASC",
    "DESC",
    "IN",
    // Datatable types
    "BOOLEAN",
    "DOUBLE",
    "INTEGER",
    "DATETIME",
    "CURRENCY",
    "STRING"
  ],
  functions: [
    // Relational
    "CLOSINGBALANCEMONTH",
    "CLOSINGBALANCEQUARTER",
    "CLOSINGBALANCEYEAR",
    "DATEADD",
    "DATESBETWEEN",
    "DATESINPERIOD",
    "DATESMTD",
    "DATESQTD",
    "DATESYTD",
    "ENDOFMONTH",
    "ENDOFQUARTER",
    "ENDOFYEAR",
    "FIRSTDATE",
    "FIRSTNONBLANK",
    "LASTDATE",
    "LASTNONBLANK",
    "NEXTDAY",
    "NEXTMONTH",
    "NEXTQUARTER",
    "NEXTYEAR",
    "OPENINGBALANCEMONTH",
    "OPENINGBALANCEQUARTER",
    "OPENINGBALANCEYEAR",
    "PARALLELPERIOD",
    "PREVIOUSDAY",
    "PREVIOUSMONTH",
    "PREVIOUSQUARTER",
    "PREVIOUSYEAR",
    "SAMEPERIODLASTYEAR",
    "STARTOFMONTH",
    "STARTOFQUARTER",
    "STARTOFYEAR",
    "TOTALMTD",
    "TOTALQTD",
    "TOTALYTD",
    "ADDCOLUMNS",
    "ADDMISSINGITEMS",
    "ALL",
    "ALLEXCEPT",
    "ALLNOBLANKROW",
    "ALLSELECTED",
    "CALCULATE",
    "CALCULATETABLE",
    "CALENDAR",
    "CALENDARAUTO",
    "CROSSFILTER",
    "CROSSJOIN",
    "CURRENTGROUP",
    "DATATABLE",
    "DETAILROWS",
    "DISTINCT",
    "EARLIER",
    "EARLIEST",
    "EXCEPT",
    "FILTER",
    "FILTERS",
    "GENERATE",
    "GENERATEALL",
    "GROUPBY",
    "IGNORE",
    "INTERSECT",
    "ISONORAFTER",
    "KEEPFILTERS",
    "LOOKUPVALUE",
    "NATURALINNERJOIN",
    "NATURALLEFTOUTERJOIN",
    "RELATED",
    "RELATEDTABLE",
    "ROLLUP",
    "ROLLUPADDISSUBTOTAL",
    "ROLLUPGROUP",
    "ROLLUPISSUBTOTAL",
    "ROW",
    "SAMPLE",
    "SELECTCOLUMNS",
    "SUBSTITUTEWITHINDEX",
    "SUMMARIZE",
    "SUMMARIZECOLUMNS",
    "TOPN",
    "TREATAS",
    "UNION",
    "USERELATIONSHIP",
    "VALUES",
    "SUM",
    "SUMX",
    "PATH",
    "PATHCONTAINS",
    "PATHITEM",
    "PATHITEMREVERSE",
    "PATHLENGTH",
    "AVERAGE",
    "AVERAGEA",
    "AVERAGEX",
    "COUNT",
    "COUNTA",
    "COUNTAX",
    "COUNTBLANK",
    "COUNTROWS",
    "COUNTX",
    "DISTINCTCOUNT",
    "DIVIDE",
    "GEOMEAN",
    "GEOMEANX",
    "MAX",
    "MAXA",
    "MAXX",
    "MEDIAN",
    "MEDIANX",
    "MIN",
    "MINA",
    "MINX",
    "PERCENTILE.EXC",
    "PERCENTILE.INC",
    "PERCENTILEX.EXC",
    "PERCENTILEX.INC",
    "PRODUCT",
    "PRODUCTX",
    "RANK.EQ",
    "RANKX",
    "STDEV.P",
    "STDEV.S",
    "STDEVX.P",
    "STDEVX.S",
    "VAR.P",
    "VAR.S",
    "VARX.P",
    "VARX.S",
    "XIRR",
    "XNPV",
    // Scalar
    "DATE",
    "DATEDIFF",
    "DATEVALUE",
    "DAY",
    "EDATE",
    "EOMONTH",
    "HOUR",
    "MINUTE",
    "MONTH",
    "NOW",
    "SECOND",
    "TIME",
    "TIMEVALUE",
    "TODAY",
    "WEEKDAY",
    "WEEKNUM",
    "YEAR",
    "YEARFRAC",
    "CONTAINS",
    "CONTAINSROW",
    "CUSTOMDATA",
    "ERROR",
    "HASONEFILTER",
    "HASONEVALUE",
    "ISBLANK",
    "ISCROSSFILTERED",
    "ISEMPTY",
    "ISERROR",
    "ISEVEN",
    "ISFILTERED",
    "ISLOGICAL",
    "ISNONTEXT",
    "ISNUMBER",
    "ISODD",
    "ISSUBTOTAL",
    "ISTEXT",
    "USERNAME",
    "USERPRINCIPALNAME",
    "AND",
    "FALSE",
    "IF",
    "IFERROR",
    "NOT",
    "OR",
    "SWITCH",
    "TRUE",
    "ABS",
    "ACOS",
    "ACOSH",
    "ACOT",
    "ACOTH",
    "ASIN",
    "ASINH",
    "ATAN",
    "ATANH",
    "BETA.DIST",
    "BETA.INV",
    "CEILING",
    "CHISQ.DIST",
    "CHISQ.DIST.RT",
    "CHISQ.INV",
    "CHISQ.INV.RT",
    "COMBIN",
    "COMBINA",
    "CONFIDENCE.NORM",
    "CONFIDENCE.T",
    "COS",
    "COSH",
    "COT",
    "COTH",
    "CURRENCY",
    "DEGREES",
    "EVEN",
    "EXP",
    "EXPON.DIST",
    "FACT",
    "FLOOR",
    "GCD",
    "INT",
    "ISO.CEILING",
    "LCM",
    "LN",
    "LOG",
    "LOG10",
    "MOD",
    "MROUND",
    "ODD",
    "PERMUT",
    "PI",
    "POISSON.DIST",
    "POWER",
    "QUOTIENT",
    "RADIANS",
    "RAND",
    "RANDBETWEEN",
    "ROUND",
    "ROUNDDOWN",
    "ROUNDUP",
    "SIGN",
    "SIN",
    "SINH",
    "SQRT",
    "SQRTPI",
    "TAN",
    "TANH",
    "TRUNC",
    "BLANK",
    "CONCATENATE",
    "CONCATENATEX",
    "EXACT",
    "FIND",
    "FIXED",
    "FORMAT",
    "LEFT",
    "LEN",
    "LOWER",
    "MID",
    "REPLACE",
    "REPT",
    "RIGHT",
    "SEARCH",
    "SUBSTITUTE",
    "TRIM",
    "UNICHAR",
    "UNICODE",
    "UPPER",
    "VALUE"
  ],
  tokenizer: {
    root: [
      { include: "@comments" },
      { include: "@whitespace" },
      { include: "@numbers" },
      { include: "@strings" },
      { include: "@complexIdentifiers" },
      [/[;,.]/, "delimiter"],
      [/[({})]/, "@brackets"],
      [
        /[a-z_][a-zA-Z0-9_]*/,
        {
          cases: {
            "@keywords": "keyword",
            "@functions": "keyword",
            "@default": "identifier"
          }
        }
      ],
      [/[<>=!%&+\-*/|~^]/, "operator"]
    ],
    whitespace: [[/\s+/, "white"]],
    comments: [
      [/\/\/+.*/, "comment"],
      [/\/\*/, { token: "comment.quote", next: "@comment" }]
    ],
    comment: [
      [/[^*/]+/, "comment"],
      [/\*\//, { token: "comment.quote", next: "@pop" }],
      [/./, "comment"]
    ],
    numbers: [
      [/0[xX][0-9a-fA-F]*/, "number"],
      [/[$][+-]*\d*(\.\d*)?/, "number"],
      [/((\d+(\.\d*)?)|(\.\d+))([eE][\-+]?\d+)?/, "number"]
    ],
    strings: [
      [/N"/, { token: "string", next: "@string" }],
      [/"/, { token: "string", next: "@string" }]
    ],
    string: [
      [/[^"]+/, "string"],
      [/""/, "string"],
      [/"/, { token: "string", next: "@pop" }]
    ],
    complexIdentifiers: [
      [/\[/, { token: "identifier.quote", next: "@bracketedIdentifier" }],
      [/'/, { token: "identifier.quote", next: "@quotedIdentifier" }]
    ],
    bracketedIdentifier: [
      [/[^\]]+/, "identifier"],
      [/]]/, "identifier"],
      [/]/, { token: "identifier.quote", next: "@pop" }]
    ],
    quotedIdentifier: [
      [/[^']+/, "identifier"],
      [/''/, "identifier"],
      [/'/, { token: "identifier.quote", next: "@pop" }]
    ]
  }
};

export { conf, language };
