import 'package:flutter/material.dart';

import 'package:flutter_gen/gen_l10n/l10n.dart';
import 'package:url_launcher/url_launcher_string.dart';

import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/widgets/layouts/login_scaffold.dart';
import '../../config/themes.dart';
import 'homeserver_app_bar.dart';
import 'homeserver_picker.dart';

class HomeserverPickerView extends StatelessWidget {
  final HomeserverPickerController controller;

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

  @override
  Widget build(BuildContext context) {
    final benchmarkResults = controller.benchmarkResults;
    return LoginScaffold(
      body: SafeArea(
        child: Column(
          children: [
            Padding(
              padding: const EdgeInsets.all(12.0),
              child: HomeserverAppBar(controller: controller),
            ),
            // display a prominent banner to import session for TOR browser
            // users. This feature is just some UX sugar as TOR users are
            // usually forced to logout as TOR browser is non-persistent
            AnimatedContainer(
              height: controller.isTorBrowser ? 64 : 0,
              duration: FluffyThemes.animationDuration,
              curve: FluffyThemes.animationCurve,
              clipBehavior: Clip.hardEdge,
              decoration: const BoxDecoration(),
              child: Material(
                clipBehavior: Clip.hardEdge,
                borderRadius:
                    const BorderRadius.vertical(bottom: Radius.circular(8)),
                color: Theme.of(context).colorScheme.surface,
                child: ListTile(
                  leading: const Icon(Icons.vpn_key),
                  title: Text(L10n.of(context)!.hydrateTor),
                  subtitle: Text(L10n.of(context)!.hydrateTorLong),
                  trailing: const Icon(Icons.chevron_right_outlined),
                  onTap: controller.restoreBackup,
                ),
              ),
            ),
            Expanded(
              child: controller.displayServerList
                  ? ListView(
                      children: [
                        if (controller.displayServerList)
                          Padding(
                            padding: const EdgeInsets.all(12.0),
                            child: Material(
                              borderRadius:
                                  BorderRadius.circular(AppConfig.borderRadius),
                              color: Theme.of(context)
                                  .colorScheme
                                  .onInverseSurface,
                              clipBehavior: Clip.hardEdge,
                              child: benchmarkResults == null
                                  ? const Center(
                                      child: Padding(
                                        padding: EdgeInsets.all(12.0),
                                        child: CircularProgressIndicator
                                            .adaptive(),
                                      ),
                                    )
                                  : Column(
                                      children: controller.filteredHomeservers
                                          .map(
                                            (server) => ListTile(
                                              trailing: IconButton(
                                                icon: const Icon(
                                                  Icons.info_outlined,
                                                  color: Colors.black,
                                                ),
                                                onPressed: () => controller
                                                    .showServerInfo(server),
                                              ),
                                              onTap: () => controller.setServer(
                                                server.homeserver.baseUrl.host,
                                              ),
                                              title: Text(
                                                server.homeserver.baseUrl.host,
                                                style: const TextStyle(
                                                  color: Colors.black,
                                                ),
                                              ),
                                              subtitle: Text(
                                                server.homeserver.description ??
                                                    '',
                                                style: TextStyle(
                                                  color: Colors.grey.shade700,
                                                ),
                                              ),
                                            ),
                                          )
                                          .toList(),
                                    ),
                            ),
                          ),
                      ],
                    )
                  : Container(
                      alignment: Alignment.topCenter,
                      child: Image.asset(
                        'assets/banner_transparent.png',
                        filterQuality: FilterQuality.medium,
                      ),
                    ),
            ),
            SafeArea(
              child: Container(
                padding: const EdgeInsets.all(12),
                width: double.infinity,
                child: Column(
                  mainAxisSize: MainAxisSize.min,
                  crossAxisAlignment: CrossAxisAlignment.stretch,
                  children: [
                    TextButton(
                      onPressed: () => launchUrlString(AppConfig.privacyUrl),
                      child: Text(L10n.of(context)!.privacy),
                    ),
                    TextButton(
                      onPressed: controller.restoreBackup,
                      child: Text(L10n.of(context)!.hydrate),
                    ),
                    Hero(
                      tag: 'loginButton',
                      child: ElevatedButton.icon(
                        style: ElevatedButton.styleFrom(
                          backgroundColor:
                              Theme.of(context).colorScheme.primary,
                          foregroundColor:
                              Theme.of(context).colorScheme.onPrimary,
                        ),
                        onPressed: controller.isLoading
                            ? null
                            : controller.checkHomeserverAction,
                        icon: const Icon(Icons.start_outlined),
                        label: controller.isLoading
                            ? const LinearProgressIndicator()
                            : Text(L10n.of(context)!.letsStart),
                      ),
                    ),
                  ],
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }
}