import 'dart:ui';

import 'package:aves/widgets/common/magnifier/controller/state.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/widgets.dart';

@immutable
class ScaleStateChange {
  const ScaleStateChange({
    required this.state,
    required this.source,
    this.childFocalPoint,
  });

  final ScaleState state;
  final ChangeSource source;
  final Offset? childFocalPoint;

  @override
  bool operator ==(Object other) => identical(this, other) || other is ScaleStateChange && runtimeType == other.runtimeType && state == other.state && childFocalPoint == other.childFocalPoint;

  @override
  int get hashCode => hashValues(state, source, childFocalPoint);

  @override
  String toString() => '$runtimeType#${shortHash(this)}{scaleState: $state, source: $source, childFocalPoint: $childFocalPoint}';
}

enum ScaleState {
  initial,
  covering,
  originalSize,
  zoomedIn,
  zoomedOut,
}

ScaleState defaultScaleStateCycle(ScaleState actual) {
  switch (actual) {
    case ScaleState.initial:
      return ScaleState.covering;
    case ScaleState.covering:
      return ScaleState.originalSize;
    case ScaleState.originalSize:
      return ScaleState.initial;
    case ScaleState.zoomedIn:
    case ScaleState.zoomedOut:
      return ScaleState.initial;
    default:
      return ScaleState.initial;
  }
}

typedef ScaleStateCycle = ScaleState Function(ScaleState actual);
