import { Platform } from 'react-native';
import initSqlJs from 'sql.js'; // Load sql.js for Web
// For React Native, use react-native-sqlite-storage
let SQLite;
if (Platform.OS !== 'web') {
  SQLite = require('react-native-sqlite-storage'); // Load for React Native
  SQLite.enablePromise(true); // Enable promise support for React Native SQLite
}

let db;

// Initialize the SQLite database
export const initializeDatabase = async () => {
  try {
    if (Platform.OS !== 'web') {
      // React Native version using react-native-sqlite-storage
      db = await SQLite.openDatabase({ name: 'app.db', location: 'default' });

      // Create tables for React Native
      await db.executeSql(`
        CREATE TABLE IF NOT EXISTS Clients (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          username TEXT UNIQUE NOT NULL,
          public_key TEXT NOT NULL,
          private_key TEXT NOT NULL
        )
      `);

      await db.executeSql(`
        CREATE TABLE IF NOT EXISTS FriendList (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          username TEXT UNIQUE NOT NULL,
          public_key TEXT NOT NULL
        )
      `);

      await db.executeSql(`
        CREATE TABLE IF NOT EXISTS Messages (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          sender_username TEXT NOT NULL,
          receiver_username TEXT NOT NULL,
          message TEXT NOT NULL,
          nonce TEXT NOT NULL,
          timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
        )
      `);
    } else {
      // Web version using sql.js
      const SQL = await initSqlJs({
        locateFile: (file) => {
          // Correct the path to sql-wasm.wasm based on where it's served in the public folder
          if (file === "sql-wasm.wasm") {
            return "/assets/wasm/sql-wasm.wasm"; // This assumes it's in the public folder and served correctly
          }
          return file;
        }
      });

      // Create an in-memory database for the web
      db = new SQL.Database();

      // Create tables for Web
      db.run(`
        CREATE TABLE IF NOT EXISTS Clients (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          username TEXT UNIQUE NOT NULL,
          public_key TEXT NOT NULL,
          private_key TEXT NOT NULL
        )
      `);

      db.run(`
        CREATE TABLE IF NOT EXISTS FriendList (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          username TEXT UNIQUE NOT NULL,
          public_key TEXT NOT NULL
        )
      `);

      db.run(`
        CREATE TABLE IF NOT EXISTS Messages (
          id INTEGER PRIMARY KEY AUTOINCREMENT,
          sender_username TEXT NOT NULL,
          receiver_username TEXT NOT NULL,
          message TEXT NOT NULL,
          nonce TEXT NOT NULL,
          timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
        )
      `);
    }

    console.log('Database initialized and tables created');
  } catch (err) {
    console.error('Error initializing database:', err);
    throw err;
  }
};

// CRUD Operations for React Native and Web

export const addClient = async (username, publicKey, privateKey) => {
  try {
    if (Platform.OS !== 'web') {
      // React Native version using react-native-sqlite-storage
      await db.executeSql(
        `INSERT INTO Clients (username, public_key, private_key) VALUES (?, ?, ?)`,
        [username, publicKey, privateKey]
      );
    } else {
      // Web version using sql.js
      db.run(
        `INSERT INTO Clients (username, public_key, private_key) VALUES (?, ?, ?)`,
        [username, publicKey, privateKey]
      );
    }
    console.log('Client added successfully');
  } catch (err) {
    console.error('Error adding client:', err);
  }
};

export const getAllFriends = async () => {
  try {
    let results;
    if (Platform.OS !== 'web') {
      // React Native version using react-native-sqlite-storage
      results = await db.executeSql(`SELECT * FROM FriendList`);
      return results[0].rows.raw(); // Return friends for React Native
    } else {
      // Web version using sql.js
      results = db.exec(`SELECT * FROM FriendList`);
      return results[0].values; // Return friends for Web
    }
  } catch (err) {
    console.error('Error retrieving friends:', err);
  }
};

export const getMessages = async (username) => {
  try {
    let results;
    if (Platform.OS !== 'web') {
      // React Native version using react-native-sqlite-storage
      results = await db.executeSql(
        `SELECT * FROM Messages WHERE sender_username = ? OR receiver_username = ? ORDER BY timestamp ASC`,
        [username, username]
      );
      return results[0].rows.raw(); // Return messages for React Native
    } else {
      // Web version using sql.js
      results = db.exec(
        `SELECT * FROM Messages WHERE sender_username = ? OR receiver_username = ? ORDER BY timestamp ASC`,
        [username, username]
      );
      return results[0].values; // Return messages for Web
    }
  } catch (err) {
    console.error('Error retrieving messages:', err);
  }
};

// Close the database
export const closeDatabase = () => {
  try {
    if (Platform.OS !== 'web') {
      // React Native version using react-native-sqlite-storage
      db.close();
    } else {
      // Web version using sql.js (no explicit close method, just stop using the db)
      console.log('Database is in-memory on the web, no close method.');
    }
    console.log('Database closed');
  } catch (err) {
    console.error('Error closing database:', err);
  }
};

export const getClient = async (username) => {
    try {
      let results;
      if (Platform.OS !== 'web') {
        // React Native version using react-native-sqlite-storage
        results = await db.executeSql(
          `SELECT * FROM Clients WHERE username = ?`,
          [username]
        );
  
        if (results[0].rows.length > 0) {
          const client = results[0].rows.item(0); // Get the first matching row
          return {
            username: client.username,
            public_key: client.public_key,
            private_key: client.private_key,
          };
        } else {
          console.warn('Client not found for username:', username);
          return null;
        }
      } else {
        // Web version using sql.js
        results = db.exec(`SELECT * FROM Clients WHERE username = ?`, [username]);
  
        if (results.length > 0 && results[0].values.length > 0) {
          const client = results[0].values[0]; // Get the first matching row
          return {
            username: client[1], // The second column is the username
            public_key: client[2], // The third column is the public_key
            private_key: client[3], // The fourth column is the private_key
          };
        } else {
          console.warn('Client not found for username:', username);
          return null;
        }
      }
    } catch (err) {
      console.error('Error retrieving client:', err);
    }
  };
  