const ts = require('typescript');
/**
 *
 * @param {string} code node full text.
 * @returns {RegExpMatchArray  | null}
 */
function extraComponentName(code){
  const regexp = /app\.component\(((?<components>.*)\.name), (?<fileName>.*)\)/;
  const groups = regexp.exec(code)?.groups;
  if (groups?.components){
    return groups.components;
  }
}
/**
 *
    app.directive('file-drop', fileDropDirective);
 * @param {string} code
 */
function extraDirective(code){
  const regexp = /app\.directive\('(?<directiveName>.*), ?(?<fileName>.*)\);/;
  const groups = regexp.exec(code)?.groups;
  if (groups?.fileName){
    return groups.fileName;
  }
}

function extraGlobalProperties(code) {
  const globalPropertiesReg = /app\.config\.globalProperties\.(?<serviceName>\$.*) = (?<serviceFileName>.*);/;
  const provideReg = /app\.provide\((?<serviceName>.*)\..*, ?new? ?(?<instanceName>.*)\((?<param>.*)\);/gm;
  const groups = globalPropertiesReg.exec(code)?.groups || provideReg.exec(code);
  if (groups?.serviceName){
    return groups.serviceName;
  }
}

function extraValue(code){
  return extraComponentName(code) ?? extraDirective(code) ?? extraGlobalProperties(code);
}
/**
 *
 * @param {string} code
 */
function extraType(code){
  const isDirective = /app\.directive/.test(code);
  const isComponent = /app\.component/.test(code);
  const isGlobalProperties = /app\.config\.globalProperties/.test(code);
  const isProvide = /app\.provide/.test(code);
  if (isDirective) {return 'directive';}
  if (isComponent) {return 'component';}
  if (isGlobalProperties || isProvide) {return 'service';}
}

exports.extra = extraValue;
exports.extraType = extraType;
exports.extraDirective = extraDirective;
exports.extraComponentName = extraComponentName;
exports.extraGlobalProperties = extraGlobalProperties;