// Copyright (C) 2022 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 'package:wyatt_architecture/wyatt_architecture.dart';
import 'package:wyatt_form_bloc/src/domain/form/wyatt_form.dart';
import 'package:wyatt_form_bloc/src/domain/repositories/form_repository.dart';

class FormRepositoryImpl extends FormRepository {
  final Map<String, WyattForm> _runtimeForms = {};

  @override
  Map<String, WyattForm> get runtimeForms => _runtimeForms;

  @override
  WyattForm accessForm(String formName) {
    if (_runtimeForms.containsKey(formName)) {
      return _runtimeForms[formName]!;
    } else {
      throw ClientException(
        'Form $formName is not registered. Just use '
        '`FormRepository.register(yourForm);` before any operation on it.',
      );
    }
  }

  @override
  void registerForm(WyattForm form) {
    _runtimeForms[form.name] = form;
  }

  @override
  void updateForm(WyattForm form) {
    if (_runtimeForms.containsKey(form.name)) {
      _runtimeForms[form.name] = form;
    } else {
      throw ClientException(
        'Form ${form.name} is not registered. Just use '
        '`FormRepository.register(yourForm);` before any operation on it.',
      );
    }
  }

  @override
  void unregisterForm(String formName) {
    _runtimeForms.remove(formName);
  }

  @override
  String toString() => 'FormRepository($_runtimeForms)';
}
