const WorkspaceChats = {
  tablename: 'workspace_chats',
  colsInit: `
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  workspaceId INTEGER NOT NULL,
  prompt TEXT NOT NULL,
  response TEXT NOT NULL,
  include BOOL DEFAULT true,
  createdAt TEXT DEFAULT CURRENT_TIMESTAMP,
  lastUpdatedAt TEXT DEFAULT CURRENT_TIMESTAMP
  `,
  db: async function () {
    const sqlite3 = require('sqlite3').verbose();
    const { open } = require('sqlite');

    const db = await open({
      filename: 'anythingllm.db',
      driver: sqlite3.Database
    })

    await db.exec(`CREATE TABLE IF NOT EXISTS ${this.tablename} (${this.colsInit})`);
    db.on('trace', (sql) => console.log(sql))
    return db
  },
  new: async function ({ workspaceId, prompt, response = {} }) {
    const db = await this.db()
    const { id, success, message } = await db.run(`INSERT INTO ${this.tablename} (workspaceId, prompt, response) VALUES (?, ?, ?)`, [workspaceId, prompt, JSON.stringify(response)])
      .then((res) => {
        return { id: res.lastID, success: true, message: null }
      })
      .catch((error) => {
        return { id: null, success: false, message: error.message }
      })
    if (!success) return { chat: null, message }

    const chat = await db.get(`SELECT * FROM ${this.tablename} WHERE id = ${id}`)
    return { chat, message: null }
  },
  forWorkspace: async function (workspaceId = null) {
    if (!workspaceId) return [];
    return await this.where(`workspaceId = ${workspaceId} AND include = true`, null, 'ORDER BY id ASC')
  },
  markHistoryInvalid: async function (workspaceId = null) {
    if (!workspaceId) return;
    const db = await this.db()
    await db.run(`UPDATE ${this.tablename} SET include = false WHERE workspaceId = ?`, [workspaceId]);
    return;
  },
  get: async function (clause = '') {
    const db = await this.db()
    const result = await db.get(`SELECT * FROM ${this.tablename} WHERE ${clause}`).then((res) => res || null)
    if (!result) return null;
    return result
  },
  delete: async function (clause = '') {
    const db = await this.db()
    await db.get(`DELETE FROM ${this.tablename} WHERE ${clause}`)
    return true
  },
  where: async function (clause = '', limit = null, order = null) {
    const db = await this.db()
    const results = await db.all(`SELECT * FROM ${this.tablename} ${clause ? `WHERE ${clause}` : ''} ${!!limit ? `LIMIT ${limit}` : ''} ${!!order ? order : ''}`)
    return results
  },
}

module.exports = { WorkspaceChats }