import AsyncStorage from '@react-native-community/async-storage';
import {AppState} from 'react-native';
import Background from './Background';

let inForeground = true;
AppState.addEventListener('change', state => {
  inForeground = state === 'active';
  log(`App state: ${state}`);
});

let logListeners: Array<(message: string) => void> = [];

export function addLogListener(listener: (message: string) => void) {
  logListeners.push(listener);
}

export function removeLogListener(listener: (message: string) => void) {
  logListeners = logListeners.filter(currentListener => {
    return currentListener !== listener;
  });
}

export function log(message: string) {
  const time = Date.now().toString();
  const messageWithTime = `${time}: ${message}`;
  console.log(messageWithTime);
  AsyncStorage.setItem(time, messageWithTime).catch(error => {
    console.warn(
      `Failed to send log: "${messageWithTime}" due to error: ${error.message}`,
    );
  });
  if (inForeground) {
    for (const listener of logListeners) {
      listener(messageWithTime);
    }
  }
}

export async function collectLogs() {
  const keys = await AsyncStorage.getAllKeys();
  let keyValueArray: Array<[string, string]> = [];
  for (const key of keys) {
    const value = await AsyncStorage.getItem(key);
    if (value == null) {
      continue;
    }
    keyValueArray.push([key, value]);
  }
  return keyValueArray
    .sort((a, b) => {
      return b < a ? 1 : -1;
    })
    .map(array => {
      return array[1];
    });
}

export function clearAllLogs() {
  return AsyncStorage.clear();
}

export function delay(timeout: number) {
  return new Promise(resolve => {
    Background.setTimeout(resolve, timeout);
  });
}