import 'dart:convert';

import 'package:fis_common/logger/logger.dart';
import 'package:flutter/foundation.dart';

class WhiteBoardTaskQueue {
  WhiteBoardTaskQueue({required this.handler});

  bool _working = false;
  List<String> _dataQueue = [];

  final AsyncValueSetter<Map<String, dynamic>> handler;

  bool get working => _working;

  void add(String data) {
    _dataQueue.add(data);
    _start();
  }

  void _start() async {
    if (_working) return;

    _working = true;
    while (_working) {
      if (_dataQueue.isEmpty) {
        _stop(); // 空闲暂时中止循环
        break;
      }

      await _handleNext();
    }
  }

  void _stop() {
    _working = false;
  }

  Future<void> _handleNext() async {
    final data = _dataQueue.removeAt(0);
    try {
      final map = jsonDecode(data);
      await handler(map);
    } catch (e) {
      logger.e("[WhiteBoardTaskQueue] handle error. data: $data", e);
    }
  }
}