// Copyright (C) 2023 WYATT GROUP
// Please see the AUTHORS file for details.
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.

import 'dart:async';

import 'package:rxdart/subjects.dart';
import 'package:wyatt_authentication_bloc/src/domain/data_sources/local/authentication_session_data_source.dart';
import 'package:wyatt_authentication_bloc/src/domain/entities/auth_session.dart';

/// {@template authentication_session_data_source_impl}
/// A data source that manages the current session.
/// {@endtemplate}
class AuthenticationSessionDataSourceImpl<Data>
    extends AuthenticationSessionDataSource<Data> {
  /// {@macro authentication_session_data_source_impl}
  AuthenticationSessionDataSourceImpl();

  final StreamController<AuthenticationSession<Data>> _sessionStream =
      BehaviorSubject();

  @override
  void addSession(AuthenticationSession<Data> session) {
    _sessionStream.add(session);
  }

  @override
  Future<AuthenticationSession<Data>> currentSession() => sessionStream().last;

  @override
  Stream<AuthenticationSession<Data>> sessionStream() =>
      _sessionStream.stream.asBroadcastStream();
}
