import React, { useEffect } from 'react';
import ExpoKeepAwake from './ExpoKeepAwake';

// NOTE(brentvatne): in tests this value won't be reset because we can render a component and never
// unmount it.
let __keepAwakeMountedCount = 0;
const ExpoKeepAwakeTag = 'ExpoKeepAwakeDefaultTag';

export default class KeepAwake extends React.PureComponent {
  static activate = (tag?: string): void => {
    console.warn(
      `The "KeepAwake.activate" static method has been deprecated in favor of the "activateKeepAwake" function exported from expo-keep-awake and will be removed in SDK 35`
    );
    activateKeepAwake(tag);
  };

  static deactivate = (tag?: string): void => {
    console.warn(
      `The "KeepAwake.deactivate" static method has been deprecated in favor of the "deactivateKeepAwake" function exported from expo-keep-awake and will be removed in SDK 35`
    );
    deactivateKeepAwake(tag);
  };

  componentDidMount() {
    console.warn(
      `The KeepAwake component has been deprecated in favor of the useKeepAwake hook and will be removed in SDK 35`
    );
    __keepAwakeMountedCount++;
    if (__keepAwakeMountedCount === 1) {
      activateKeepAwake();
    }
  }

  componentWillUnmount() {
    __keepAwakeMountedCount--;
    if (__keepAwakeMountedCount === 0) {
      deactivateKeepAwake();
    }
  }

  render() {
    return null;
  }
}

export function useKeepAwake(tag: string = ExpoKeepAwakeTag): void {
  useEffect(() => {
    activateKeepAwake(tag);
    return () => deactivateKeepAwake(tag);
  }, [tag]);
}

export function activateKeepAwake(tag: string = ExpoKeepAwakeTag): void {
  ExpoKeepAwake.activate(tag);
}

export function deactivateKeepAwake(tag: string = ExpoKeepAwakeTag): void {
  ExpoKeepAwake.deactivate(tag);
}

export function activate(tag?: string): void {
  console.warn(
    `"activate" from expo-keep-awake has been deprecated in favor of "activateKeepAwake" and will be removed in SDK 35`
  );
  activateKeepAwake(tag);
}

export function deactivate(tag?: string): void {
  console.warn(
    `"deactivate" from expo-keep-awake has been deprecated in favor of "deactivateKeepAwake" and will be removed in SDK 35`
  );
  deactivateKeepAwake(tag);
}