import 'package:diplomaticquarterapp/config/shared_pref_kay.dart';
import 'package:diplomaticquarterapp/core/service/AuthenticatedUserObject.dart';
import 'package:diplomaticquarterapp/core/viewModels/base_view_model.dart';
import 'package:diplomaticquarterapp/core/viewModels/project_view_model.dart';
import 'package:diplomaticquarterapp/uitl/app_shared_preferences.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

import '../../locator.dart';

AppSharedPreferences sharedPref = AppSharedPreferences();

class BaseView<T extends BaseViewModel> extends StatefulWidget {
  final Widget Function(BuildContext context, T model, Widget child) builder;
  final Function(T) onModelReady;
  final bool allowAny;

  BaseView({
    this.builder,
    this.onModelReady,
    this.allowAny = false,
  });

  @override
  _BaseViewState<T> createState() => _BaseViewState<T>();
}

class _BaseViewState<T extends BaseViewModel> extends State<BaseView<T>> {
  T model = locator<T>();
  AuthenticatedUserObject authenticatedUserObject =
      locator<AuthenticatedUserObject>();
  bool isLogin = false;

  @override
  void initState() {
    if (widget.allowAny && widget.onModelReady != null) {
      widget.onModelReady(model);
    } else if (widget.onModelReady != null &&
        Provider.of<ProjectViewModel>(context, listen: false).isLogin) {
      widget.onModelReady(model);
    }
    super.initState();
  }

  getUser() async {
    var userData = await sharedPref.getObject(USER_PROFILE);
    this.isLogin = userData != null;
  }

  @override
  Widget build(BuildContext context) {
    return ChangeNotifierProvider<T>(
      create: (BuildContext context) => model,
      child: Consumer<T>(builder: widget.builder),
    );
  }

  @override
  void dispose() {
    if (model != null) {
      model = null;
    }
    super.dispose();
  }
}
