//
// refresh ai fields
//
function refreshAIFields() {
  // set the app id
  var appID = cSSApplicationID;
  // get the field structure
  var response = listFields_(appID);
  var oFields = JSON.parse(response).structure;  
  // get the records
  var response = listRecords_(appID);
  oRecords = JSON.parse(response).items;
  for (var i in oRecords) {
    for (let [key, value] of Object.entries(oRecords[i])) {
      // Logger.log(JSON.stringify(oRecords[i]));
      var recordID = oRecords[i].id;
      // get this key's field name
      var fieldName = getFieldNameByID(key, oFields);
      // any ai fields?
      // if ((value.toString().length > 0) && (fieldName.indexOf("AI.") > -1)) {
      if ((value.toString().length > 0) && (fieldName.indexOf("AI.StockPriceLive") > -1) && (value.toString().toLowerCase().indexOf("live data: {") > -1)) {
        // console.log(`${key}: ${value}`);
        // extract and transform the prompt (if necessary)
        var targetFieldName = value.toString().split("[")[1].split("]")[0];
        var targetFieldID = getFieldIDByName(targetFieldName, oFields);
        // console.log(`${key}: ${targetFieldName} / ${targetFieldID}`);
        // extract live data (if it exists)
        if (value.toString().toLowerCase().indexOf("live data: {") > -1) {
          // parse the query
          var q = value.toString().toLowerCase().split("live data: {{")[1].split("}}")[0];
          Logger.log(q);
          // perform the search
          var liveData = serpAPI(q, "5d");
          // Logger.log(liveData);
          // DriveApp.createFile("serp.json", liveData);
          // update the prompt to include the live data
          var begPos = value.toString().toLowerCase().indexOf("live data: {{") + 11;
          var endPos = value.toString().toLowerCase().indexOf("}}") + 2;
          // value = value.substring(0, begPos) + "`" + "...liveData..." + "`" + value.substring(endPos);
          value = value.substring(0, begPos) + "`" + liveData + "`" + value.substring(endPos);
          // Logger.log(value);
        }
        // process the inference
        var response = palmCreateTextCompletion_(value.toString());
        Logger.log(response);
        var oOutput  = JSON.parse(response);
        var output   = oOutput.candidates[0].output;
        // Logger.log(oOutput);
        if (value.toString().toLowerCase().indexOf("markdown") > -1) {
          var oContent = markdownToSmartDoc_(output);
          var output = {
            "data": {
              "type": "doc",
              "content": oContent
            }
          }
        }
        // update the target field
        var payload = {
          [targetFieldID] : output
        }
        // Logger.log(JSON.stringify(payload));
        updateRecord(recordID, payload);
      }
    }
  }
  
  return(true);
}