sealed class MeteringCommunicationState {
  const MeteringCommunicationState();
}

class InitState extends MeteringCommunicationState {
  const InitState();
}

sealed class SourceState extends MeteringCommunicationState {
  const SourceState();
}

sealed class ScreenState extends MeteringCommunicationState {
  const ScreenState();
}

class MeasureState extends SourceState {
  const MeasureState();
}

sealed class MeasuredState extends ScreenState {
  final double? ev100;

  const MeasuredState(this.ev100);
}

class MeteringInProgressState extends MeasuredState {
  const MeteringInProgressState(super.ev100);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    return other is MeteringInProgressState && other.ev100 == ev100;
  }

  @override
  int get hashCode => Object.hash(ev100, runtimeType);
}

class MeteringEndedState extends MeasuredState {
  const MeteringEndedState(super.ev100);

  @override
  bool operator ==(Object other) {
    if (identical(this, other)) return true;
    if (other.runtimeType != runtimeType) return false;
    return other is MeteringEndedState && other.ev100 == ev100;
  }

  @override
  int get hashCode => Object.hash(ev100, runtimeType);
}

class SettingsOpenedState extends SourceState {
  const SettingsOpenedState();
}

class SettingsClosedState extends SourceState {
  const SettingsClosedState();
}