const ALIAS_REGEX = /\s+as\s+/i;

class Selection {
  constructor(table, column, alias) {
    this.table = table || null;
    this.column = column || null;
    this.alias = alias || null;
  }

  static create(selection, table = null) {
    let dotIdx, column;
    let alias = null;

    if (typeof selection !== 'string') {
      return null;
    }

    if (ALIAS_REGEX.test(selection)) {
      const parts = selection.split(ALIAS_REGEX);

      selection = parts[0].trim();
      alias = parts[1].trim();
    }

    dotIdx = selection.lastIndexOf('.');

    if (dotIdx !== -1) {
      table = selection.substr(0, dotIdx);
      column = selection.substr(dotIdx + 1);
    } else {
      column = selection;
    }

    return new this(table, column, alias);
  }

  static get SelectAll() {
    return SELECT_ALL;
  }

  get name() {
    return this.alias || this.column;
  }

  // Test if this selection "includes" another selection.
  // For example `foo.*` includes `foo.bar`.
  includes(that) {
    const tablesMatch = that.table === this.table || this.table === null;
    const colsMatch = this.column === that.column || this.column === '*';

    return tablesMatch && colsMatch;
  }
}

const SELECT_ALL = new Selection(null, '*');

module.exports = Selection;
