import 'dart:async';
import 'dart:developer';

import 'package:flutter/material.dart';
import 'package:lightmeter/data/models/feature.dart';
import 'package:lightmeter/data/remote_config_service.dart';

class RemoteConfigProvider extends StatefulWidget {
  final IRemoteConfigService remoteConfigService;
  final Widget child;

  const RemoteConfigProvider({
    required this.remoteConfigService,
    required this.child,
    super.key,
  });

  @override
  State<RemoteConfigProvider> createState() => RemoteConfigProviderState();
}

class RemoteConfigProviderState extends State<RemoteConfigProvider> {
  late final Map<Feature, dynamic> _config = widget.remoteConfigService.getAll();
  late final StreamSubscription<Set<Feature>> _updatesSubscription;

  @override
  void initState() {
    super.initState();
    widget.remoteConfigService.fetchConfig();
    _updatesSubscription = widget.remoteConfigService.onConfigUpdated().listen(
          _updateFeatures,
          onError: (e) => log(e.toString()),
        );
  }

  @override
  void dispose() {
    _updatesSubscription.cancel();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return RemoteConfig(
      config: _config,
      child: widget.child,
    );
  }

  void _updateFeatures(Set<Feature> updatedFeatures) {
    for (final feature in updatedFeatures) {
      _config[feature] = widget.remoteConfigService.getValue(feature);
    }
    setState(() {});
  }
}

class RemoteConfig extends InheritedModel<Feature> {
  final Map<Feature, dynamic> _config;

  const RemoteConfig({
    super.key,
    required Map<Feature, dynamic> config,
    required super.child,
  }) : _config = config;

  static bool isEnabled(BuildContext context, Feature feature) {
    return InheritedModel.inheritFrom<RemoteConfig>(context)!._config[feature] as bool;
  }

  @override
  bool updateShouldNotify(RemoteConfig oldWidget) => true;

  @override
  bool updateShouldNotifyDependent(RemoteConfig oldWidget, Set<Feature> features) {
    for (final feature in features) {
      if (oldWidget._config[feature] != _config[feature]) {
        return true;
      }
    }
    return false;
  }
}