import 'dart:developer' as dev;
import 'dart:io';

import 'package:dart_frog/dart_frog.dart';
import 'package:logging/logging.dart';

bool _listening = false;

Future<HttpServer> run(Handler handler, InternetAddress ip, int port) async {
  final isDevelopment = (await dev.Service.getInfo()).serverUri != null;
  if (!_listening) {
    final logLevel = Platform.environment['LOG_LEVEL'] ?? (isDevelopment ? 'FINEST' : 'INFO');
    Logger.root.level =
        Level.LEVELS.firstWhere((l) => l.name == logLevel, orElse: () => Level.INFO); // defaults to Level.INFO
    Logger.root.onRecord.listen((record) {
      stdout.writeln('[${record.level.name}]:[${record.loggerName}] ${record.time}: ${record.message}');
      if (record.level.value >= Level.WARNING.value) {
        stdout.writeln(
          '[${record.level.name}]:[${record.loggerName}] ${record.error ?? "No error provided"}\n${record.stackTrace ?? "No trace provided"}',
        );
      }
    });
    _listening = true;
  }

  return serve(handler, ip, port);
}