// 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/>.

part of 'crud_base_cubit.dart';

abstract class CrudState extends Equatable {
  const CrudState();

  @override
  List<Object?> get props => [];
}

/// Initial state of the CrudBaseCubit.
class CrudInitial extends CrudState {
  const CrudInitial();
}

/// Loading state of the CrudBaseCubit.
class CrudLoading extends CrudState {
  const CrudLoading();
}

/// Error state of the CrudBaseCubit.
class CrudError extends CrudState {
  const CrudError(this.message);
  final String? message;

  @override
  List<Object?> get props => [message];
}

/// Success state of the CrudBaseCubit.
/// This state is used to indicate that the operation was successful.
/// Can be one or list of objects.
abstract class CrudSuccess extends CrudState {
  const CrudSuccess();
}

/// Success state of the CrudBaseCubit.
/// This state is used to indicate that the operation was successful.
/// Contains no objects.
/// Used for create, update, delete operations.
class CrudOkReturn extends CrudSuccess {
  const CrudOkReturn();
}

/// Loaded state of the CrudBaseCubit.
/// This state is used to indicate that the operation was successful.
/// Contains one object.
class CrudLoaded<T> extends CrudSuccess {
  const CrudLoaded(this.data);
  final T? data;

  @override
  List<Object?> get props => [data];
}

/// Loaded state of the CrudBaseCubit.
/// This state is used to indicate that the operation was successful.
/// Contains list of objects.
class CrudListLoaded<T> extends CrudSuccess {
  const CrudListLoaded(this.data);
  final List<T?> data;

  @override
  List<Object> get props => [data];
}
