import { StreamLanguage, type StreamParser } from '@codemirror/language';
import type { ProjectEditorLanguageId } from '../project-language';
import { simpleParser, wordSet } from './common';

const yaml = simpleParser({ keywords: wordSet('true false null yes no on off'), hashComment: true });
const sql = simpleParser({ keywords: wordSet('SELECT FROM WHERE JOIN LEFT RIGHT INNER OUTER ON AS AND OR NOT NULL INSERT INTO VALUES UPDATE SET DELETE CREATE ALTER DROP TABLE INDEX VIEW WITH GROUP BY ORDER HAVING LIMIT OFFSET UNION ALL DISTINCT CASE WHEN THEN ELSE END PRIMARY KEY FOREIGN REFERENCES CHECK DEFAULT'), lineComment: '--', blockComment: ['/*','*/'] });
const toml = simpleParser({ keywords: wordSet('true false'), hashComment: true });

type MdState = Record<string, never>;
const markdown: StreamParser<MdState> = {
  startState: () => ({}),
  token(stream) {
    if (stream.sol() && stream.match(/^#{1,6}(?=\s)/u)) { stream.skipToEnd(); return 'heading'; }
    if (stream.sol() && stream.match(/^\s*>/u)) { stream.skipToEnd(); return 'quote'; }
    if (stream.match(/^```.*$/u)) { stream.skipToEnd(); return 'meta'; }
    if (stream.match(/^`[^`]*`/u)) return 'string';
    if (stream.match(/^\*\*[^*]+\*\*/u) || stream.match(/^__[^_]+__/u)) return 'strong';
    if (stream.match(/^\*[^*]+\*/u) || stream.match(/^_[^_]+_/u)) return 'emphasis';
    if (stream.match(/^\[[^\]]+\]\([^)]+\)/u)) return 'link';
    stream.next(); return null;
  },
};

export function projectDataLanguage(id: ProjectEditorLanguageId) {
  return StreamLanguage.define(id === 'yaml' ? yaml : id === 'sql' ? sql : id === 'toml' ? toml : markdown);
}
