import 'package:fforte/addCam/add_cam_main.dart';
import 'package:fforte/other/db_helper.dart';
import 'package:flutter/material.dart';
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:flutter_map/flutter_map.dart';
import 'package:flutter_slidable/flutter_slidable.dart';
import 'package:latlong2/latlong.dart';
// * Site that shows all entries in the databases

class ViewCams extends StatefulWidget {
  const ViewCams({super.key});

  @override
  State<ViewCams> createState() => _ViewCamsState();
}

class _ViewCamsState extends State<ViewCams> {
  // var declaration
  late Future<List<Map<String, dynamic>>> place;
  late Future<List<Map<String, dynamic>>> templates;
  late List<Marker> markers;

  // loads the entries
  @override
  void initState() {
    super.initState();
    place = DBHelper().getPlace();
    templates = DBHelper().getTemplates();
  }

  // functions to delete all entries LOCALLY
  void delAllPlaces() async {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text(AppLocalizations.of(context)!.deleteEverything),
            content: SingleChildScrollView(
              child: ListBody(children: <Widget>[
                Text(AppLocalizations.of(context)!.deleteEverythingContent)
              ]),
            ),
            actions: <Widget>[
              TextButton(
                  onPressed: () {
                    var placeDB = DBHelper();
                    placeDB.deleteAllPlaces();
                    setState(() {
                      place = DBHelper().getPlace();
                    });

                    Navigator.of(context).pop();
                  },
                  child: Text(AppLocalizations.of(context)!.deleteEverything)),
              TextButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: Text(AppLocalizations.of(context)!.cancel))
            ],
          );
        });
  }

  void delSinglePlace(int id) async {
    DBHelper().deletePlace(id.toString());
    setState(() {
      place = DBHelper().getPlace();
    });
  }

  void delAllTemplates() async {
    return showDialog(
        context: context,
        barrierDismissible: false,
        builder: (BuildContext context) {
          return AlertDialog(
            title: Text(AppLocalizations.of(context)!.deleteEverything),
            content: SingleChildScrollView(
              child: ListBody(children: <Widget>[
                Text(AppLocalizations.of(context)!.deleteEverythingContent)
              ]),
            ),
            actions: <Widget>[
              TextButton(
                  onPressed: () {
                    var placeDB = DBHelper();
                    placeDB.deleteAllTemplates();
                    setState(() {
                      templates = DBHelper().getTemplates();
                    });
                    Navigator.of(context).pop();
                  },
                  child: Text(AppLocalizations.of(context)!.deleteEverything)),
              TextButton(
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                  child: Text(AppLocalizations.of(context)!.cancel))
            ],
          );
        });
  }

  // The widet tree with taps to differentiate between templates and finished entries
  @override
  Widget build(BuildContext context) {
    return DefaultTabController(
      length: 3,
      child: Scaffold(
          appBar: AppBar(
              bottom: TabBar(tabs: [
                Tab(text: AppLocalizations.of(context)!.completed),
                Tab(
                  text: AppLocalizations.of(context)!.uncompleted,
                ),
                Tab(
                  text: AppLocalizations.of(context)!.map,
                ),
              ]),
              title: Text(AppLocalizations.of(context)!.viewplacesappbar)),
          body: TabBarView(
            children: [
              FutureBuilder<List<Map<String, dynamic>>>(
                future: place,
                builder: (context, snapshot) {
                  if (snapshot.connectionState == ConnectionState.waiting) {
                    return const CircularProgressIndicator();
                  } else if (snapshot.hasError) {
                    return Text('Error: ${snapshot.error}');
                  } else {
                    List<Map<String, dynamic>> placeList =
                        List.of(snapshot.data!);
                    return Scaffold(
                      floatingActionButton: FloatingActionButton(
                        child: const Icon(Icons.delete),
                        onPressed: () {
                          delAllPlaces();
                        },
                      ),
                      body: Column(
                        children: [
                          const SizedBox(
                            height: 10,
                          ),
                          Row(
                            mainAxisAlignment: MainAxisAlignment.spaceBetween,
                            children: [
                              Row(
                                children: [
                                  const SizedBox(
                                    width: 10,
                                  ),
                                  Text(
                                      style: const TextStyle(
                                          decoration: TextDecoration.underline),
                                      AppLocalizations.of(context)!.placedata),
                                ],
                              ),
                              Row(
                                children: [
                                  Text(
                                      style: const TextStyle(
                                          decoration: TextDecoration.underline),
                                      AppLocalizations.of(context)!.sent),
                                  const SizedBox(
                                    width: 10,
                                  ),
                                ],
                              ),
                            ],
                          ),
                          const SizedBox(
                            height: 15,
                          ),
                          Expanded(
                              child: ListView.builder(
                            itemCount: placeList.length,
                            itemBuilder: (context, index) {
                              Map<String, dynamic> place =
                                  snapshot.data![index];
                              return Slidable(
                                startActionPane: ActionPane(
                                    motion: const ScrollMotion(),
                                    children: [
                                      SlidableAction(
                                        onPressed: (context) {
                                          delSinglePlace(
                                              place['ID'.toString()]);
                                        },
                                        backgroundColor: Colors.red,
                                        foregroundColor: Colors.white,
                                        icon: Icons.delete,
                                        label: AppLocalizations.of(context)!
                                            .justdelete,
                                      )
                                    ]),
                                child: ListTile(
                                  title: Text('Standort ${index + 1}'),
                                  subtitle: Text(
                                      'ID: ${place['ID']} DATUM: ${place['Datum']}'),
                                  trailing: Checkbox(
                                    value: place['Sent'] == 0 ? false : true,
                                    onChanged: null,
                                  ),
                                  onTap: () async {
                                      Navigator.push(
                                          context,
                                          MaterialPageRoute(
                                              builder: (context) => AddCamMain(
                                                    isSent: place['Sent'] == 1 ? true : false,
                                                    isFinished: true,
                                                    existingData: place,
                                                  )));
                                  },
                                ),
                              );
                            },
                          ))
                        ],
                      ),
                    );
                  }
                },
              ),
              FutureBuilder<List<Map<String, dynamic>>>(
                  future: templates,
                  builder: (context, snapshot) {
                    if (snapshot.connectionState == ConnectionState.waiting) {
                      return const CircularProgressIndicator();
                    } else if (snapshot.hasError) {
                      return Text('Error: ${snapshot.error}');
                    } else {
                      return Scaffold(
                        floatingActionButton: FloatingActionButton(
                          child: const Icon(Icons.delete),
                          onPressed: () {
                            delAllTemplates();
                          },
                        ),
                        body: Column(
                          children: [
                            Expanded(
                              child: ListView.builder(
                                  itemCount: snapshot.data!.length,
                                  itemBuilder: (context, index) {
                                    Map<String, dynamic> templates =
                                        snapshot.data![index];
                                    return ListTile(
                                      onTap: () {
                                        Navigator.push(
                                            context,
                                            MaterialPageRoute(
                                                builder: (context) =>
                                                    AddCamMain(
                                                      isTemplate: true,
                                                      isFinished: false,
                                                      existingData: templates,
                                                    )));
                                      },
                                      title: Text('Place ${index + 1}'),
                                      subtitle: Text(
                                          'ID: ${templates['CID']} DATUM: ${templates['Datum']} RUDEL: ${templates['Rudel']} STATUS: ${templates['Status']}'),
                                    );
                                  }),
                            )
                          ],
                        ),
                      );
                    }
                  }),
              FutureBuilder(
                  future: place,
                  builder: (context, snapshot) {
                    if (snapshot.connectionState == ConnectionState.waiting) {
                      return const CircularProgressIndicator();
                    } else if (snapshot.hasError) {
                      return Text("Error ${snapshot.error}");
                    } else {
                      markers = snapshot.data!.map((e) {
                        return Marker(
                            width: 80.0,
                            height: 80.0,
                            point: LatLng(double.parse(e['DECLAT'].toString()),
                                double.parse(e['DECLNG'].toString())),
                            child: Column(
                              children: [
                                const Icon(
                                  Icons.location_on,
                                  color: Colors.red,
                                ),
                                Text(
                                  "ID: ${e['ID'].toString()}",
                                  style: const TextStyle(color: Colors.black),
                                )
                              ],
                            ));
                      }).toList();
                      return FlutterMap(
                          options: MapOptions(
                              initialCenter: markers.isEmpty
                                  ? const LatLng(50, 10)
                                  : markers.first.point,
                              interactionOptions: const InteractionOptions(
                                  flags: InteractiveFlag.pinchZoom |
                                      InteractiveFlag.drag |
                                      InteractiveFlag.pinchMove)),
                          children: [
                            TileLayer(
                              urlTemplate:
                                  'https://tile.openstreetmap.org/{z}/{x}/{y}.png',
                              userAgentPackageName: 'com.example.app',
                            ),
                            MarkerLayer(markers: markers)
                          ]);
                    }
                  })
            ],
          )),
    );
  }
}
