import 'package:flutter/material.dart';

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

import 'package:fluffychat/config/app_config.dart';
import 'package:fluffychat/config/themes.dart';
import 'package:fluffychat/utils/platform_infos.dart';
import 'package:fluffychat/widgets/layouts/login_scaffold.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(
      appBar: VRouter.of(context).path == '/home'
          ? null
          : AppBar(title: Text(L10n.of(context)!.addAccount)),
      body: Column(
        children: [
          Expanded(
            child: ListView(
              children: [
                AnimatedContainer(
                  duration: const Duration(milliseconds: 300),
                  constraints: BoxConstraints(
                      maxHeight: controller.displayServerList ? 0 : 256),
                  alignment: Alignment.center,
                  child: Image.asset('assets/info-logo.png'),
                ),
                Padding(
                  padding: const EdgeInsets.all(16.0),
                  child: TextField(
                    focusNode: controller.homeserverFocusNode,
                    controller: controller.homeserverController,
                    onChanged: controller.onChanged,
                    style: FluffyThemes.loginTextFieldStyle,
                    decoration: FluffyThemes.loginTextFieldDecoration(
                      labelText: L10n.of(context)!.homeserver,
                      hintText: L10n.of(context)!.enterYourHomeserver,
                      suffixIcon: const Icon(
                        Icons.search,
                        color: Colors.black,
                      ),
                      errorText: controller.error,
                    ),
                    readOnly: !AppConfig.allowOtherHomeservers,
                    onSubmitted: (_) => controller.checkHomeserverAction(),
                    autocorrect: false,
                  ),
                ),
                if (controller.displayServerList)
                  Padding(
                    padding: const EdgeInsets.all(16.0),
                    child: Material(
                      borderRadius:
                          BorderRadius.circular(AppConfig.borderRadius),
                      color: Colors.white.withAlpha(200),
                      clipBehavior: Clip.hardEdge,
                      child: benchmarkResults == null
                          ? const Center(
                              child: Padding(
                              padding: EdgeInsets.all(16.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(),
                            ),
                    ),
                  ),
                Wrap(
                  alignment: WrapAlignment.center,
                  children: [
                    TextButton(
                      onPressed: () => launch(AppConfig.privacyUrl),
                      child: Text(
                        L10n.of(context)!.privacy,
                        style: const TextStyle(
                          decoration: TextDecoration.underline,
                          color: Colors.white,
                        ),
                      ),
                    ),
                    TextButton(
                      onPressed: () => PlatformInfos.showDialog(context),
                      child: Text(
                        L10n.of(context)!.about,
                        style: const TextStyle(
                          decoration: TextDecoration.underline,
                          color: Colors.white,
                        ),
                      ),
                    ),
                  ],
                ),
              ],
            ),
          ),
          Padding(
            padding: const EdgeInsets.all(16),
            child: Hero(
              tag: 'loginButton',
              child: ElevatedButton(
                onPressed: controller.isLoading
                    ? () {}
                    : controller.checkHomeserverAction,
                style: ElevatedButton.styleFrom(
                  primary: Colors.white.withAlpha(200),
                  onPrimary: Colors.black,
                  shadowColor: Colors.white,
                ),
                child: controller.isLoading
                    ? const LinearProgressIndicator()
                    : Text(L10n.of(context)!.connect),
              ),
            ),
          ),
        ],
      ),
    );
  }
}