import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
import 'package:sendtrain/daos/media_items_dao.dart';
import 'package:sendtrain/database/database.dart';
import 'package:sendtrain/models/activity_model.dart';
import 'package:sendtrain/models/activity_timer_model.dart';
import 'package:sendtrain/widgets/activity_view.dart';

class ActivityCard extends StatefulWidget {
  final ActivityModel activity;
  final Activity data;

  const ActivityCard({super.key, required this.activity, required this.data});

  @override
  State<ActivityCard> createState() => ActivityCardState();
}

class ActivityCardState extends State<ActivityCard> {
  String formattedTime(int timeInSecond) {
    int sec = timeInSecond % 60;
    int min = (timeInSecond / 60).floor();
    String minute = min.toString().length <= 1 ? "0$min" : "$min";
    String second = sec.toString().length <= 1 ? "0$sec" : "$sec";
    return "$minute:$second";
  }

  @override
  Widget build(BuildContext context) {
    final ActivityTimerModel atm =
        Provider.of<ActivityTimerModel>(context, listen: false);

    return FutureBuilder<List<MediaItem>>(
        future: MediaItemsDao(Provider.of<AppDatabase>(context))
            .fromActivity(widget.data),
        builder: (context, snapshot) {
          if (snapshot.hasData) {
            List<MediaItem> mediaItems = snapshot.data!;

            return Card(
              color: atm.activity?.id == widget.activity.id
                  ? Theme.of(context).colorScheme.primaryContainer
                  : Theme.of(context).colorScheme.surfaceContainerLow,
              clipBehavior: Clip.hardEdge,
              child: InkWell(
                  onTap: () => showGeneralDialog(
                      barrierColor: Colors.black.withOpacity(0.5),
                      transitionDuration: const Duration(milliseconds: 220),
                      transitionBuilder: (BuildContext context,
                          Animation<double> animation,
                          Animation<double> secondaryAnimation,
                          Widget child) {
                        Animation<Offset> custom = Tween<Offset>(
                                begin: const Offset(0.0, 1.0),
                                end: const Offset(0.0, 0.0))
                            .animate(animation);
                        return SlideTransition(
                            position: custom,
                            child: Dialog.fullscreen(
                                child: ActivityView(
                                    activityModel: widget.activity,
                                    activity: widget.data)));
                      },
                      barrierDismissible: true,
                      barrierLabel: '',
                      context: context,
                      pageBuilder: (context, animation1, animation2) {
                        return Container();
                      }),
                  child: Column(
                    mainAxisSize: MainAxisSize.min,
                    children: <Widget>[
                      ListTile(
                          leading: Padding(
                              padding: const EdgeInsets.fromLTRB(0, 0, 0, 0),
                              child: Container(
                                padding: EdgeInsets.only(top: 5, bottom: 5),
                                width: 60,
                                decoration: BoxDecoration(
                                  image: DecorationImage(
                                      fit: BoxFit.cover,
                                      image:
                                          findMediaByType(mediaItems, 'image')),
                                  // color: Colors.blue,
                                  borderRadius: const BorderRadius.all(
                                      Radius.elliptical(10, 10)),
                                ),
                              )),
                          title: Consumer<ActivityTimerModel>(
                            builder: (context, atm, child) {
                              if (atm.activity?.id == widget.activity.id) {
                                return Text(
                                    maxLines: 1,
                                    "${widget.data.title} (${formattedTime(atm.totalTime)})");
                              } else {
                                return Text(maxLines: 1, widget.data.title);
                              }
                            },
                          ),
                          subtitle: Text(maxLines: 2, widget.data.description),
                          trailing: IconButton(
                            visualDensity: VisualDensity.compact,
                            icon: Icon(Icons.close_rounded),
                            onPressed: () {
                              showAdaptiveDialog(
                                context: context,
                                builder: (BuildContext context) => AlertDialog(
                                  title: const Text('Activity Removal'),
                                  content: const Text(
                                      'Would you like to permanently remove this activity from the current session?'),
                                  actions: <Widget>[
                                    TextButton(
                                      onPressed: () =>
                                          Navigator.pop(context, 'Cancel'),
                                      child: const Text('Cancel'),
                                    ),
                                    TextButton(
                                      onPressed: () =>
                                          Navigator.pop(context, 'OK'),
                                      child: const Text('OK'),
                                    ),
                                  ],
                                ),
                              );
                            },
                          )),
                    ],
                  )),
            );
          } else {
            return CircularProgressIndicator();
          }
        });
  }

  ImageProvider findMediaByType(List<MediaItem> media, String type) {
    Iterable<MediaItem>? found = media.where((m) => m.type == MediaType.image);

    if (found.isNotEmpty) {
      return NetworkImage(found.first.reference);
    } else {
      // Element is not found
      return const AssetImage('assets/images/placeholder.jpg');
    }
  }
}