import 'dart:async';
import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:prasule/api/wallet_manager.dart';
import 'package:prasule/main.dart';
import 'package:prasule/pw/platformbutton.dart';
import 'package:prasule/pw/platformroute.dart';
import 'package:prasule/util/show_message.dart';
import 'package:prasule/views/settings/edit_categories.dart';
import 'package:prasule/views/settings/graph_type.dart';
import 'package:prasule/views/settings/tessdata_list.dart';
import 'package:settings_ui/settings_ui.dart';
import 'package:shared_preferences/shared_preferences.dart';

/// Shows settings categories
class SettingsView extends StatefulWidget {
  /// Shows settings categories
  const SettingsView({super.key});

  @override
  State<SettingsView> createState() => _SettingsViewState();
}

class _SettingsViewState extends State<SettingsView> {
  var _useMaterialYou = true;
  final _supportsYou = MyApp.appliedYou;
  @override
  void initState() {
    super.initState();
    SharedPreferences.getInstance().then((s) {
      _useMaterialYou = s.getBool("useMaterialYou") ?? true;
      setState(() {});
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: Text(AppLocalizations.of(context).settings)),
      body: SettingsList(
        applicationType: ApplicationType.both,
        darkTheme: SettingsThemeData(
          settingsListBackground: Theme.of(context).colorScheme.surface,
          titleTextColor: Theme.of(context).colorScheme.primary,
        ),
        sections: [
          SettingsSection(
            title: Text(AppLocalizations.of(context).wallet),
            tiles: [
              SettingsTile.navigation(
                title: Text(AppLocalizations.of(context).editCategories),
                description:
                    Text(AppLocalizations.of(context).editCategoriesDesc),
                trailing: const Icon(Icons.keyboard_arrow_right),
                onPressed: (context) => Navigator.of(context).push(
                  platformRoute(
                    (c) => const EditCategoriesView(),
                  ),
                ),
              ),
            ],
          ),
          SettingsSection(
            tiles: [
              SettingsTile.navigation(
                title: Text(AppLocalizations.of(context).downloadedOcr),
                description:
                    Text(AppLocalizations.of(context).downloadedOcrDesc),
                trailing: const Icon(Icons.keyboard_arrow_right),
                onPressed: (context) => Navigator.of(context).push(
                  platformRoute(
                    (c) => const TessdataListView(),
                  ),
                ),
              ),
            ],
            title: Text(AppLocalizations.of(context).ocr),
          ),
          SettingsSection(
            title: Text(AppLocalizations.of(context).settingsAppearance),
            tiles: [
              SettingsTile.navigation(
                title: Text(AppLocalizations.of(context).graphType),
                description: Text(AppLocalizations.of(context).graphTypeDesc),
                trailing: const Icon(Icons.keyboard_arrow_right),
                onPressed: (c) => Navigator.of(c).push(
                  platformRoute(
                    (p0) => const GraphTypeSettingsView(),
                  ),
                ),
              ),
              if (Platform.isAndroid && _supportsYou)
                SettingsTile.switchTile(
                  initialValue: _useMaterialYou,
                  onToggle: (v) async {
                    final s = await SharedPreferences.getInstance();
                    await s.setBool("useMaterialYou", v);
                    _useMaterialYou = v;
                    setState(() {});
                  },
                  title: Text(AppLocalizations.of(context).enableYou),
                  description: Text(
                    AppLocalizations.of(context).enableYouDesc,
                  ),
                ),
            ],
          ),
          if (!Platform.isIOS)
            SettingsSection(
              //! TODO: Find a replacement for iOS
              title: Text(AppLocalizations.of(context).settingsData),
              tiles: [
                SettingsTile.navigation(
                  title: Text(AppLocalizations.of(context).exportSingle),
                  description:
                      Text(AppLocalizations.of(context).exportSingleDesc),
                  onPressed: (ctx) async {
                    final all = await WalletManager.listWallets();
                    if (!ctx.mounted) return;
                    final w = await showAdaptiveDialog<String>(
                      context: ctx,
                      builder: (ctx) => AlertDialog.adaptive(
                        title: Text(
                          AppLocalizations.of(context).selectExportWallet,
                        ),
                        actions: [
                          PlatformButton(
                            text: AppLocalizations.of(context).cancel,
                            onPressed: () => Navigator.of(ctx).pop(),
                          ),
                        ],
                        content: SizedBox(
                          width: MediaQuery.of(context).size.width * 0.7,
                          height: MediaQuery.of(context).size.height * 0.3,
                          child: ListView.builder(
                            itemBuilder: (con, i) => InkWell(
                              onTap: () => Navigator.of(ctx).pop(all[i].name),
                              child: Padding(
                                padding: const EdgeInsets.all(8),
                                child: Text(
                                  all[i].name,
                                  textAlign: TextAlign.center,
                                ),
                              ),
                            ),
                            shrinkWrap: true,
                            itemCount: all.length,
                          ),
                        ),
                      ),
                    );
                    if (w == null) return;
                    try {
                      await WalletManager.exportWallet(name: w);
                    } catch (e) {
                      if (!context.mounted) return;
                      unawaited(
                        showAdaptiveDialog(
                          context: context,
                          builder: (ctx) => AlertDialog.adaptive(
                            title: Text(
                              AppLocalizations.of(context).exportError,
                            ),
                            content: SingleChildScrollView(
                              child: Flexible(
                                child: Text(e.toString()),
                              ),
                            ),
                          ),
                        ),
                      );
                      logger.e(e);
                      return;
                    }
                    if (!ctx.mounted) return;
                    unawaited(
                      showMessage(
                        AppLocalizations.of(ctx).exportCompleted,
                        ctx,
                      ),
                    );
                  },
                ),
                SettingsTile.navigation(
                  title: Text(AppLocalizations.of(context).exportArchive),
                  description:
                      Text(AppLocalizations.of(context).exportArchiveDesc),
                  onPressed: (ctx) async {
                    try {
                      await WalletManager.exportAllWallets();
                    } catch (e) {
                      if (!ctx.mounted) return;
                      unawaited(
                        showAdaptiveDialog(
                          context: context,
                          builder: (ctx) => AlertDialog.adaptive(
                            title: Text(
                              AppLocalizations.of(context).exportError,
                            ),
                            content: SingleChildScrollView(
                              child: Flexible(
                                child: Text(e.toString()),
                              ),
                            ),
                          ),
                        ),
                      );
                      logger.e(e);
                      return;
                    }
                    if (!ctx.mounted) return;
                    unawaited(
                      showMessage(
                        AppLocalizations.of(ctx).exportCompleted,
                        context,
                      ),
                    );
                  },
                ),
                SettingsTile.navigation(
                  title: Text(AppLocalizations.of(context).importSingle),
                  description:
                      Text(AppLocalizations.of(context).importSingleDesc),
                  onPressed: (ctx) async {
                    try {
                      await WalletManager.importWallet();
                    } catch (e) {
                      if (!ctx.mounted) return;
                      unawaited(
                        showAdaptiveDialog(
                          context: context,
                          builder: (ctx) => AlertDialog.adaptive(
                            title: Text(
                              AppLocalizations.of(context).exportError,
                            ),
                            content: SingleChildScrollView(
                              child: Flexible(
                                child: Text(e.toString()),
                              ),
                            ),
                          ),
                        ),
                      );
                      logger.e(e);
                      return;
                    }
                    if (!ctx.mounted) return;
                    unawaited(
                      showMessage(
                        AppLocalizations.of(ctx).importCompleted,
                        context,
                      ),
                    );
                  },
                ),
                SettingsTile.navigation(
                  title: Text(AppLocalizations.of(context).importArchive),
                  description:
                      Text(AppLocalizations.of(context).importArchiveDesc),
                  onPressed: (ctx) async {
                    try {
                      await WalletManager.importArchive();
                    } catch (e) {
                      if (!ctx.mounted) return;
                      unawaited(
                        showAdaptiveDialog(
                          context: context,
                          builder: (ctx) => AlertDialog.adaptive(
                            title: Text(
                              AppLocalizations.of(context).exportError,
                            ),
                            content: SingleChildScrollView(
                              child: Flexible(
                                child: Text(e.toString()),
                              ),
                            ),
                          ),
                        ),
                      );
                      logger.e(e);
                      return;
                    }
                    if (!ctx.mounted) return;
                    unawaited(
                      showMessage(
                        AppLocalizations.of(ctx).importCompleted,
                        context,
                      ),
                    );
                  },
                ),
              ],
            ),
        ],
      ),
    );
  }
}
