// Event logger
// Enter a record into the "log" sheet of this spreadsheet document: timestamp and event description.

// m_ indicates global (m for module) scope
var m_doc = SpreadsheetApp.getActiveSpreadsheet();
var m_sheet = m_doc.getSheetByName('log');
var m_nColumns = 3; // number of columns in the sheet

// Handle HTTP GET request:
function doGet( e) {
    return addLogRecord(e.parameter['mode'], e.parameter['eventDesc'], false);
}

function testAddLogRecord() {
    let result = addLogRecord( "test", "test event", true);
    Logger.log("result from addLogRecords = " + JSON.stringify( result));
}

function addLogRecord( mode, eventDesc, debug) {
    // A script lock, one that locks out all but one invocation. Forces one-at-a-time (wait your turn) operation.
    // http://googleappsdeveloper.blogspot.co.uk/2011/10/concurrency-and-google-apps-script.html
    var lock = LockService.getScriptLock();
    
    // Attempt to acquire the lock, timing out with an exception after the specified number of milliseconds.
    lock.waitLock(30000); // 30 seconds
    
    try {
        // Sort the sheet by timestamp (column 1), descending order. This removes editing blanks.
        var nRows = m_sheet.getLastRow() - 1; // -1 because of header
        if (nRows > 0) {
            var range = m_sheet.getRange(2, 1, nRows, m_nColumns);
            range.sort([{column:1, ascending:false}]);
        }
    
        var timeNow = new Date(); // create a timestamp
        //var dayOfWeek = timeNow.getDay();
        // Note: YYYY (uppercase) will produce incorrect date strings around the new year. Must use yyyy (lowercase).
        // YYYY: Week-based year (ISO week date year)
        // yyyy: Calendar year
        var timeString = Utilities.formatDate(timeNow, "America/Chicago", "MMM d, yyyy EEE hh:mm:ss a");
        
        // Create an array of the new data to facilitate the write.
        var row = [[timeNow, timeString, eventDesc + ""]];  // empty string is for testing...
        
        // Add a blank row after the header
        m_sheet.insertRows(2, 1);
        
        // Put the new data into that blank row.
        m_sheet.getRange(2, 1, 1, m_nColumns).setValues(row);
        
        return ContentService.createTextOutput(JSON.stringify( {'result':'ok'} )).setMimeType(ContentService.MimeType.JSON);
        
    } catch (e) {
        var errorSummary = {"result":"error", "error": e};
        if (debug) {
            return errorSummary;    
        } else {  
            return ContentService.createTextOutput(JSON.stringify( errorSummary)).setMimeType(ContentService.MimeType.JSON);
        }
        
    } finally {
        lock.releaseLock();
    }
}

// Update the formats for a column. Call this from the "Run" menu.
function formatTimeStamps() {
    var nRows = m_sheet.getLastRow() - 1; // -1 because of the header
    if (nRows > 0) {
        // start below the header, row 2, and in column 2
        var range = m_sheet.getRange(2, 2, nRows, 1);
        
        range.setNumberFormat("dddd h:mm:ss A/P");  // dddd, m/d/yy h:mm:ss A/P
        range.setBackground('white');
    }
}

function checkForOldRecords() {
    // pad is a library
    pad.sortAndTrim_clean('log', 1, 3, true); // sheetname, extra days to keep, columns, use midnight
}