evaluate method

CoffeeDecision evaluate({
  1. bool hasOverride = false,
})

Implementation

CoffeeDecision evaluate({bool hasOverride = false}) {
  if (!config.enabled) {
    return CoffeeDecision(
        allowed: true,
        message: "",
        situation: CoffeeSituation.allowed);
  }

  if (hasOverride && config.allowOverride) {
     return CoffeeDecision(
        allowed: true,
        message: CoffeeMessages.getMessage(
            CoffeeSituation.overrideActivated,
            config.roastLevel,
            customMessages: config.customMessages?[CoffeeSituation.overrideActivated],
        ),
        situation: CoffeeSituation.overrideActivated);
  }

  final now = _time.nowLocal();
  final hour = _time.hour(now);

  // Check min hour (Morning gate)
  if (hour < config.minHour) {
    final msg = CoffeeMessages.getMessage(
      CoffeeSituation.beforeMinHour,
      config.roastLevel,
      timeString: _formatTime(now),
      customMessages: config.customMessages?[CoffeeSituation.beforeMinHour],
    );

    final shouldBlock = config.mode == CoffeeMode.blockApp;

    return CoffeeDecision(
      allowed: !shouldBlock, // If warnOnly/overlayOnly, we allow proceed but return warning state
      isWarning: !shouldBlock,
      message: msg,
      situation: CoffeeSituation.beforeMinHour,
    );
  }

  // Check max hour (Night gate)
  if (config.maxHour != null && hour >= config.maxHour!) {
     final msg = CoffeeMessages.getMessage(
      CoffeeSituation.afterMaxHour,
      config.roastLevel,
      timeString: _formatTime(now),
      customMessages: config.customMessages?[CoffeeSituation.afterMaxHour],
    );

     // Usually late night is just a warning, but if they want to block...
     // The requirements said "warn only" for max hour potentially, but let's follow the mode if strict.
     // However, typical usage is: minHour = block, maxHour = warn.
     // But let's respect the mode. If mode is blockApp, we block.

     final shouldBlock = config.mode == CoffeeMode.blockApp;

     return CoffeeDecision(
      allowed: !shouldBlock,
      isWarning: !shouldBlock,
      message: msg,
      situation: CoffeeSituation.afterMaxHour,
    );
  }

  // Allowed
  return CoffeeDecision(
      allowed: true,
      message: CoffeeMessages.getMessage(
          CoffeeSituation.allowed,
          config.roastLevel,
          customMessages: config.customMessages?[CoffeeSituation.allowed],
      ),
      situation: CoffeeSituation.allowed
  );
}