export interface OfflineTx {
  syncId: string;
  satsangId: string;
  memberId?: string;
  guestInfo?: {
    name: string;
    mobile?: string;
    city?: string;
  };
  action: 'markPresent' | 'unmark' | 'addGuest';
  clientMarkedAt: string;
  status: 'Pending Sync' | 'Needs Attention';
  error?: string;
  memberName?: string;
  userId?: string;
}

export function initOfflineDB(): Promise<IDBDatabase> {
  return new Promise((resolve, reject) => {
    if (typeof window === 'undefined') {
      reject(new Error('IndexedDB is only available in browser environments'));
      return;
    }
    const request = indexedDB.open('GeetaShyamOfflineDB', 1);

    request.onerror = () => reject(request.error);
    request.onsuccess = () => resolve(request.result);

    request.onupgradeneeded = (event) => {
      const db = request.result;
      if (!db.objectStoreNames.contains('attendanceQueue')) {
        db.createObjectStore('attendanceQueue', { keyPath: 'syncId' });
      }
    };
  });
}

export async function addOfflineTx(tx: OfflineTx): Promise<void> {
  const db = await initOfflineDB();
  return new Promise((resolve, reject) => {
    const transaction = db.transaction(['attendanceQueue'], 'readwrite');
    const store = transaction.objectStore('attendanceQueue');
    const request = store.put(tx);

    request.onsuccess = () => resolve();
    request.onerror = () => reject(request.error);
  });
}

export async function getOfflineTxs(): Promise<OfflineTx[]> {
  const db = await initOfflineDB();
  return new Promise((resolve, reject) => {
    const transaction = db.transaction(['attendanceQueue'], 'readonly');
    const store = transaction.objectStore('attendanceQueue');
    const request = store.getAll();

    request.onsuccess = () => resolve(request.result || []);
    request.onerror = () => reject(request.error);
  });
}

export async function deleteOfflineTx(syncId: string): Promise<void> {
  const db = await initOfflineDB();
  return new Promise((resolve, reject) => {
    const transaction = db.transaction(['attendanceQueue'], 'readwrite');
    const store = transaction.objectStore('attendanceQueue');
    const request = store.delete(syncId);

    request.onsuccess = () => resolve();
    request.onerror = () => reject(request.error);
  });
}

export async function updateOfflineTxStatus(syncId: string, status: 'Pending Sync' | 'Needs Attention', error?: string): Promise<void> {
  const db = await initOfflineDB();
  return new Promise((resolve, reject) => {
    const transaction = db.transaction(['attendanceQueue'], 'readwrite');
    const store = transaction.objectStore('attendanceQueue');
    
    const getReq = store.get(syncId);
    getReq.onsuccess = () => {
      const tx = getReq.result as OfflineTx;
      if (tx) {
        tx.status = status;
        tx.error = error;
        const putReq = store.put(tx);
        putReq.onsuccess = () => resolve();
        putReq.onerror = () => reject(putReq.error);
      } else {
        resolve();
      }
    };
    getReq.onerror = () => reject(getReq.error);
  });
}
