import { Injectable, isDevMode } from '@angular/core';
import { ActivatedRouteSnapshot, CanActivate, Route } from '@angular/router';

import { isOn } from 'feature-toggle-service';

@Injectable({ providedIn: 'root' })
export class NgxFeatureToggleCanActivateGuard implements CanActivate {
  isDevMode() {
    return isDevMode();
  }

  canActivate(route: ActivatedRouteSnapshot | Route): boolean {
    const DEV_MODE = this.isDevMode();
    if (!route || !route.data || !route.data.featureToggle) {
      if (DEV_MODE) {
        console.error(
          '`NgxFeatureToggleCanActivateGuard` need to receive `featureToggle` as data in your route configuration.'
        );
      }
      return false;
    }

    const isFeatureToggleOn = (toggle) =>
      toggle[0] === '!' ? !isOn(toggle.replace('!', '')) : isOn(toggle);

    if (typeof route.data.featureToggle === 'string') {
      return isFeatureToggleOn(route.data.featureToggle as string);
    } else if (Array.isArray(route.data.featureToggle)) {
      return (route.data.featureToggle as string[]).every(isFeatureToggleOn);
    }

    if (DEV_MODE) {
      console.error(
        '`NgxFeatureToggleCanActivateGuard` need to receive `featureToggle` as data as an array or string in your route configuration.'
      );
    }
    return false;
  }
}
