import 'dart:math';
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
import 'package:get_it/get_it.dart';
import 'package:okane/database/collections/recurrent.dart';
import 'package:okane/database/database.dart';
import 'package:okane/i18n/strings.g.dart';
import 'package:okane/ui/state/core.dart';
import 'package:okane/ui/utils.dart';
import 'package:okane/ui/widgets/add_transaction.dart';
import 'package:okane/ui/widgets/piechart_card.dart';

class UpcomingTransactionsCard extends StatelessWidget {
  const UpcomingTransactionsCard({super.key});

  @override
  Widget build(BuildContext context) {
    final bloc = GetIt.I.get<CoreCubit>();
    return BlocBuilder<CoreCubit, CoreState>(
      builder: (context, state) {
        final today = DateTime.now();
        final upcomingRaw =
            state.recurringTransactions.where((t) => t.isDue(today)).toList();
        final List<RecurringTransaction> upcoming =
            upcomingRaw.isEmpty
                ? List.empty()
                : upcomingRaw.sublist(0, min(upcomingRaw.length, 3));
        final transactions =
            upcoming.isEmpty
                ? [
                  Text(
                    t
                        .pages
                        .accounts
                        .upcomingTransactions
                        .noUpcomingTransactions,
                    style: Theme.of(context).textTheme.bodyLarge,
                  ),
                ]
                : upcoming
                    .map(
                      (transaction) => ListTile(
                        title: Text(
                          t.pages.accounts.upcomingTransactions.items.title(
                            name: transaction.template.value!.name,
                            amount:
                                "${formatCurrency(transaction.template.value!.amount)}€",
                          ),
                        ),
                        subtitle: Text(
                          t.pages.accounts.upcomingTransactions.items.dueIn(
                            number:
                                today
                                    .difference(
                                      transaction.lastExecution ?? today,
                                    )
                                    .inDays,
                          ),
                        ),
                        leading: Icon(
                          transaction.template.value!.amount < 0
                              ? Icons.remove
                              : Icons.add,
                          color:
                              transaction.template.value!.amount < 0
                                  ? Colors.red
                                  : Colors.green,
                        ),
                        trailing: IconButton(
                          icon: Icon(Icons.play_arrow),
                          onPressed: () {
                            showDialogOrModal(
                              context: context,
                              builder:
                                  (context) => AddTransactionWidget(
                                    activeAccountItem: bloc.activeAccount!,
                                    template: transaction.template.value!,
                                    onAdd: (newTransaction) async {
                                      // Update the recurring template
                                      transaction.lastExecution =
                                          newTransaction.date;
                                      await upsertRecurringTransaction(
                                        transaction,
                                      );
                                      Navigator.of(context).pop();
                                    },
                                  ),
                            );
                          },
                        ),
                      ),
                    )
                    .toList();
        return ResponsiveCard(
          titleText: t.pages.accounts.upcomingTransactions.title,
          child: Padding(
            padding: const EdgeInsets.all(16),
            child: Column(children: transactions),
          ),
        );
      },
    );
  }
}