part of '../neon_files.dart';

abstract class FilesBrowserBlocEvents {
  void setPath(final List<String> path);

  void createFolder(final List<String> path);
}

abstract class FilesBrowserBlocStates {
  BehaviorSubject<Result<List<WebDavFile>>> get files;

  BehaviorSubject<List<String>> get path;
}

class FilesBrowserBloc extends InteractiveBloc implements FilesBrowserBlocEvents, FilesBrowserBlocStates {
  FilesBrowserBloc(
    this._requestManager,
    this.options,
    this.account,
  ) {
    unawaited(refresh());
  }

  final RequestManager _requestManager;
  final FilesAppSpecificOptions options;
  final Account account;

  @override
  void dispose() {
    unawaited(files.close());
    unawaited(path.close());
    super.dispose();
  }

  @override
  BehaviorSubject<Result<List<WebDavFile>>> files = BehaviorSubject<Result<List<WebDavFile>>>();

  @override
  BehaviorSubject<List<String>> path = BehaviorSubject<List<String>>.seeded([]);

  @override
  Future refresh() async {
    await _requestManager.wrapWebDav<List<WebDavFile>>(
      account.id,
      'files-${path.value.join('/')}',
      files,
      () async => account.client.webdav.propfind(
        path.value.join('/'),
        prop: WebDavPropWithoutValues.fromBools(
          davgetcontenttype: true,
          davgetetag: true,
          davgetlastmodified: true,
          nchaspreview: true,
          ocsize: true,
          ocfavorite: true,
        ),
        depth: WebDavDepth.one,
      ),
      (final response) => response.toWebDavFiles().sublist(1),
      emitEmptyCache: true,
    );
  }

  @override
  void setPath(final List<String> p) {
    path.add(p);
    unawaited(refresh());
  }

  @override
  void createFolder(final List<String> path) {
    wrapAction(() async => account.client.webdav.mkcol(path.join('/')));
  }
}