import 'package:flutter/material.dart';

import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:vrouter/vrouter.dart';

import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/pages/chat_list/chat_list.dart';
import 'package:fluffychat/pages/chat_list/client_chooser_button.dart';
import 'package:fluffychat/widgets/matrix.dart';

class ChatListHeader extends StatelessWidget implements PreferredSizeWidget {
  final ChatListController controller;

  const ChatListHeader({Key? key, required this.controller}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    final selectMode = controller.selectMode;

    return AppBar(
      automaticallyImplyLeading: false,
      leading: selectMode == SelectMode.normal
          ? null
          : IconButton(
              tooltip: L10n.of(context)!.cancel,
              icon: const Icon(Icons.close_outlined),
              onPressed: controller.cancelAction,
              color: Theme.of(context).colorScheme.primary,
            ),
      title: selectMode == SelectMode.share
          ? Text(
              L10n.of(context)!.share,
              key: const ValueKey(SelectMode.share),
            )
          : selectMode == SelectMode.select
              ? Text(
                  controller.selectedRoomIds.length.toString(),
                  key: const ValueKey(SelectMode.select),
                )
              : TextField(
                  controller: controller.searchController,
                  textInputAction: TextInputAction.search,
                  onChanged: controller.onSearchEnter,
                  decoration: InputDecoration(
                    fillColor: Theme.of(context)
                        .colorScheme
                        .secondaryContainer
                        .withAlpha(128),
                    border: UnderlineInputBorder(
                      borderSide: BorderSide.none,
                      borderRadius:
                          BorderRadius.circular(AppConfig.borderRadius),
                    ),
                    hintText: controller.activeSpacesEntry.getName(context),
                    prefixIcon: Padding(
                      padding: const EdgeInsets.only(
                        left: 8.0,
                        right: 4,
                      ),
                      child: controller.isSearchMode
                          ? IconButton(
                              tooltip: L10n.of(context)!.cancel,
                              icon: const Icon(Icons.close_outlined),
                              onPressed: controller.cancelSearch,
                              color: Theme.of(context).colorScheme.onBackground,
                            )
                          : IconButton(
                              onPressed: Scaffold.of(context).openDrawer,
                              icon: Icon(
                                Icons.menu,
                                color:
                                    Theme.of(context).colorScheme.onBackground,
                              ),
                            ),
                    ),
                    suffixIcon: Row(
                      mainAxisSize: MainAxisSize.min,
                      children: controller.isSearchMode
                          ? [
                              if (controller.isSearching)
                                const CircularProgressIndicator.adaptive(
                                  strokeWidth: 2,
                                ),
                              TextButton(
                                onPressed: controller.setServer,
                                style: TextButton.styleFrom(
                                  textStyle: const TextStyle(fontSize: 12),
                                ),
                                child: Text(
                                  controller.searchServer ??
                                      Matrix.of(context)
                                          .client
                                          .homeserver!
                                          .host,
                                  maxLines: 2,
                                ),
                              ),
                            ]
                          : [
                              IconButton(
                                icon: Icon(
                                  Icons.camera_alt_outlined,
                                  color: Theme.of(context)
                                      .colorScheme
                                      .onBackground,
                                ),
                                tooltip: L10n.of(context)!.addToStory,
                                onPressed: () =>
                                    VRouter.of(context).to('/stories/create'),
                              ),
                              ClientChooserButton(controller),
                              const SizedBox(width: 12),
                            ],
                    ),
                  ),
                ),
      actions: selectMode == SelectMode.share
          ? null
          : selectMode == SelectMode.select
              ? [
                  if (controller.spaces.isNotEmpty)
                    IconButton(
                      tooltip: L10n.of(context)!.addToSpace,
                      icon: const Icon(Icons.group_work_outlined),
                      onPressed: controller.addOrRemoveToSpace,
                    ),
                  IconButton(
                    tooltip: L10n.of(context)!.toggleUnread,
                    icon: Icon(controller.anySelectedRoomNotMarkedUnread
                        ? Icons.mark_chat_read_outlined
                        : Icons.mark_chat_unread_outlined),
                    onPressed: controller.toggleUnread,
                  ),
                  IconButton(
                    tooltip: L10n.of(context)!.toggleFavorite,
                    icon: Icon(controller.anySelectedRoomNotFavorite
                        ? Icons.push_pin_outlined
                        : Icons.push_pin),
                    onPressed: controller.toggleFavouriteRoom,
                  ),
                  IconButton(
                    icon: Icon(controller.anySelectedRoomNotMuted
                        ? Icons.notifications_off_outlined
                        : Icons.notifications_outlined),
                    tooltip: L10n.of(context)!.toggleMuted,
                    onPressed: controller.toggleMuted,
                  ),
                  IconButton(
                    icon: const Icon(Icons.delete_outlined),
                    tooltip: L10n.of(context)!.archive,
                    onPressed: controller.archiveAction,
                  ),
                ]
              : null,
    );
  }

  @override
  Size get preferredSize => const Size.fromHeight(56);
}