import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:okane/database/collections/budget.dart';
import 'package:okane/database/collections/expense_category.dart';
import 'package:okane/database/database.dart';
import 'package:okane/ui/state/core.dart';
import 'package:okane/ui/utils.dart';
import 'package:okane/ui/widgets/add_expense_category.dart';

class AddBudgetItemPopup extends StatefulWidget {
  final VoidCallback onDone;
  final Budget budget;

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

  @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("Expense category"),

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

                setState(() => _expenseCategory = category);
              },
              child: Text(_expenseCategory?.name ?? "None"),
            ),
          ],
        ),

        TextField(
          decoration: InputDecoration(hintText: "Amount"),
          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.budget.items
                        .where(
                          (i) =>
                              i.expenseCategory.value!.name ==
                              _expenseCategory!.name,
                        )
                        .firstOrNull !=
                    null) {
                  return;
                }

                final item =
                    BudgetItem()
                      ..expenseCategory.value = _expenseCategory
                      ..amount = double.parse(
                        _budgetItemAmountEditController.text,
                      );
                await upsertBudgetItem(item);
                widget.budget.items.add(item);
                await upsertBudget(widget.budget);
                widget.onDone();
              },
              child: Text("Add"),
            ),
          ],
        ),
      ],
    );
  }
}