File: /var/dev/farhangmoaser/web/models/voucher.js
"use strict";
var md5 = require('md5');
class VoucherModel {
  /**
   * Constructor
   * @param  {Object} data values for table fields.
   */
  constructor(conn, data) {
    this.data = data;
    this.conn = conn;
  }
  field(key, value) {
    if(arguments.length==0) return;
    if(arguments.length==1)
      return this.data[key];
    
    if(value===undefined)
      delete this.data[key];
    else
      this.data[key] = value;
  }
  fields(){
    return this.data;
  }
  /*save() {
    if(this.data.hasOwnProperty('id')) return this.update();
    else return this.add();
  }*/
  /* --- */
  add() {
    return new Promise((resolve, reject) => {
      if(!this.data.hasOwnProperty('id')) reject('id is required.');
      var record = {id: this.data.id};
      if(this.data.hasOwnProperty('source')) record.source = this.data.source;
      if(this.data.hasOwnProperty('desc')) record.desc = this.data.desc;
      if(this.data.hasOwnProperty('user')) record.user = this.data.user;
      if(this.data.hasOwnProperty('group')) record.group = this.data.group;
      if(this.data.hasOwnProperty('period')) record.period = this.data.period;
      if(this.data.hasOwnProperty('dateFrom')) record.dateFrom = this.data.dateFrom;
      if(this.data.hasOwnProperty('dateTo')) record.dateTo = this.data.dateTo;
      if(this.data.hasOwnProperty('state')) record.state = this.data.state;
      this.conn.query(`INSERT INTO voucher SET ?`, record, (err, result) => {
        if(err) return reject(err.message);
        resolve(this);
      })
    });
  }
  /* --- */
  update() {
    return new Promise((resolve, reject) => {
      if(!this.data.hasOwnProperty('id')) reject('id is required.');
      var record = {};
      if(this.data.hasOwnProperty('source')) record.source = this.data.source;
      if(this.data.hasOwnProperty('desc')) record.desc = this.data.desc;
      if(this.data.hasOwnProperty('user')) record.user = this.data.user;
      if(this.data.hasOwnProperty('group')) record.group = this.data.group;
      if(this.data.hasOwnProperty('period')) record.period = this.data.period;
      if(this.data.hasOwnProperty('dateFrom')) record.dateFrom = this.data.dateFrom;
      if(this.data.hasOwnProperty('dateTo')) record.dateTo = this.data.dateTo;
      if(this.data.hasOwnProperty('activation')) record.activation = this.data.activation;
      if(this.data.hasOwnProperty('subscription')) record.subscription = this.data.subscription;
      if(this.data.hasOwnProperty('state')) record.state = this.data.state;
      this.conn.query(`UPDATE voucher SET ? where ?`, [record, {id: this.data.id}], (err, result) => {
        if(err) return reject(err.message);
        resolve(this);
      });
    });
  }
  /* --- */
  delete() {
    var self = this;
    return new Promise(function(resolve, reject){
      if(!self.data.hasOwnProperty('id')) reject('id is required.');
      self.conn.query(`delete from voucher where ?`, {id: self.data.id}, function(err, result){
        if(err) return reject(err.message);
        resolve();
      })
    });
  }
  /* --- */
  load(details) {
    return new Promise((resolve, reject) => {
      if(!this.data.hasOwnProperty('id')) return reject('id is required.');
      var table = details ? 'voucher_details' : 'voucher';
      this.conn.query(`SELECT * FROM ${table} WHERE ?`, {id: this.data.id}, (err, rows, fields) => {
        if (err) return reject(err.message);
        if(rows.length) {
          this.data = rows[0];
          resolve(this);
        } else
          resolve(false);
      });
    });
  }
  /* --- */
  static list(conn, query, limit, offset, orderBy) {
    if(!orderBy) orderBy = 'newest';
    var orderByStr = '';
    switch(orderBy){
      case 'newest':
        orderByStr = 'ORDER BY `created` DESC, id DESC';
        break;
      case 'oldest':
        orderByStr = 'ORDER BY `created` ASC, id ASC';
        break;
      case 'source_title:a-z':
        orderByStr = 'ORDER BY `source_title` ASC, id ASC';
        break;
      case 'source_title:z-a':
        orderByStr = 'ORDER BY `source_title` DESC, id ASC';
        break;
      case 'period:a-z':
        orderByStr = 'ORDER BY `period` ASC, id ASC';
        break;
      case 'period:z-a':
        orderByStr = 'ORDER BY `period` DESC, id ASC';
        break;
      case 'dateFrom:a-z':
        orderByStr = 'ORDER BY `dateFrom` ASC, id ASC';
        break;
      case 'dateFrom:z-a':
        orderByStr = 'ORDER BY `dateFrom` DESC, id ASC';
        break;
      case 'dateTo:a-z':
        orderByStr = 'ORDER BY `dateTo` ASC, id ASC';
        break;
      case 'dateTo:z-a':
        orderByStr = 'ORDER BY `dateTo` DESC, id ASC';
        break;
    }
    limit = limit || 100;
    return new Promise(function(resolve, reject){
      var params = [offset, limit];
      var where = '';
      if(Object.keys(query).length) {
        where = 'WHERE !!';
        params.unshift(query);
      }
      var template = '';
      if(limit==-1)
        template = conn.format(`SELECT * FROM voucher_details ${where} ${orderByStr}`, params);
      else
        template = conn.format(`SELECT * FROM voucher_details ${where} ${orderByStr} limit ?, ?`, params);
      conn.query(template, query, function(err, rows, fields){
        if (err) return reject(err.message);
        resolve(rows);
      });
    });
  }
  static getActiveSubscriptionsOf(conn, id) {
    return new Promise(function(resolve, reject){
      var template = conn.format(`SELECT * FROM subscription_details WHERE user_id=? AND state=1 AND dateStart<NOW() AND dateExpire>NOW()`, [id]);
      conn.query(template, function(err, rows, fields){
        if (err) return reject(err.message);
        resolve(rows);
      });
    });
  }
  static count(conn, query) {
    return new Promise(function(resolve, reject){
      var where = '';
      if(Object.keys(query).length)
        where = 'WHERE !!';
      var template = conn.format(`SELECT COUNT(*) AS sum FROM voucher_details ${where}`, query);
      conn.query(template, query, function(err, rows, fields){
        if (err) return reject(err.message);
        resolve(rows[0].sum);
      });
    });
  }
}
module.exports = VoucherModel;