/**
 * @Description 数据库工具
 * @Author ZPFly
 * @Date 2021/10/12
 */
class DbService {
  private dbName = "creditDb";
  private dbVersion = 1;
  private db: any;
  //name:表名  key:主键 ,cursorIndex 索引
  store = {
    sysDict: { name: "sysDict", key: "dictId", cursorIndex: [{ name: "dictField", unique: false }] },
    multiMedia: { name: "multiMedia", key: "id", autoIncrement: true, cursorIndex: [{ name: "objId", unique: false }] },
  };
  initDB() {
    const store: any = this.store;
    const request = indexedDB.open(this.dbName, this.dbVersion);
    return new Promise((resolve) => {
      request.onerror = function () {
        console.log("打开数据库失败");
      };
      request.onsuccess = (event: any) => {
        console.log("打开数据库成功");
        this.db = event.target.result;
        resolve(true);
      };
      request.onupgradeneeded = (event: any) => {
        const db = event.target.result;
        for (const t in store) {
          if (!db.objectStoreNames.contains(store[t].name)) {
            const objectStore = db.createObjectStore(store[t].name, {
              keyPath: store[t].key,
              autoIncrement: !!store[t].autoIncrement,
            });
            for (let i = 0; i < store[t].cursorIndex.length; i++) {
              const element = store[t].cursorIndex[i];
              objectStore.createIndex(element.name, element.name, {
                unique: element.unique,
              });
            }
          }
        }
        console.log("数据库升级完成");
      };
    });
  }
  // 打开数据库  await this.openDB();
  private openDB() {
    return new Promise((resolve, reject) => {
      const request = indexedDB.open(this.dbName, this.dbVersion);
      request.onerror = function (event) {
        reject("IndexedDB数据库打开错误," + event);
      };
      request.onsuccess = function (event: any) {
        resolve(event.target.result);
      };
    });
  }
  // 添加数据,add添加新值
  async insert(table: string, data: any) {
    try {
      // const db: any = await this.openDB();
      const request = this.db.transaction(table, "readwrite").objectStore(table);
      return new Promise((resolve) => {
        request.add(data);
        request.onerror = function () {
          console.error("添加数据出错");
          resolve("添加数据出错");
        };
        request.onsuccess = function () {
          resolve(true);
        };
      });
    } catch (error) {
      console.log(error);
      return Promise.resolve(false);
    }
  }
  // 批量添加数据,add添加新值
  async batInsert(table: string, values: Array<any>) {
    try {
      // const db: any = await this.openDB();
      const request = this.db.transaction(table, "readwrite").objectStore(table);
      return new Promise((resolve) => {
        for (const data of values) {
          request.add(data);
        }
        request.onerror = function () {
          console.error("添加数据出错");
          resolve("添加数据出错");
        };
        request.onsuccess = function () {
          resolve(true);
        };
      });
    } catch (error) {
      console.log(error);
      return Promise.resolve(false);
    }
  }
  // 更新
  async update(table: string, values: Array<any>) {
    try {
      const db: any = await this.openDB();
      const request = db.transaction(table, "readwrite").objectStore(table);
      return new Promise((resolve) => {
        for (const data of values) {
          request.put(data);
        }
        request.onerror = function () {
          console.log("数据更新失败");
          resolve(false);
        };
        request.onsuccess = function (e: any) {
          console.log(e);
          console.log("数据更新成功");
          // resolve(true);
        };
      });
    } catch (error) {
      return Promise.resolve(false);
    }
  }
  // 删除数据
  async delete(table: string, keyValue: any) {
    try {
      // const db: any = await this.openDB();
      const request: any = this.db.transaction(table, "readwrite").objectStore(table).delete(keyValue);
      return new Promise((resolve) => {
        request.onerror = function () {
          resolve(false);
        };
        request.onsuccess = function () {
          resolve(true);
        };
      });
    } catch (error) {
      return Promise.resolve(false);
    }
  }
  // 查询数据 表名 索引值 索引 key  没有value key为key 而不是索引
  async get(table: string, keyValue?: any, indexCursor?: string) {
    try {
      // const db: any = await this.openDB();
      const store = this.db.transaction(table, "readonly").objectStore(table);
      const request: any = !keyValue ? store.openCursor() : indexCursor ? store.index(indexCursor).openCursor(keyValue) : store.get(keyValue);
      const data: any = [];
      return new Promise((resolve) => {
        request.onerror = function () {
          resolve("查询数据失败");
        };
        request.onsuccess = function (event: any) {
          if (indexCursor) {
            if (event.target.result) {
              console.log(event.target.result.value);
              data.push(event.target.result.value);
              event.target.result.continue();
            } else {
              resolve(data);
            }
          } else {
            resolve(event.target.result);
          }
        };
      });
    } catch (error) {
      return Promise.reject(error);
    }
  }
  // 通过索引游标操作数据, callback中要有游标移动方式
  async handleDataByIndex(table: string, keyRange: any, cursorIndex?: string) {
    try {
      const kRange = keyRange || "";
      // const db: any = await this.openDB();
      const store: any = this.db.transaction(table, "readwrite").objectStore(table);
      const request: any = store.index(cursorIndex).openCursor(kRange);
      return new Promise((resolve) => {
        request.onerror = function () {
          resolve("通过索引游标获取数据报错");
        };
        request.onsuccess = function (event: any) {
          const cursor = event.target.result;
          if (cursor) {
            resolve(cursor);
          }
        };
      });
    } catch (error) {
      return Promise.reject(error);
    }
  }
  // 清空数据
  async clear(table: string) {
    // const db: any = await this.openDB();
    const store = this.db.transaction(table, "readwrite").objectStore(table);
    store.clear();
  }
  // 删除表
  deleteTable(table: string) {
    const deleteQuest = indexedDB.deleteDatabase(table);
    return new Promise((resolve) => {
      deleteQuest.onerror = function () {
        resolve(false);
      };
      deleteQuest.onsuccess = function () {
        resolve(true);
      };
    });
  }
}
const dbService = new DbService();
export default dbService;