import 'package:flutter/material.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'account_mirror_service.dart';
import '../models/firefly_account.dart';

class AccountDialogService {
  /// Menampilkan dialog untuk memilih akun sumber (revenue) dengan akses ke semua akun yang di-mirror
  static Future<Map<String, dynamic>?> showSourceAccountDialog(
    BuildContext context,
    List<Map<String, dynamic>> accounts,
  ) async {
    // Ambil semua akun revenue yang telah di-mirror
    final mirroredRevenueAccounts =
        await AccountMirrorService.getMirroredAccountsByType('revenue');

    // Jika tidak ada akun yang di-mirror, coba dari parameter accounts
    List<FireflyAccount> availableAccounts = mirroredRevenueAccounts;
    if (availableAccounts.isEmpty && accounts.isNotEmpty) {
      // Konversi dari Map ke FireflyAccount
      availableAccounts = accounts
          .where((account) =>
              (account['attributes'] as Map<String, dynamic>?)?['type'] ==
                  'revenue' ||
              account['type'] == 'revenue')
          .map((account) => FireflyAccount(
                id: account['id'].toString(),
                name: (account['attributes'] as Map<String, dynamic>?)?['name']
                        ?.toString() ??
                    account['name']?.toString() ??
                    '',
                type: (account['attributes'] as Map<String, dynamic>?)?['type']
                        ?.toString() ??
                    account['type']?.toString() ??
                    '',
              ))
          .toList();
    }

    if (availableAccounts.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
            content: Text(
                'Tidak ada akun sumber (revenue) yang tersedia. Pastikan akun telah disinkronkan dari server Firefly III.')),
      );
      return null;
    }

    return await showDialog<Map<String, dynamic>?>(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text('Pilih Akun Sumber'),
          content: SizedBox(
            width: double.maxFinite,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                // Tidak lagi menampilkan default account karena fitur telah dihapus
                const SizedBox(height: 8),
                // List akun yang tersedia
                SizedBox(
                  height: 300,
                  child: ListView.builder(
                    shrinkWrap: true,
                    itemCount: availableAccounts.length,
                    itemBuilder: (context, index) {
                      final account = availableAccounts[index];
                      return ListTile(
                        title: Text(account.name),
                        subtitle: Text('ID: ${account.id}'),
                        onTap: () {
                          // Simpan sebagai default account
                          _saveDefaultAccountId(
                              'source', account.id, account.name);
                          final accountAsMap = {
                            'id': account.id,
                            'name': account.name,
                            'type': account.type,
                          };
                          Navigator.of(context).pop(accountAsMap);
                        },
                      );
                    },
                  ),
                ),
              ],
            ),
          ),
        );
      },
    );
  }

  /// Menampilkan dialog untuk memilih akun tujuan (asset) dengan akses ke semua akun yang di-mirror
  static Future<Map<String, dynamic>?> showDestinationAccountDialog(
    BuildContext context,
    List<Map<String, dynamic>> accounts,
  ) async {
    // Ambil semua akun asset yang telah di-mirror
    final mirroredAssetAccounts =
        await AccountMirrorService.getMirroredAccountsByType('asset');

    // Jika tidak ada akun yang di-mirror, coba dari parameter accounts
    List<FireflyAccount> availableAccounts = mirroredAssetAccounts;
    if (availableAccounts.isEmpty && accounts.isNotEmpty) {
      // Konversi dari Map ke FireflyAccount
      availableAccounts = accounts
          .where((account) =>
              (account['attributes'] as Map<String, dynamic>?)?['type'] ==
                  'asset' ||
              account['type'] == 'asset')
          .map((account) => FireflyAccount(
                id: account['id'].toString(),
                name: (account['attributes'] as Map<String, dynamic>?)?['name']
                        ?.toString() ??
                    account['name']?.toString() ??
                    '',
                type: (account['attributes'] as Map<String, dynamic>?)?['type']
                        ?.toString() ??
                    account['type']?.toString() ??
                    '',
              ))
          .toList();
    }

    if (availableAccounts.isEmpty) {
      ScaffoldMessenger.of(context).showSnackBar(
        const SnackBar(
            content: Text(
                'Tidak ada akun tujuan (asset) yang tersedia. Pastikan akun telah disinkronkan dari server Firefly III.')),
      );
      return null;
    }

    // Tidak lagi menggunakan default account karena fitur telah dihapus

    return await showDialog<Map<String, dynamic>?>(
      context: context,
      builder: (context) {
        return AlertDialog(
          title: const Text('Pilih Akun Tujuan'),
          content: SizedBox(
            width: double.maxFinite,
            child: Column(
              mainAxisSize: MainAxisSize.min,
              children: [
                // Tidak menampilkan default account karena fitur telah dihapus
                const SizedBox(height: 8),
                // List akun yang tersedia
                SizedBox(
                  height: 300,
                  child: ListView.builder(
                    shrinkWrap: true,
                    itemCount: availableAccounts.length,
                    itemBuilder: (context, index) {
                      final account = availableAccounts[index];
                      return ListTile(
                        title: Text(account.name),
                        subtitle: Text('ID: ${account.id}'),
                        onTap: () {
                          // Tidak lagi menyimpan default account mapping
                          final accountAsMap = {
                            'id': account.id,
                            'name': account.name,
                            'type': account.type,
                          };
                          Navigator.of(context).pop(accountAsMap);
                        },
                      );
                    },
                  ),
                ),
              ],
            ),
          ),
        );
      },
    );
  }

  // Fungsi bantu untuk menyimpan default account ID
  static Future<void> _saveDefaultAccountId(
      String type, String id, String name) async {
    final prefs = await SharedPreferences.getInstance();
    await prefs.setString('default_${type}_account_id', id);
    await prefs.setString('default_${type}_account_name', name);
  }

  // Fungsi bantu untuk mendapatkan default account ID
  static Future<String?> _getDefaultAccountId(String type) async {
    final prefs = await SharedPreferences.getInstance();
    return prefs.getString('default_${type}_account_id');
  }
}
