import 'package:flutter/material.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';

import '../../services/apiService.dart';
import '../../utils/auth_utils.dart';

class TrainListWidget extends StatefulWidget {
  final bool hasAction;
  final String? tripType;
  final List<Map<String, dynamic>> trainList;
  final Function(bool, Map<String, dynamic>, String) onOpen;
  final Function(Map<String, dynamic>) onDeleteTrain;
  final Function(String, bool) onAddNew;
  final bool isViewMode;
  final Map<String, dynamic>? apiData;

  const TrainListWidget({
    Key? key,
    required this.trainList,
    required this.onOpen,
    required this.onDeleteTrain,
    required this.onAddNew,
    required this.isViewMode,
    required this.apiData,
    required this.hasAction,
    this.tripType,
  }) : super(key: key);

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

class _TrainListWidgetState extends State<TrainListWidget> {
  ApiService apiService = ApiService();

  // late Map<String, String> countryMap;
  Map<String, String> countryMap = {};

  Color? layoutColor;
  Color? secondColor;
  Color? thridColor;
  bool orgHasService = false;

  @override
  void initState() {
    super.initState();
    loadInitialData();
    loadCountryList(); // Call your method here
    getOrgServices();
  }

  void getOrgServices() async {
    final services = await getOrgServicesName();
    print("getOrgServices storage: $services");

    // just names
    final names = services.map((s) => s['name']).toList();
    print("Names only: $names");
    final hasFlight = names.contains("Train");

    setState(() {
      orgHasService = hasFlight;
    });

    print("orgHasService: $orgHasService");
  }

  void loadInitialData() async {
    String? layoutString = await getLayoutColor();
    String? secondString = await getSecondaryColor();
    String? thridString = await getTernaryColor();

    // String? bodyStringColor = await getBodyColor();

    setState(() {
      layoutColor =
          layoutString != null
              ? Color(int.parse(layoutString))
              : Colors.redAccent;

      secondColor =
          layoutString != null
              ? Color(int.parse(secondString!))
              : Colors.orange;

      thridColor =
          layoutString != null
              ? Color(int.parse(thridString!))
              : Colors.orangeAccent;
      // bodyColor =
      // bodyStringColor != null
      //     ? Color(int.parse(bodyStringColor))
      //     : Colors.white;
    });
  }

  void checkClass() {
    if (widget.hasAction) {
      if (widget.tripType?.isNotEmpty == true) {
        print("Teppp - $widget.tripType");
        widget.onAddNew("Train", true);
      } else {
        showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(
              title: const Text('Select Trip Type'),
              content: const Text(
                'Please select a trip type before adding a Train.',
              ),
              actions: [
                TextButton(
                  onPressed: () => Navigator.of(context).pop(),
                  child: const Text('OK'),
                ),
              ],
            );
          },
        );
      }
    } else {
      print("Teppp No - $widget.tripType");
      widget.onAddNew("Flight", true);
    }
  }

  Future<void> loadCountryList() async {
    // final result = await apiService.fetchFlightsCountryList();
    final result = await apiService.fetchTrainCountryList(context);

    print("ResultCountry : $result");

    // Create a map: Country_Code -> "City, Airport"
    Map<String, String> tempCountryMap = {};

    for (var country in result) {
      String displayName = '${country['Station_Name']}';
      // String displayName = '${country['City']} | ${country['Airport']}';

      // tempCountryMap[country['Code']] = displayName;
      tempCountryMap[country['Station_Code']] = displayName;
    }

    setState(() {
      countryMap = tempCountryMap; // Update the map
    });
  }

  @override
  Widget build(BuildContext context) {
    final isDesktop = MediaQuery.of(context).size.width > 1024;

    return Padding(
      padding:
          isDesktop ? const EdgeInsets.all(16.0) : const EdgeInsets.all(5.0),
      child: Container(
        margin: const EdgeInsets.only(top: 16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.stretch,
          children: [
            // Header with title and button
            Row(
              mainAxisAlignment: MainAxisAlignment.spaceBetween,
              children: [
                if ((!isDesktop) && widget.trainList.isNotEmpty)
                  Text(
                    " ",
                    style: const TextStyle(
                      fontSize: 18,
                      fontWeight: FontWeight.bold,
                    ),
                  ),

                if (orgHasService && widget.trainList.isNotEmpty)
                  MouseRegion(
                    cursor:
                        widget.isViewMode
                            ? SystemMouseCursors.forbidden
                            : SystemMouseCursors.click,
                    child: MouseRegion(
                      cursor:
                          widget.isViewMode
                              ? SystemMouseCursors.forbidden
                              : SystemMouseCursors.click,

                      child: GestureDetector(
                        onTap:
                            widget.isViewMode
                                ? null
                                : () {
                                  print("New data");
                                  checkClass();
                                },
                        child: Row(
                          mainAxisSize:
                              MainAxisSize.min, // Ensures content fits nicely
                          children: [
                            // Text(
                            //   "Add New",
                            //   style: TextStyle(fontSize: 13),
                            // ),
                            // SizedBox(width: 8), // spacing between icon and text
                            Icon(
                              Icons.add_circle_sharp,
                              size: 30,
                              color: Color(0xFF114D8B),
                            ),
                          ],
                        ),
                      ),
                      // onPressed: isViewMode
                      //     ? null
                      //     : () {
                      //         print("New data");
                      //
                      //       },
                      // child: Row(
                      //   mainAxisSize: MainAxisSize.min,
                      //   children: [
                      //     Icon(
                      //       Icons.add_circle_sharp,
                      //       size: 30,
                      //       color: Color(0xFF114D8B),
                      //     )
                      //   ],
                      // ),
                    ),
                    // child: ElevatedButton(
                    //   style: ElevatedButton.styleFrom(
                    //     backgroundColor: Color(0xFF114D8B),
                    //     foregroundColor: Colors.white,
                    //     disabledBackgroundColor: Color(0xFF114D8B),
                    //     disabledForegroundColor: Colors.white,
                    //     shape: RoundedRectangleBorder(
                    //       borderRadius: BorderRadius.circular(8),
                    //       side: BorderSide(color: Color(0xFF114D8B), width: 2),
                    //     ),
                    //     padding:
                    //         EdgeInsets.symmetric(horizontal: 20, vertical: 12),
                    //   ),
                    //   onPressed: isViewMode
                    //       ? null
                    //       : () {
                    //           print("New data");
                    //           onAddNew("Train", true);
                    //         },
                    //   child: Row(
                    //     mainAxisSize:
                    //         MainAxisSize.min, // Ensures content fits nicely
                    //     children: [
                    //       Icon(
                    //         Icons.add_circle_sharp,
                    //         size: 30,
                    //         color: Color(0xFF114D8B),
                    //       )
                    //     ],
                    //   ),
                    // ),
                  ),
              ],
            ),
            const SizedBox(height: 16),

            // Scroll behavior based on device
            _buildData(context, isDesktop),
          ],
        ),
      ),
    );
  }

  Widget _buildData(BuildContext context, bool isDesktop) {
    List<Map<String, dynamic>> filteredList =
        widget.trainList.where((item) => item["is_active"] == "1").toList();
    // print("filteredList- $filteredList");

    List<dynamic> trainClassList = widget.apiData?['train_class'] ?? [];

    String getRequestForTrainClass(String? specialRequestKey) {
      if (specialRequestKey == null) return "N/A";

      return trainClassList
          .firstWhere(
            (element) =>
                element["dropdown_key"].toString() == specialRequestKey,
            orElse: () => {"dropdown_value": "N/A"},
          )["dropdown_value"]
          .toString();
    }

    // String formatDate(String dateString) {
    //   try {
    //     DateTime date = DateTime.parse(dateString);
    //     return DateFormat('d MMM yy').format(date); // Example: 4 Apr 25
    //   } catch (e) {
    //     return "Invalid Date";
    //   }
    // }
    //
    // String formatTime(String timeString) {
    //   try {
    //     final parts = timeString.split(':');
    //     final now = DateTime.now();
    //     final dateTime = DateTime(
    //       now.year,
    //       now.month,
    //       now.day,
    //       int.parse(parts[0]),
    //       int.parse(parts[1]),
    //     );
    //     return DateFormat.jm().format(dateTime); // e.g., 12:16 PM or 12 AM
    //   } catch (e) {
    //     return "Invalid Time";
    //   }
    // }

    String formatDate(String dateString) {
      try {
        DateTime date = DateFormat("dd-MM-yyyy").parse(dateString);
        return DateFormat('dd MMM yy').format(date); // Example: 23 May 25
      } catch (e) {
        return "Invalid Date";
      }
    }

    String formatTime(String timeString) {
      try {
        final parts = timeString.split(':');
        int hour = int.parse(parts[0]);
        int minute = int.parse(parts[1]);

        final now = DateTime.now();

        DateTime dateTime;

        if (hour == 24 && minute == 0) {
          // 24:00 is treated as 00:00 on the next day
          dateTime = DateTime(
            now.year,
            now.month,
            now.day,
          ).add(const Duration(days: 1));
        } else {
          if (hour < 0 || hour > 23 || minute < 0 || minute > 59) {
            throw FormatException("Invalid hour or minute");
          }
          dateTime = DateTime(now.year, now.month, now.day, hour, minute);
        }

        return DateFormat('HH:mm').format(dateTime); // 24-hour format
      } catch (e) {
        return "Invalid Time";
      }
    }

    return ListView.builder(
      shrinkWrap: true,
      physics: NeverScrollableScrollPhysics(),
      itemCount: filteredList.length,
      itemBuilder: (context, index) {
        final item = filteredList[index];

        String fromPlaceCountry =
            countryMap[item["from_station"].toString()] ?? "Unknown Country";
        String toPlaceCountry =
            countryMap[item["to_station"].toString()] ?? "Unknown Country";

        return Container(
          margin: EdgeInsets.symmetric(horizontal: 8, vertical: 6),
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(12),
            // color: Colors.orange.shade50,
            color: isDesktop ? Colors.white : thridColor,
            boxShadow:
                isDesktop
                    ? [
                      BoxShadow(
                        color: Colors.black12,
                        blurRadius: 3,
                        offset: Offset(0, 1),
                      ),
                    ]
                    : [],
            border: Border(
              top: BorderSide(
                color: Colors.white70, // Change color to match your theme
                width: 2,
              ),
            ),
          ),
          child: Padding(
            padding: isDesktop ? EdgeInsets.all(12) : EdgeInsets.all(8),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                Row(
                  mainAxisAlignment: MainAxisAlignment.end,
                  children: [
                    Text(
                      item["train_no"]?.toString() ?? "N/A",
                      style: GoogleFonts.poppins(
                        fontSize: 14,
                        fontWeight: FontWeight.w800,
                        color:
                            !isDesktop ? Color(0xFF114D8B) : Color(0xFF575A74),
                      ),
                    ),
                    Spacer(),

                    if (orgHasService) ...[
                      GestureDetector(
                        onTap: () => widget.onOpen(true, item, "Train"),
                        child: Tooltip(
                          message: 'Edit Train Details',
                          child: Image.asset(
                            'assets/images/IconsImg/edit.png',
                            width: 20,
                            height: 15,
                            color: isDesktop ? Color(0xFF114D8B) : Colors.black,
                          ),
                        ),
                      ),
                      SizedBox(width: 10),
                      GestureDetector(
                        onTap: () => widget.onDeleteTrain(item),
                        child: Tooltip(
                          message: 'Delete Train Details',
                          child: Image.asset(
                            'assets/images/IconsImg/delete.png',
                            width: 20,
                            height: 15,
                            color: Colors.red,
                          ),
                        ),
                      ),
                    ],
                  ],
                ),
                // Divider(color: Colors.blueGrey.shade50),
                SizedBox(height: 4),
                isDesktop
                    ? Row(
                      children: [
                        Expanded(
                          flex: 2,
                          child: Text(
                            "Class",
                            style: GoogleFonts.poppins(fontSize: 11),
                          ),
                        ),
                        Expanded(
                          flex: 4,
                          child: Text(
                            " Planned Trips",
                            style: GoogleFonts.poppins(fontSize: 11),
                          ),
                        ),
                        Expanded(
                          flex: 2,
                          child: Text(
                            " Date",
                            style: GoogleFonts.poppins(fontSize: 11),
                          ),
                        ),
                        Expanded(
                          flex: 2,
                          child: Text(
                            " Comments",
                            style: GoogleFonts.poppins(fontSize: 11),
                          ),
                        ),
                      ],
                    )
                    : SizedBox.shrink(),
                SizedBox(height: 8),
                isDesktop
                    ? Row(
                      children: [
                        Expanded(
                          flex: 2,
                          child: Text(
                            "${getRequestForTrainClass(item["class"]!.toString())} ",
                            style: GoogleFonts.poppins(
                              fontSize: 12,
                              fontWeight: FontWeight.w600,
                            ),
                          ),
                        ),
                        SizedBox(width: 10),
                        Expanded(
                          flex: 3,

                          // child: Column(
                          //   crossAxisAlignment: CrossAxisAlignment.start,
                          //   children: [
                          //     Expanded(
                          //       flex: 1,
                          //       child: Text(
                          //         "$fromPlaceCountry",
                          //         // "${trip["from_place"]?.toString()} - ${trip["to_place"]?.toString()}",
                          //         style: GoogleFonts.poppins(
                          //           fontSize: 12,
                          //           fontWeight: FontWeight.w700,
                          //         ),
                          //       ),
                          //     ),
                          //     Expanded(
                          //       flex: 1,
                          //       child: Padding(
                          //         padding: const EdgeInsets.only(left: 10),
                          //         child: Image.asset(
                          //           'assets/images/IconsImg/Frame.png',
                          //           width: 20,
                          //           height: 20,
                          //         ),
                          //       ),
                          //     ),
                          //     Expanded(
                          //       flex: 1,
                          //       child: Text(
                          //         "$toPlaceCountry",
                          //         // "${trip["from_place"]?.toString()} - ${trip["to_place"]?.toString()}",
                          //         style: GoogleFonts.poppins(
                          //           fontSize: 12,
                          //           fontWeight: FontWeight.w700,
                          //         ),
                          //       ),
                          //     ),
                          //   ],
                          // ),
                          child: Row(
                            crossAxisAlignment: CrossAxisAlignment.start,
                            children: [
                              Expanded(
                                flex: 1,
                                child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [
                                    Text(
                                      "$fromPlaceCountry ",

                                      // "${item["from_station"]!} -  ${(item["to_station"])}",
                                      style: GoogleFonts.poppins(
                                        fontSize: 12,
                                        fontWeight: FontWeight.w600,
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                              Expanded(
                                flex: 1,
                                child: Padding(
                                  padding: const EdgeInsets.only(left: 10),
                                  child: Image.asset(
                                    'assets/images/IconsImg/Frame.png',
                                    width: 20,
                                    height: 20,
                                  ),
                                ),
                              ),
                              Expanded(
                                flex: 1,
                                child: Column(
                                  crossAxisAlignment: CrossAxisAlignment.start,
                                  children: [
                                    Text(
                                      "$toPlaceCountry",

                                      // "$fromPlaceCountry - $toPlaceCountry",
                                      style: GoogleFonts.poppins(
                                        fontSize: 12,
                                        fontWeight: FontWeight.w600,
                                      ),
                                    ),
                                  ],
                                ),
                              ),
                            ],
                          ),
                        ),
                        Spacer(),
                        // SizedBox(width: 10),
                        Expanded(
                          flex: 2,
                          child: Text(
                            "${formatDate(item["date"]!)} ${formatTime(item["time"]!)}",
                            style: GoogleFonts.poppins(
                              fontSize: 12,
                              fontWeight: FontWeight.w600,
                            ),
                          ),
                        ),
                        SizedBox(width: 10),
                        Expanded(
                          flex: 2,
                          child: _buildComments(
                            "Comments:",
                            item["comments"] ?? "N/A",
                          ),
                        ),
                      ],
                    )
                    : Container(
                      color: Colors.white,
                      padding: const EdgeInsets.all(4.0),
                      child: Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        children: [
                          _buildRow(
                            "Class",
                            getRequestForTrainClass(item["class"]!.toString()),
                          ),
                          _buildRow("From", item["from_station"]!),
                          _buildRow("To", item["to_station"]!),
                          _buildDateTimeRow(
                            "Date",
                            formatDate(item["date"]!),
                            formatTime(item["time"]!),
                          ),
                          _buildRow("Comments", item["comments"] ?? "N/A"),
                        ],
                      ),
                    ),

                // Column(
                //       crossAxisAlignment: CrossAxisAlignment.start,
                //       children: [
                //         // First row: City & Location
                //         Row(
                //           mainAxisAlignment: MainAxisAlignment.spaceBetween,
                //           children: [
                //             _infoColumn(
                //               "Class",
                //               getRequestForTrainClass(
                //                     item["class"]!.toString(),
                //                   ) ??
                //                   "N/A",
                //             ),
                //             _infoColumn("From", item["from_station"]! ?? "N/A"),
                //             _infoColumn(
                //               "To",
                //               item["to_station"]! ?? "N/A",
                //               alignEnd: true,
                //             ),
                //           ],
                //         ),
                //         const SizedBox(height: 16),
                //
                //         // Second row: Date & Time
                //         Row(
                //           mainAxisAlignment: MainAxisAlignment.spaceBetween,
                //           children: [
                //             _infoColumn(
                //               "Date",
                //               "${formatDate(item["date"]!)}" ?? "N/A",
                //             ),
                //             _infoColumn(
                //               "Time",
                //               "${formatTime(item["time"]!)}" ?? "N/A",
                //               alignEnd: true,
                //             ),
                //           ],
                //         ),
                //         const SizedBox(height: 16),
                //
                //         // Comment label
                //         Text(
                //           "Comment",
                //           style: GoogleFonts.poppins(
                //             fontSize: 14,
                //             fontWeight: FontWeight.w600,
                //           ),
                //         ),
                //         const SizedBox(height: 8),
                //
                //         // Comment box
                //         if (item["comments"] != null &&
                //             item["comments"].toString().trim().isNotEmpty)
                //           Container(
                //             width: double.infinity,
                //             padding: const EdgeInsets.all(12),
                //             decoration: BoxDecoration(
                //               border: Border.all(
                //                 color: const Color(0xFF7098DD),
                //                 width: 1,
                //               ),
                //               borderRadius: BorderRadius.circular(6),
                //             ),
                //             child: Text(
                //               item["comments"] ?? "N/A",
                //               style: GoogleFonts.poppins(
                //                 fontSize: 12,
                //                 color: Colors.black87,
                //               ),
                //             ),
                //           )
                //         else
                //           const Text("N/A", style: TextStyle(fontSize: 12)),
                //       ],
                //     ),
              ],
            ),
          ),
        );
      },
    );
  }

  Widget _buildComments(String title, String value) {
    // Define character limits based on title
    Map<String, int> limits = {
      // "Special Request:": 30,
      "Comments:": 30,
      // Add more keys and limits if needed
    };

    int limit = limits[title] ?? 50; // Default limit if title not found
    bool exceedsLimit = value.length > limit;

    String wrapText(String text, int maxLineLength) {
      final pattern = RegExp('.{1,$maxLineLength}(\\s+|\$)');
      return pattern.allMatches(text).map((m) => m.group(0)!).join('\n');
    }

    return Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Expanded(
          child:
              exceedsLimit
                  ? Tooltip(
                    message: wrapText(value, 50),
                    decoration: BoxDecoration(
                      color: Colors.grey.shade200, // Black background
                      borderRadius: BorderRadius.circular(6),
                    ),
                    textStyle: TextStyle(
                      color: Colors.black,
                    ), // Tooltip text color
                    padding: EdgeInsets.all(8),
                    preferBelow: false,
                    child: Text(
                      value.substring(0, limit) + "...",
                      style: TextStyle(
                        fontSize: 12,
                        fontWeight: FontWeight.w600,
                        fontFamily: "Archivo",
                      ),
                      overflow: TextOverflow.ellipsis,
                    ),
                  )
                  : Text(
                    value,
                    style: TextStyle(
                      fontSize: 12,
                      fontWeight: FontWeight.w600,
                      fontFamily: "Archivo",
                    ),
                  ),
        ),
      ],
    );
  }

  Widget _buildRow(String title, String value) {
    // Define character limits based on title
    Map<String, int> limits = {
      // "Special Request:": 30,
      "Comments:": 10,
      // Add more keys and limits if needed
    };

    int limit = limits[title] ?? 50; // Default limit if title not found
    bool exceedsLimit = value.length > limit;

    String wrapText(String text, int maxLineLength) {
      final pattern = RegExp('.{1,$maxLineLength}(\\s+|\$)');
      return pattern.allMatches(text).map((m) => m.group(0)!).join('\n');
    }

    return Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        SizedBox(
          width: 100,
          child: Text(
            title,
            style: GoogleFonts.poppins(
              fontSize: 12,
              fontWeight: FontWeight.w600,
            ),
          ),
        ),
        SizedBox(width: 8),
        Expanded(
          child:
              exceedsLimit
                  ? Tooltip(
                    message: wrapText(value, 50),
                    decoration: BoxDecoration(
                      color: Colors.grey.shade200, // Black background
                      borderRadius: BorderRadius.circular(6),
                    ),
                    textStyle: TextStyle(
                      color: Colors.black,
                    ), // Tooltip text color
                    padding: EdgeInsets.all(8),
                    preferBelow: false,
                    child: Text(
                      value.substring(0, limit) + "...",
                      style: GoogleFonts.poppins(fontSize: 12),
                      overflow: TextOverflow.ellipsis,
                    ),
                  )
                  : Text(value, style: GoogleFonts.poppins(fontSize: 12)),
        ),
      ],
    );
  }

  Widget _infoColumn(String label, String value, {bool alignEnd = false}) {
    return Column(
      // crossAxisAlignment: CrossAxisAlignment.start,
      crossAxisAlignment:
          alignEnd ? CrossAxisAlignment.end : CrossAxisAlignment.start,
      children: [
        Text(
          label,
          style: GoogleFonts.poppins(
            fontSize: 12,
            fontWeight: FontWeight.w600,
            color: Colors.black87,
          ),
        ),
        const SizedBox(height: 4),
        Text(
          value,
          style: GoogleFonts.poppins(fontSize: 12, color: Colors.black87),
        ),
      ],
    );
  }

  Widget _buildDateTimeRow(String title, String date, String time) {
    return Row(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        SizedBox(
          width: 100,
          child: Text(
            title,
            style: TextStyle(fontWeight: FontWeight.w600, fontSize: 12),
          ),
        ),
        SizedBox(width: 8),
        Expanded(child: Text("$date, $time", style: TextStyle(fontSize: 12))),
      ],
    );
  }
}
