import 'package:drift/drift.dart' show Value;
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:okane/database/sqlite.dart';
import 'package:okane/i18n/strings.g.dart';
import 'package:okane/ui/utils.dart';
import 'package:okane/ui/widgets/add_expense_category.dart';

class AddBudgetItemPopup extends StatefulWidget {
  final VoidCallback onDone;
  final BudgetsDto budget;
  final List<BudgetItemDto> items;

  const AddBudgetItemPopup({
    super.key,
    required this.onDone,
    required this.budget,
    required this.items,
  });

  @override
  AddBudgetItemState createState() => AddBudgetItemState();
}

class AddBudgetItemState extends State<AddBudgetItemPopup> {
  final _budgetItemAmountEditController = TextEditingController();
  ExpenseCategory? _expenseCategory;

  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisSize: MainAxisSize.min,
      children: [
        Row(
          children: [
            Text(t.common.expenseCategory.name),

            OutlinedButton(
              onPressed: () async {
                final category = await showDialogOrModal(
                  context: context,
                  builder: (_) => AddExpenseCategory(),
                );
                if (category == null) {
                  return;
                }

                setState(() => _expenseCategory = category);
              },
              child: Text(
                _expenseCategory?.name ?? t.common.expenseCategory.none,
              ),
            ),
          ],
        ),

        TextField(
          decoration: InputDecoration(
            hintText: t.pages.budgets.addBudgetItem.amountHint,
          ),
          controller: _budgetItemAmountEditController,
          keyboardType: TextInputType.numberWithOptions(
            signed: false,
            decimal: true,
          ),
        ),

        Row(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            OutlinedButton(
              onPressed: () async {
                if (_budgetItemAmountEditController.text.isEmpty ||
                    _expenseCategory == null) {
                  return;
                }
                if (widget.items
                        .where(
                          (i) =>
                              i.expenseCategory.name == _expenseCategory!.name,
                        )
                        .firstOrNull !=
                    null) {
                  return;
                }

                await GetIt.I.get<OkaneDatabase>().budgetsDao.upsertBudgetItem(
                  BudgetItemsCompanion(
                    amount: Value(
                      double.parse(_budgetItemAmountEditController.text),
                    ),
                    expenseCategoryId: Value(_expenseCategory!.id),
                    budgetId: Value(widget.budget.budget.id),
                  ),
                );
                widget.onDone();
              },
              child: Text(t.modals.add),
            ),
          ],
        ),
      ],
    );
  }
}