#!/usr/bin/env node

const emoticonRegex = /^(\:\w+\:|\<[\/\\]?3|[\(\)\\\D|\*\$][\-\^]?[\:\;\=]|[\:\;\=B8][\-\^]?[3DOPp\@\$\*\\\)\(\/\|])(?=\s|[\!\.\?]|$)/;
const hashtagRegex = /^#[a-zA-Z0-9]+/;
const urlRegex = /^(ftp|http)s?:\/\/[^\s]+/;
const emailRegex = /^\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b/;
const addressRegex = /^@[a-zA-Z0-9]+/;
const actionWordRegex = /^:[^:]+:$/;
const wikiEmojiRegex = /^\[_EMOJI:[^\]]+\]$/;

// Load emoji data
let emojiData = {};
try {
  emojiData = require('./emoji_data.json');
} catch (e) {
  // Silent fallback if file doesn't exist (e.g. during initial setup before script run)
}

// Function to strip emoji modifiers and zero-width joiners to get base emoji
function getBaseEmoji(emoji) {
  const stripped = emoji
    // Remove skin tone modifiers (U+1F3FB-U+1F3FF)
    .replace(/[\u{1F3FB}-\u{1F3FF}]/gu, '')
    // Remove zero-width joiners (U+200D)
    .replace(/\u200D/g, '')
    // Remove variation selectors (U+FE0F, U+FE0E)
    .replace(/[\uFE0E\uFE0F]/g, '');
  
  // Extract the first emoji character using Array spread to handle multi-byte emoji
  const chars = [...stripped];
  return chars.length > 0 ? chars[0] : stripped;
}

const optionDefinitions = [
    { name: 'sparse', alias: 's', type: Boolean, description: 'Print only the files, lines that have POS annotations.'},
    { name: 'help', alias: 'h', type: Boolean, description: 'Print this usage guide.'},
]

const sections = [
  {
    header: 'conllu-cmc',
    content: 'Reads CoNLL-U format from stdin and annotates emojis, emoticons, hashtags, URLs, email addresses, @addresses, and action words. Writes CoNLL-U format to stdout.'
  },
  {
    header: 'Synopsis',
    content: '$ conllu-cmc [-s] < input.conllu > output.conllu'
  },
  {
    header: 'Options',
    optionList: optionDefinitions
  }
]

const getUsage = require('command-line-usage')
const commandLineArgs = require('command-line-args')

var options;
try {
  options = commandLineArgs(optionDefinitions)
} catch (e) {
  console.error(e.message);
  options = { help: true };
}

if (options.help) {
  const usage = getUsage(sections);
  console.log(usage);
  process.exit(0);
}

const EmojiRegex = require('emoji-regex');
const emojiRegex = EmojiRegex();
const readline = require('readline');
global.header = '';
global.standalone = false


const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
  terminal: false,
  
});


function parseConllu(line) {
  if (line.match('#\\s*foundry')) {
    if (line.match('=\\s*base')) {
      if (options.sparse) {
        global.standalone = true
      }
      process.stdout.write("# foundry = cmc\n");
    } else {
      process.stdout.write(`${line}\n`);
    }
    return
  }

  if (global.standalone) {
    if (line.match('^#\\s*filename')) {
      global.fileheader = `${line}\n`;
      return;
    } else if (line.match('^#\\s*text_id')){
      global.fileheader += `${line}\n`;
      return;
    } else if (line.match('^#\\s*eo[ft]')){
      process.stdout.write(`${line}\n`);
      return;
    } else if (line.match('^#')){
      global.header += `${line}\n`;
      return;
    } else if (line.trim().match('^$')) {
      if(global.header == "") {
        process.stdout.write("\n");
      }
      global.header = '';
      return
    }
  } else {
    if (! line.match('^\\d+')) {
      process.stdout.write(`${line}\n`);
      return;
    }
  }

  const columns = line.trim().split('\t');

  const word = columns[1];
  // Guard clause: if word is undefined, just output the line as-is
  if (!word) {
    process.stdout.write(`${line}\n`);
    return;
  }
  
  var new_tag = null;
  if (word.match(wikiEmojiRegex)) {
    new_tag = 'EMOWIKI';
  } else if (word.match(emojiRegex)) {
    new_tag = 'EMOIMG';
  } else if(word.match(actionWordRegex)) {
    new_tag = 'AKW';
  } else if(word.match(emoticonRegex)) {
    new_tag = 'EMOASC';
  } else if(word.match(hashtagRegex)) {
  } else if(word.match(urlRegex)) {
    new_tag = 'URL';
  } else if(word.match(emailRegex)) {
    new_tag = 'EML';
  } else if(! columns[3].match("^(NE|PROPN)") &&  word.match(addressRegex)) {
    new_tag = 'ADR';
  }
  if (new_tag) {
    columns[4] = new_tag;
    columns[5] = '_';
    // For EMOIMG tokens, set lemma to the base emoji (without modifiers)
    if (new_tag === 'EMOIMG') {
      const base = getBaseEmoji(word);
      columns[2] = base;
      
      // Look up emoji metadata
      // Try exact match first, then base emoji
      const data = emojiData[word] || emojiData[base];
      if (data) {
        // g=group|s=subgroup|q=qualified|v=version|n=name
        columns[5] = `g=${data.g}|s=${data.s}|q=${data.q}|v=${data.v}|n=${data.n}`;
      }
    }
    if (global.standalone) {
      process.stdout.write(fileheader);
      process.stdout.write(header);
      new_tag = null;
      header = fileheader = '';
    }
    process.stdout.write(columns.join('\t') + '\n');
  } else if (! global.standalone) {
    process.stdout.write(`${line}\n`);
  }
}

rl.on('line', parseConllu);
rl.on('close', () => process.exit(0)); // important to exit, otherwise the process will hang
