<?php

/**
 * @global
 */
function macro_BHL_REF($proc, $module, $func, $signature_json = '')
{
  if($module[0] !== '/')
  {
    $abs_module = \taskman\normalize_path(dirname($proc->getRootFile()) . '/' . $module);
    $mapped = false;
    foreach(\taskman\bhl_proj()->src_dirs as $dir)
    {
      $rel_module = str_replace(\taskman\normalize_path($dir), '', $abs_module);
      if($rel_module != $abs_module)
      {
        $mapped = true;
        $rel_module = str_replace('\\', '/', $rel_module);
        $module = "/" . $rel_module;
        break;
      }
    }
    if(!$mapped)
      throw new Exception("Could not map relative module: $module");
  }

  $module_file = \taskman\bhl_map_module_to_file($module);
  if(!$module_file)
    throw new Exception("Module not found '{$module}'");

  //validate signature only if it's explicitely passed
  if($signature_json)
  {
    $signature = json_decode($signature_json, false);
    if(!is_array($signature))
      throw new Exception("Signature is invalid '$module'");
    \taskman\bhl_validate_func_ref($module_file, $func, $signature);
  }

  return array('module' => ltrim($module, '/'), 'fn' => $func);
}