import 'package:flutter/material.dart';

import 'package:firo_runner/main.dart';
import 'package:flame/components.dart';

// Class meant to be extended by any object that will move left on the screen.
// Ensures a relatively constant moving velocity, and takes care of sprite
// animations and positioning.
class MovingObject {
  late SpriteAnimationGroupComponent sprite;
  MyGame gameRef;

  MovingObject(this.gameRef);

  void setPosition(double x, double y) {
    sprite.position = Vector2(x, y);
  }

  void setSize(double x, double y) {
    sprite.size = Vector2(x, y);
  }

  Sprite getSprite() {
    return sprite.animation!.getSprite();
  }

  void update(double dt) {
    double velocity = gameRef.gameState.getVelocity();
    sprite.position = sprite.position - Vector2(velocity * dt, 0);
  }

  // Get the rightmost pixel position of this sprite.
  double getRightEnd() {
    return sprite.position.x + sprite.width;
  }

  void remove() {
    sprite.remove();
  }

  // See where this object intersects another object if at all.
  String intersect(Rect other) {
    final collision = sprite.toRect().intersect(other);
    if (!collision.isEmpty) {
      double yDistance = other.top - sprite.toRect().top;
      double xDistance = other.left - sprite.toRect().left;
      if (yDistance.abs() > xDistance.abs()) {
        if (yDistance > 0) {
          return "bottom";
        } else {
          return "top";
        }
      } else {
        if (xDistance > 0) {
          return "right";
        } else {
          return "left";
        }
      }
    }
    return "none";
  }

  // Resize the object for chaning screen sizes.
  void resize(Vector2 newSize, double xRatio, double yRatio) {
    sprite.x *= xRatio;
    sprite.y *= yRatio;
    sprite.width *= xRatio;
    sprite.height *= yRatio;
  }
}