import 'package:comunic/helpers/conversations_helper.dart';
import 'package:comunic/models/conversation.dart';
import 'package:comunic/ui/routes/main_route/main_route.dart';
import 'package:comunic/ui/routes/update_conversation_route.dart';
import 'package:comunic/ui/screens/conversation_screen.dart';
import 'package:comunic/ui/widgets/comunic_back_button_widget.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:comunic/utils/ui_utils.dart';
import 'package:flutter/material.dart';

/// Single conversation route
///
/// @author Pierre HUBERT

class ConversationRoute extends StatefulWidget {
  final int conversationID;

  const ConversationRoute({
    Key key,
    @required this.conversationID,
  })  : assert(conversationID != null),
        super(key: key);

  @override
  State<StatefulWidget> createState() => _ConversationRouteState();
}

class _ConversationRouteState extends State<ConversationRoute> {
  final ConversationsHelper _conversationsHelper = ConversationsHelper();
  Conversation _conversation;
  String _conversationName;
  bool _error = false;

  setError(bool err) => setState(() => _error = err);

  @override
  void didChangeDependencies() {
    super.didChangeDependencies();
    _loadConversation();
  }

  Future<void> _loadConversation() async {
    setError(false);

    _conversation = await _conversationsHelper.getSingle(widget.conversationID,
        force: true);

    if (_conversation == null) return setError(true);

    final conversationName =
        await ConversationsHelper.getConversationNameAsync(_conversation);

    if (!this.mounted) return null;

    if (conversationName == null) return setError(true);

    setState(() {
      _conversationName = conversationName;
    });
  }

  void _openSettings() {
    MainController.of(context).push(
        UpdateConversationRoute(
          conversationID: widget.conversationID,
        ),
        hideNavBar: true);
  }

  Widget _buildRouteBody() {
    //Handle errors
    if (_error != null && _error)
      return buildErrorCard(
        tr("Could not get conversation information!"),
        actions: <Widget>[
          FlatButton(
            onPressed: _loadConversation,
            child: Text(
              tr("Try again").toUpperCase(),
              style: TextStyle(
                color: Colors.white,
              ),
            ),
          ),
        ],
      );

    if (_conversationName == null || _conversation == null)
      return buildCenteredProgressBar();

    return ConversationScreen(
      conversationID: widget.conversationID,
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        leading: isTablet(context) ? null : ComunicBackButton(),
        title: Text(
          _conversationName == null ? tr("Loading") : _conversationName,
        ),
        actions: <Widget>[
          // Start call (if possible)
          _conversation == null ||
                  _conversation.callCapabilities == CallCapabilities.NONE
              ? Container()
              : IconButton(
                  icon: Icon(Icons.phone),
                  onPressed: () => MainController.of(context)
                      .startCall(widget.conversationID),
                ),

          // Edit conversation settings
          IconButton(
            icon: Icon(Icons.settings),
            onPressed: _openSettings,
          )
        ],
      ),
      body: _buildRouteBody(),
    );
  }
}