import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:info_tren/models/ui_design.dart';
import 'package:info_tren/utils/default_ui_design.dart';

class FutureDisplay<T> extends StatelessWidget {
  final UiDesign? uiDesign;
  final Future<T> future;
  final Widget Function<T>(BuildContext context, T data) builder;
  final Widget Function(BuildContext context, Object error, StackTrace? st)? errorBuilder;

  FutureDisplay({Key? key, required this.future, required this.builder, this.errorBuilder, this.uiDesign}): super(key: key);

  @override
  Widget build(BuildContext context) {
    final uiDesign = this.uiDesign ?? defaultUiDesign;
    return FutureBuilder(
      future: future,
      builder: (context, snapshot) {
        if (snapshot.hasData) return builder(context, snapshot.data);
        if (snapshot.hasError) return (errorBuilder != null ? errorBuilder!(context, snapshot.error!, snapshot.stackTrace) : throw snapshot.error!);
        if (snapshot.connectionState == ConnectionState.done) return Container();

        Widget loadingWidget;
        switch (uiDesign) {
          case UiDesign.MATERIAL:
            loadingWidget = CircularProgressIndicator();
            break;
          case UiDesign.CUPERTINO:
            loadingWidget = CupertinoActivityIndicator();
            break;
          default:
            throw UnmatchedUiDesignException(uiDesign);
        }

        return Center(
          child: loadingWidget,
        );
      },
    );
  }
}