const { db } = require('./config');

class BookService {
  /**
   * 创建新项目
   * @param {Object} bookData - 项目数据
   * @returns {Promise<number>} - 返回新创建的项目ID
   */
  async createBook(bookData) {
    try {
      const now = new Date().toISOString();
      const book = {
        title: bookData.title,
        video_path: bookData.video_path || null,
        subtitle_path: bookData.subtitle_path || null,
        audio_path: bookData.audio_path || null,
        created_at: now,
        updated_at: now
      };
      
      // 插入数据并返回ID
      const [id] = await db('book').insert(book);
      return id;
    } catch (error) {
      console.error('创建项目失败:', error);
      throw error;
    }
  }

  /**
   * 获取所有项目
   * @returns {Promise<Array>} - 返回项目列表
   */
  async getAllBooks() {
    try {
      // 按创建时间降序排列
      const books = await db('book').orderBy('created_at', 'desc');
      return books;
    } catch (error) {
      console.error('获取项目列表失败:', error);
      throw error;
    }
  }

  /**
   * 根据ID获取项目
   * @param {number} id - 项目ID
   * @returns {Promise<Object>} - 返回项目信息
   */
  async getBookById(id) {
    try {
      const book = await db('book').where({ id }).first();
      return book;
    } catch (error) {
      console.error(`获取项目(ID: ${id})失败:`, error);
      throw error;
    }
  }

  /**
   * 更新项目信息
   * @param {number} id - 项目ID
   * @param {Object} bookData - 更新的项目数据
   * @returns {Promise<boolean>} - 返回是否更新成功
   */
  async updateBook(id, bookData) {
    try {
      const book = await this.getBookById(id);
      if (!book) {
        throw new Error(`项目(ID: ${id})不存在`);
      }
      
      const updatedBook = {
        ...bookData,
        updated_at: new Date().toISOString()
      };
      
      await db('book').where({ id }).update(updatedBook);
      return true;
    } catch (error) {
      console.error(`更新项目(ID: ${id})失败:`, error);
      throw error;
    }
  }

  /**
   * 删除项目
   * @param {number} id - 项目ID
   * @returns {Promise<boolean>} - 返回是否删除成功
   */
  async deleteBook(id) {
    try {
      // 由于外键约束，删除book会自动删除关联的book_info
      await db('book').where({ id }).delete();
      return true;
    } catch (error) {
      console.error(`删除项目(ID: ${id})失败:`, error);
      throw error;
    }
  }
}

module.exports = new BookService();