import 'package:dropdown_search/dropdown_search.dart';
import 'package:flutter/material.dart';

import '../../Controller/account_controller.dart';
import '../../Entities/drift_database.dart';

/// Ein Dropdown, mit welchem man das Konto auswählen kann
class AccountSelect extends StatefulWidget {
  /// Erstellt eine neue Instanz dieser Klasse
  const AccountSelect({super.key});

  @override
  State<AccountSelect> createState() => _AccountSelectState();
}

class _AccountSelectState extends State<AccountSelect> {
  final AccountController _accountController = AccountController();
  Account? _selected;
  List<Account> _accounts = [];

  @override
  void initState() {
    super.initState();

    _selected = _accountController.selected.value;
    _accounts = _accountController.accounts.value;

    _accountController.selected.addListener(() {
      setState(() {
        if (mounted) {
          _selected = _accountController.selected.value;
        }
      });
    });

    _accountController.accounts.addListener(() {
      setState(() {
        if (mounted) {
          _accounts = _accountController.accounts.value;
        }
      });
    });
  }

  @override
  Widget build(final BuildContext context) {
    if (_selected != null && _accounts.isNotEmpty) {
      return DropdownSearch<Account>(
        items: (final f, final cs) => _accounts,
        selectedItem: _selected,
        onChanged: (final Account? account) {
          if (account != null) {
            _accountController.selected = account;
          }
        },

        itemAsString: (final Account account) => account.name,
        compareFn: (final Account a1, final Account a2) => a1.id == a2.id,
        popupProps: const PopupProps<Account>.menu(
          showSearchBox: true,
          searchFieldProps: TextFieldProps(
            decoration: InputDecoration(
              hintText: 'Konto suchen...',
              contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 8),
            ),
          ),
        ),
      );
    } else if (_selected == null && _accounts.isEmpty) {
      return TextButton(
        onPressed: _accountController.newAccountHandler,
        child: const Row(
          mainAxisAlignment: MainAxisAlignment.center,
          children: [
            Icon(Icons.account_balance_wallet),
            SizedBox(width: 10),
            Text('Konto hinzufügen'),
          ],
        ),
      );
    } else {
      return const CircularProgressIndicator();
    }
  }
}
