Scripts/Managers/IdleManager.cs
using System;
using Milaine.Interfaces;
using Milaine.Room;

namespace Milaine.Managers;

public sealed class IdleManager : Component, IManager {
  public const int DEFAULT_POINT = 1;

  [Property, Title("DayNightManager")]
  [Feature("Managers")]
  public DayNightManager DayNightManagerInstance { get; set; }
  [Property]
  [Feature("General")]
  public bool IsDayEnded { get; set; } = false;

  [Property, Group("ClickableButton")]
  [Feature("General")]
  public ClickableButton ClickableButtonInstance { get; set; }

  [Property, Group("Goals")]
  [Feature("Milaine")]
  public int Goal { get; set; } = 1_000_000;

  private int dollars = 0;
  private int point = DEFAULT_POINT;

  private float acc = 0f;
  private bool isActivedPasiveDollar = false;
  private int pasiveDollarsAmount = 0;
  private int dollarsSpent = 0;

  public Action<int, int> OnChange { get; set; }
  public Action OnDeposit { get; set; }

  public int Dollars {
    get => dollars;
    set {
      dollars = value;
      OnChange?.Invoke(dollars, point);
    }
  }

  public int DollarsSpent {
    get => dollarsSpent;
    set {
      dollarsSpent = value;
    }
  }

  public int Point {
    get => point;
  }

  protected override void OnAwake() {
    DayNightManagerInstance.OnStartDay += DayStartSubscription;
    DayNightManagerInstance.OnEndDay += DayNightSubscription;
    ClickableButtonInstance.OnPressed += GenerateDollar;
  }

  protected override void OnUpdate() {
    if (IsDayEnded) {
      return;
    }

    acc += Time.Delta;

    if (acc >= 1.0f) {
      if (isActivedPasiveDollar) {
        dollars += pasiveDollarsAmount;
        OnChange?.Invoke(dollars, pasiveDollarsAmount);
      }

      acc = 0;
    }
  }

  protected override void OnDestroy() {
    DayNightManagerInstance.OnStartDay -= DayStartSubscription;
    DayNightManagerInstance.OnEndDay -= DayNightSubscription;
    ClickableButtonInstance.OnPressed -= GenerateDollar;
  }

  private void DayNightSubscription() {
    IsDayEnded = true;
  }

  private void DayStartSubscription() {
    IsDayEnded = false;
    dollarsSpent = 0;
  }

  public void GenerateDollar() {
    dollars += point;
    OnChange?.Invoke(dollars, point);
  }

  public void Deposit() {
    dollars = 0;
    OnDeposit?.Invoke();
  }

  public void ImprovePasiveDollar(float amount) {
    if (!isActivedPasiveDollar) {
      isActivedPasiveDollar = true;
    }

    ImprovePasiveDollar((int)amount);
  }

  private void ImprovePasiveDollar(int amount) {
    pasiveDollarsAmount = amount;
  }

  public void ImprovePoint(float amount) {
    ImprovePoint((int)amount);
  }

  private void ImprovePoint(int amount) {
    point += amount;
  }

  public void ImproveDollars(float amount) {
    ImproveDollars((int)amount);
  }

  private void ImproveDollars(int amount) {
    dollars += amount;
  }

  public void Restart() {
    point = DEFAULT_POINT;
    isActivedPasiveDollar = false;
    dollars = 0;
    dollarsSpent = 0;
  }
}