import 'package:comunic/helpers/conversations_helper.dart';
import 'package:comunic/lists/groups_list.dart';
import 'package:comunic/lists/users_list.dart';
import 'package:comunic/models/conversation.dart';
import 'package:comunic/ui/routes/main_route/main_route.dart';
import 'package:comunic/ui/widgets/conversation_image_widget.dart';
import 'package:comunic/ui/widgets/custom_list_tile.dart';
import 'package:comunic/utils/date_utils.dart';
import 'package:comunic/utils/intl_utils.dart';
import 'package:flutter/material.dart';

/// Single conversation tile
///
/// @author Pierre HUBERT

typedef OpenConversationCallback = void Function(Conversation);
typedef RequestLeaveConversationCallback = void Function(Conversation);
typedef RequestUpdateConversationCallback = void Function(Conversation);

enum _PopupMenuChoices { UPDATE, LEAVE }

class ConversationTile extends StatelessWidget {
  final Conversation conversation;
  final UsersList usersList;
  final GroupsList groupsList;
  final OpenConversationCallback onOpen;
  final RequestUpdateConversationCallback onRequestUpdate;
  final RequestLeaveConversationCallback onRequestLeave;

  const ConversationTile({
    Key key,
    @required this.conversation,
    @required this.usersList,
    @required this.groupsList,
    @required this.onOpen,
    @required this.onRequestUpdate,
    @required this.onRequestLeave,
  })  : assert(conversation != null),
        assert(usersList != null),
        assert(onOpen != null),
        assert(onRequestUpdate != null),
        assert(onRequestLeave != null),
        super(key: key);

  _buildSubInformation(IconData icon, String content) {
    return Row(
      children: <Widget>[
        Icon(
          icon,
          size: 15.0,
          color: Colors.grey,
        ),
        Text(" " + content),
      ],
    );
  }

  @override
  Widget build(BuildContext context) => Column(
        children: [_buildMainTile(context), _buildCallTile(context)],
      );

  Widget _buildMainTile(BuildContext context) => CustomListTile(
        onTap: () => onOpen(conversation),
        // Conversation name
        title: Text(
          ConversationsHelper.getConversationName(
            conversation,
            usersList,
          ),
          style: TextStyle(
            fontWeight: conversation.sawLastMessage ? null : FontWeight.bold,
          ),
        ),

        // Tile color
        tileColor: conversation.sawLastMessage
            ? null
            : (conversation.color ?? Colors.blue).withOpacity(0.2),

        // Leading icon
        leading: ConversationImageWidget(
            conversation: conversation, users: usersList),

        // Conversation information
        isThreeLine: true,
        subtitle: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: <Widget>[
            _buildSubInformation(Icons.access_time,
                diffTimeFromNowToStr(conversation.lastActivity)),
            conversation.isGroupConversation
                ? _buildSubInformation(
                    Icons.link,
                    tr("Group: %group_name%", args: {
                      "group_name":
                          groupsList.getGroup(conversation.groupID).name
                    }))
                : _buildSubInformation(
                    Icons.group,
                    conversation.members.length == 1
                        ? tr("1 member")
                        : tr(
                            "%num% members",
                            args: {
                              "num": conversation.members.length.toString(),
                            },
                          ),
                  ),
          ],
        ),

        onLongPressOpenMenu: (position) {
          showMenu<_PopupMenuChoices>(
              context: context,
              position: position,
              items: [
                PopupMenuItem(
                  child: Text(tr("Update")),
                  value: _PopupMenuChoices.UPDATE,
                ),
                PopupMenuItem(
                  child: Text(tr("Leave")),
                  value: _PopupMenuChoices.LEAVE,
                )
              ]).then(_conversationMenuCallback);
        },
      );

  /// Build call tile, in case of ongoing call
  Widget _buildCallTile(BuildContext context) {
    if (!conversation.isHavingCall) return Container();

    return Padding(
      padding: EdgeInsets.only(bottom: 20),
      child: ListTile(
        onTap: () => MainController.of(context).startCall(conversation.id),
        dense: true,
        title: Text(tr("Ongoing call")),
        leading: Icon(Icons.call),
        tileColor: Colors.yellow.withOpacity(0.2),
      ),
    );
  }

  /// Method called each time an option of the menu is selected
  void _conversationMenuCallback(_PopupMenuChoices c) {
    switch (c) {
      case _PopupMenuChoices.UPDATE:
        onRequestUpdate(conversation);
        break;

      case _PopupMenuChoices.LEAVE:
        onRequestLeave(conversation);
        break;
    }
  }
}