export interface Options {
  storeName: string;
  dbMode: IDBTransactionMode;
  error: (e: Event) => any;
  complete: (e: Event) => any;
  abort?: any;
}

export function validateStoreName(db: IDBDatabase, storeName: string) {
  return db.objectStoreNames.contains(storeName);
}

export function validateBeforeTransaction(
  db: IDBDatabase,
  storeName: string,
  reject: (errorMessage: string) => void,
) {
  if (!db) {
    reject(
      "You need to use the openDatabase function to create a database before you query it!",
    );
  }
  if (!validateStoreName(db, storeName)) {
    reject(`objectStore does not exists: ${storeName}`);
  }
}

export function createTransaction(
  db: IDBDatabase,
  options: Options,
): IDBTransaction {
  const trans: IDBTransaction = db.transaction(
    options.storeName,
    options.dbMode,
  );
  trans.onerror = options.error;
  trans.oncomplete = options.complete;
  trans.onabort = options.abort;
  return trans;
}

export function optionsGenerator(
  type: any,
  storeName: any,
  reject: (e: Event) => void,
  resolve: (e?: Event) => void,
): Options {
  return {
    storeName: storeName,
    dbMode: type,
    error: (e: Event) => {
      reject(e);
    },
    complete: () => {
      resolve();
    },
    abort: (e: Event) => {
      reject(e);
    },
  };
}

// export function* processRequest({ request, success, error }: any) {
//   request.onerror = function(event: Event) {
//     error(error);
//     yield error;
//   };
//   request.onsuccess = function(evt: Event) {
//     let cursor: IDBCursorWithValue = (<IDBRequest>evt.target).result;
//     if (cursor) {
//       result.push(cursor.value);
//       cursor.continue();
//     } else {
//       resolve(result);
//     }
//   };
// }
