import { injectable, inject } from '@theia/core/shared/inversify';
import { StorageService } from '@theia/core/lib/browser/storage-service';
import {
  Command,
  CommandContribution,
  CommandRegistry,
} from '@theia/core/lib/common/command';

/**
 * This is a workaround to break cycles in the dependency injection. Provides commands for `setData` and `getData`.
 */
@injectable()
export class StorageWrapper implements CommandContribution {
  @inject(StorageService)
  protected storageService: StorageService;

  registerCommands(commands: CommandRegistry): void {
    commands.registerCommand(StorageWrapper.Commands.GET_DATA, {
      execute: (key: string, defaultValue?: any) =>
        this.storageService.getData(key, defaultValue),
    });
    commands.registerCommand(StorageWrapper.Commands.SET_DATA, {
      execute: (key: string, value: any) =>
        this.storageService.setData(key, value),
    });
  }
}
export namespace StorageWrapper {
  export namespace Commands {
    export const SET_DATA: Command = {
      id: 'arduino-store-wrapper-set',
    };
    export const GET_DATA: Command = {
      id: 'arduino-store-wrapper-get',
    };
  }
}
