import 'package:fcs/domain/constants.dart';
import 'package:fcs/domain/entities/user.dart';
import 'package:fcs/helpers/theme.dart';
import 'package:fcs/pages/customer/model/customer_model.dart';
import 'package:fcs/pages/main/util.dart';
import 'package:fcs/pages/widgets/display_text.dart';
import 'package:fcs/pages/widgets/fcs_id_icon.dart';
import 'package:fcs/pages/widgets/local_button.dart';
import 'package:fcs/pages/widgets/progress.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:provider/provider.dart';

typedef void FindCallBack();

class CustomerEditor extends StatefulWidget {
  final User customer;
  const CustomerEditor({this.customer});
  @override
  _CustomerEditorState createState() => _CustomerEditorState();
}

class _CustomerEditorState extends State<CustomerEditor> {
  bool _isLoading = false;

  @override
  void initState() {
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    var phoneNumberBox = Row(
      children: <Widget>[
        Expanded(
            child: DisplayText(
          text: widget.customer.phoneNumber,
          labelTextKey: "customer.phone",
          iconData: Icons.phone,
        )),
        IconButton(
            icon: Icon(Icons.open_in_new, color: primaryColor),
            onPressed: () => call(context, widget.customer.phoneNumber)),
      ],
    );

    final enabled = widget.customer.status != user_disabled_status;
    final enableBox = LocalButton(
      textKey: enabled ? "customer.disable.btn" : "customer.enable.btn",
      iconData: enabled ? Icons.lock : Icons.lock_open,
      color: enabled ? primaryColor : Colors.grey,
      callBack: () => _enable(!enabled),
    );
    return LocalProgress(
        inAsyncCall: _isLoading,
        child: SafeArea(
          child: Scaffold(
            appBar: AppBar(
              backgroundColor: Colors.white,
              shadowColor: Colors.transparent,
              centerTitle: true,
              leading: new IconButton(
                icon: new Icon(
                  CupertinoIcons.back,
                  color: primaryColor,
                  size: 30,
                ),
                onPressed: () => Navigator.of(context).pop(),
              ),
              title: Text(
                widget.customer.name,
                style: TextStyle(
                  fontSize: 20,
                  color: primaryColor,
                ),
              ),
            ),
            body: Padding(
              padding: const EdgeInsets.all(8.0),
              child: ListView(
                children: <Widget>[
                  phoneNumberBox,
                  DisplayText(
                    text: widget.customer.fcsID,
                    labelTextKey: "customer.fcs.id",
                    icon: FcsIDIcon(),
                  ),
                  DisplayText(
                    text: widget.customer.status,
                    labelTextKey: "customer.status",
                    iconData: Icons.add_alarm,
                  ),
                  SizedBox(
                    height: 20,
                  ),
                  widget.customer.requested
                      ? fcsButton(
                          context,
                          getLocalString(
                              context, "customer.invitation.request.confirm"),
                          callack: _add)
                      : Container(),
                  widget.customer.joined || widget.customer.disabled
                      ? enableBox
                      : Container()
                ],
              ),
            ),
          ),
        ));
  }

  _add() async {
    showConfirmDialog(context, "customer.invitation.request.confirm", () async {
      setState(() {
        _isLoading = true;
      });
      if (widget.customer == null) return;
      CustomerModel customerModel =
          Provider.of<CustomerModel>(context, listen: false);
      try {
        await customerModel.acceptRequest(widget.customer.id);
        Navigator.pop(context);
      } catch (e) {
        showMsgDialog(context, "Error", e.toString());
      } finally {
        setState(() {
          _isLoading = false;
        });
      }
    });
  }

  _enable(bool enabled) async {
    setState(() {
      _isLoading = true;
    });
    if (widget.customer == null) return;
    CustomerModel customerModel =
        Provider.of<CustomerModel>(context, listen: false);
    try {
      await customerModel.enableUser(widget.customer, enabled);
      Navigator.pop(context);
    } catch (e) {
      showMsgDialog(context, "Error", e.toString());
    } finally {
      setState(() {
        _isLoading = false;
      });
    }
  }
}
