package funkin.ui.story;

import flixel.FlxSprite;
import flixel.graphics.frames.FlxAtlasFrames;
import flixel.group.FlxSpriteGroup;
import flixel.util.FlxColor;
import funkin.util.MathUtil;

class LevelTitle extends FlxSpriteGroup
{
  static final LOCK_PAD:Int = 4;

  public final level:Level;

  public var targetY:Float;
  public var isFlashing:Bool = false;

  var title:FlxSprite;
  var lock:FlxSprite;

  var flashingInt:Int = 0;

  public function new(x:Int, y:Int, level:Level)
  {
    super(x, y);

    this.level = level;

    if (this.level == null) throw "Level cannot be null!";

    buildLevelTitle();
    buildLevelLock();
  }

  override function get_width():Float
  {
    if (length == 0) return 0;

    if (lock.visible)
    {
      return title.width + lock.width + LOCK_PAD;
    }
    else
    {
      return title.width;
    }
  }

  // if it runs at 60fps, fake framerate will be 6
  // if it runs at 144 fps, fake framerate will be like 14, and will update the graphic every 0.016666 * 3 seconds still???
  // so it runs basically every so many seconds, not dependant on framerate??
  // I'm still learning how math works thanks whoever is reading this lol
  var fakeFramerate:Int = Math.round((1 / FlxG.elapsed) / 10);

  public override function update(elapsed:Float):Void
  {
    this.y = MathUtil.coolLerp(y, targetY, 0.17);

    if (isFlashing) flashingInt += 1;
    if (flashingInt % fakeFramerate >= Math.floor(fakeFramerate / 2)) title.color = 0xFF33ffff;
    else
      title.color = FlxColor.WHITE;
  }

  public function showLock():Void
  {
    lock.visible = true;
    this.x -= (lock.width + LOCK_PAD) / 2;
  }

  public function hideLock():Void
  {
    lock.visible = false;
    this.x += (lock.width + LOCK_PAD) / 2;
  }

  function buildLevelTitle():Void
  {
    title = level.buildTitleGraphic();
    add(title);
  }

  function buildLevelLock():Void
  {
    lock = new FlxSprite(0, 0).loadGraphic(Paths.image('storymenu/ui/lock'));
    lock.x = title.x + title.width + LOCK_PAD;
    lock.visible = false;
    add(lock);
  }
}