'use strict';

const RightTrackDBTemplate = require('right-track-db');
const sqlite3 = require('sqlite3');

/**
 * RightTrackDB Implementation
 * -------------------------------
 * This Class is an implementation of the abstract `RightTrackDB` Class.
 *
 * This implementation uses the node `sqlite3` module to provide the
 * actual SQLite functionality.
 *
 * @class
 */
class RightTrackDB extends RightTrackDBTemplate {

  /**
   * Right Track Database Constructor
   * @constructor
   * @param {RightTrackAgency} agency The Right Track Agency this DB will be used to query
   */
  constructor(agency) {
    super(agency);
    this.db = new sqlite3.Database(this.location);
  }


  /**
   * Select multiple rows from the database
   * @param {string} statement Select Statement
   * @param {function} callback {@link RightTrackDB~selectCallback|selectCallback} callback function
   */
  select(statement, callback) {
    this.db.all(statement, function(err, rows) {

      // SQLite Error
      if (err) {
        console.error('ERROR SELECTING RESULTS FROM DB');
        console.error(statement);
        console.error(err);
        return callback(err);
      }

      // Return Results
      return callback(null, rows);

    });
  }

  /**
   * Select a single row from the database.  If no results are selected, this
   * will return undefined.  If more than 1 results are selected it will
   * return the first result.
   * @param {string} statement Select Statement
   * @param {function} callback {@link RightTrackDB~getCallback|getCallback} callback function
   */
  get(statement, callback) {
    this.db.get(statement, function(err, row) {

      // SQLite ERROR
      if (err) {
        console.error('ERROR SELECTING FIRST RESULT FROM DB');
        console.error(statement);
        console.error(err);
        return callback(err);
      }

      // Return Result
      return callback(null, row);

    });
  }

}


// ==== CALLBACK DEFINITIONS ==== //

/**
 * This callback is performed after performing a SELECT query
 * that can return multiple rows.
 * @callback RightTrackDB~selectCallback
 * @param {Error} error Database Query Error
 * @param {object[]} [rows] Selected rows
 */

/**
 * This callback is performed after performing a SELECT query
 * that will return the first row.
 * @callback RightTrackDB~getCallback
 * @param {Error} error Database Query Error
 * @param {object} [row] First selected row
 */


module.exports = RightTrackDB;