import { LogConfiguration } from '../src/logging/LogConfiguration';
import { Logger } from '../src/logging/Logger';
import { LogLevel } from '../src/logging/LogSettings';
import { RuleCondition } from '../src/logging/config/LogRule';
import {LogManager} from "../src";

describe('LogConfiguration', () => {
  beforeEach(()=>{
    LogManager.getInstance().clearAll();
  });

  test('should detect log level based on startsWith rule with string value', () => {
    const config = new LogConfiguration();
    config.addRule(RuleCondition.startsWith, 'app.', LogLevel.DEBUG);
    
    const logger = new Logger({ source: 'app.component' });
    const level = config.detectLogLevel(logger);
    
    expect(level).toBe(LogLevel.DEBUG);
  });
  
  test('should detect log level based on contains rule with string value', () => {
    const config = new LogConfiguration();
    config.addRule(RuleCondition.contains, 'component', LogLevel.WARN);
    
    const logger = new Logger({ source: 'app.component.button' });
    const level = config.detectLogLevel(logger);
    
    expect(level).toBe(LogLevel.WARN);
  });
  
  test('should detect log level based on regex rule with RegExp value', () => {
    const config = new LogConfiguration();
    config.addRule(RuleCondition.regex, /^api\.v\d+\..+$/, LogLevel.ERROR);
    
    const logger = new Logger({ source: 'api.v1.users' });
    const level = config.detectLogLevel(logger);
    
    expect(level).toBe(LogLevel.ERROR);
  });
  
  test('should detect log level based on regex rule with string value', () => {
    const config = new LogConfiguration();
    config.addRule(RuleCondition.regex, '^service\\..*Service$', LogLevel.ALL);
    
    const logger = new Logger({ source: 'service.UserService' });
    const level = config.detectLogLevel(logger);
    
    expect(level).toBe(LogLevel.ALL);
  });
  
  test('should return default log level when no rules match', () => {
    const config = new LogConfiguration();
    config.addRule(RuleCondition.startsWith, 'app.', LogLevel.DEBUG);
    
    const logger = new Logger({ source: 'service.UserService' });
    const level = config.detectLogLevel(logger);
    
    expect(level).toBe(LogLevel.INFO); // Default level
  });
  
  test('should apply rules in reverse order', () => {
    const config = new LogConfiguration();
    config.addRule(RuleCondition.startsWith, 'app.', LogLevel.DEBUG);
    config.addRule(RuleCondition.startsWith, 'app.component', LogLevel.WARN);
    
    const logger = new Logger({ source: 'app.component.button' });
    const level = config.detectLogLevel(logger);
    
    // Should match the second rule (WARN) because rules are applied in reverse order
    expect(level).toBe(LogLevel.WARN);
  });
});