import 'dart:convert';

import 'package:sefer_driver/constant/colors.dart';
import 'package:sefer_driver/constant/style.dart';
import 'package:sefer_driver/controller/notification/ride_available_controller.dart';
import 'package:sefer_driver/views/widgets/my_scafold.dart';
import 'package:sefer_driver/views/widgets/mycircular.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';

import '../../constant/box_name.dart';
import '../../constant/links.dart';
import '../../controller/firebase/firbase_messge.dart';
import '../../controller/functions/crud.dart';
import '../../controller/home/captin/home_captain_controller.dart';
import '../../main.dart';
import '../home/Captin/driver_map_page.dart';
import '../widgets/mydialoug.dart';

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

  @override
  Widget build(BuildContext context) {
    Get.put(RideAvailableController());
    return GetBuilder<RideAvailableController>(
        builder: (rideAvailableController) {
      // rideAvailableController.sortRidesByDistance();
      return MyScafolld(
          title: 'Available for rides'.tr,
          body: [
            rideAvailableController.isLoading
                ? const MyCircularProgressIndicator()
                :
                // : ListView.builder(
                //   itemCount: rideAvailableController
                //       .rideAvailableMap['message']
                //       .where((rideInfo) {
                //     var driverType =
                //         box.read(BoxName.carTypeOfDriver).toString();
                //     return (driverType == 'Comfort' &&
                //             ['Speed', 'Comfort']
                //                 .contains(rideInfo['carType'])) ||
                //         (driverType == 'Speed' &&
                //             rideInfo['carType'] == 'Speed') ||
                //         (driverType == 'Scooter' &&
                //             rideInfo['carType'] == 'Scooter') ||
                //         (driverType == 'Awfar Car' &&
                //             rideInfo['carType'] == 'Awfar Car') ||
                //         (driverType == 'Lady' &&
                //             ['Comfort', 'Speed', 'Lady']
                //                 .contains(rideInfo['carType']));
                //   }).length,
                //   itemBuilder: (context, index) {
                //     var filteredRides = rideAvailableController
                //         .rideAvailableMap['message']
                //         .where((rideInfo) {
                //       var driverType =
                //           box.read(BoxName.carTypeOfDriver).toString();
                //       return (driverType == 'Comfort' &&
                //               ['Speed', 'Comfort']
                //                   .contains(rideInfo['carType'])) ||
                //           (driverType == 'Speed' &&
                //               rideInfo['carType'] == 'Speed') ||
                //           (driverType == 'Awfar Car' &&
                //               rideInfo['carType'] == 'Awfar Car') ||
                //           (driverType == 'Scooter' &&
                //               rideInfo['carType'] == 'Scooter') ||
                //           (driverType == 'Lady' &&
                //               ['Comfort', 'Speed', 'Lady']
                //                   .contains(rideInfo['carType']));
                //     }).toList();

                //     return RideAvailableCard(
                //       rideInfo: filteredRides[index],
                //     );
                //   },
                // )
                ListView.builder(
                    itemCount: rideAvailableController
                        .rideAvailableMap['message']
                        .where((rideInfo) {
                      var driverType =
                          box.read(BoxName.carTypeOfDriver).toString();
                      switch (driverType) {
                        case 'Comfort':
                          return ['Speed', 'Comfort']
                              .contains(rideInfo['carType']);
                        case 'Speed':
                        case 'Scooter':
                        case 'Awfar Car':
                          return rideInfo['carType'] == driverType;
                        case 'Lady':
                          return ['Comfort', 'Speed', 'Lady']
                              .contains(rideInfo['carType']);
                        default:
                          return false;
                      }
                    }).length,
                    itemBuilder: (context, index) {
                      var filteredRides = rideAvailableController
                          .rideAvailableMap['message']
                          .where((rideInfo) {
                        var driverType =
                            box.read(BoxName.carTypeOfDriver).toString();
                        switch (driverType) {
                          case 'Comfort':
                            return ['Speed', 'Comfort']
                                .contains(rideInfo['carType']);
                          case 'Speed':
                          case 'Scooter':
                          case 'Awfar Car':
                            return rideInfo['carType'] == driverType;
                          case 'Lady':
                            return ['Comfort', 'Speed', 'Lady']
                                .contains(rideInfo['carType']);
                          default:
                            return false;
                        }
                      }).toList();

                      return RideAvailableCard(
                        rideInfo: filteredRides[index],
                      );
                    },
                  )
            // rideAvailableController.isLoading
            //     ? const MyCircularProgressIndicator()
            //     : ListView.builder(
            //         itemCount: rideAvailableController
            //             .rideAvailableMap['message'].length,
            //         itemBuilder: (context, index) => RideAvailableCard(
            //           rideInfo: rideAvailableController
            //               .rideAvailableMap['message'][index],
            //         ),
            //       )
          ],
          isleading: true);
    });
  }
}

class RideAvailableCard extends StatelessWidget {
  final Map<String, dynamic> rideInfo;

  const RideAvailableCard({Key? key, required this.rideInfo}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Card(
      margin: const EdgeInsets.all(8.0),
      shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(12)),
      elevation: 4,
      child: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            _buildLocationRow('↑', rideInfo['startName'], AppColor.greenColor),
            const SizedBox(height: 8),
            _buildLocationRow('↓', rideInfo['endName'], Colors.red),
            const SizedBox(height: 16),
            _buildInfoRow(),
            const SizedBox(height: 16),
            _buildActionRow(),
          ],
        ),
      ),
    );
  }

  Widget _buildLocationRow(String icon, String location, Color iconColor) {
    return Row(
      children: [
        Text(
          icon,
          style: TextStyle(
              fontSize: 20, fontWeight: FontWeight.bold, color: iconColor),
        ),
        const SizedBox(width: 8),
        Expanded(
          child: Text(
            location,
            style: AppStyle.subtitle,
            maxLines: 2,
            overflow: TextOverflow.ellipsis,
          ),
        ),
      ],
    );
  }

  Widget _buildInfoRow() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        Text('${'Price:'.tr} ${rideInfo['price']} \$', style: AppStyle.title),
        Text(
          rideInfo['carType'],
          style: AppStyle.title.copyWith(color: AppColor.greenColor),
        ),
      ],
    );
  }

  Widget _buildActionRow() {
    return Row(
      mainAxisAlignment: MainAxisAlignment.spaceBetween,
      children: [
        Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: [
            Text('📈 ${rideInfo['passengerRate']}', style: AppStyle.title),
            const SizedBox(height: 4),
            Text(
              '📍 ${rideInfo['distance']} ${'KM'.tr}',
              style: AppStyle.title.copyWith(color: AppColor.greenColor),
            ),
          ],
        ),
        ElevatedButton(
          onPressed: () => _acceptRide(),
          style: ElevatedButton.styleFrom(
            backgroundColor: AppColor.greenColor,
            shape:
                RoundedRectangleBorder(borderRadius: BorderRadius.circular(8)),
          ),
          child: Text('Accept'.tr),
        ),
      ],
    );
  }

  void _acceptRide() async {
    var res = await CRUD().post(link: AppLink.updateStausFromSpeed, payload: {
      'id': rideInfo['id'],
      'rideTimeStart': DateTime.now().toString(),
      'status': 'Apply',
      'driver_id': box.read(BoxName.driverID),
    });
    if (AppLink.endPoint.toString() != AppLink.seferCairoServer) {
      CRUD().post(
          link: '${AppLink.endPoint}rides/updateStausFromSpeed.php',
          payload: {
            'id': rideInfo['id'],
            'rideTimeStart': DateTime.now().toString(),
            'status': 'Apply',
            'driver_id': box.read(BoxName.driverID),
          });
    }

    // .then((value) {
    // var json = jsonDecode(res);
    if (res != "failure") {
      List<String> bodyToPassenger = [
        box.read(BoxName.driverID).toString(),
        box.read(BoxName.nameDriver).toString(),
        box.read(BoxName.tokenDriver).toString(),
      ];
      box.write(BoxName.statusDriverLocation, 'on');
      await CRUD().postFromDialogue(link: AppLink.addDriverOrder, payload: {
        'driver_id': box.read(BoxName.driverID),
        'order_id': rideInfo['id'],
        'status': 'Apply'
      });
      await CRUD().post(link: AppLink.updateRides, payload: {
        'id': rideInfo['id'],
        'DriverIsGoingToPassenger': DateTime.now().toString(),
        'status': 'Applied'
      });
      await CRUD().post(
          link: AppLink.updateWaitingRide,
          payload: {'id': rideInfo['id'], 'status': 'Applied'});
      if (AppLink.endPoint.toString() != AppLink.seferCairoServer) {
        CRUD().postFromDialogue(
            link: '${AppLink.endPoint}/driver_order/add.php',
            payload: {
              'driver_id': box.read(BoxName.driverID),
              // box.read(BoxName.driverID).toString(),
              'order_id': rideInfo['id'],
              'status': 'Apply'
            });
        CRUD().post(link: '${AppLink.endPoint}/rides/update.php', payload: {
          'id': rideInfo['id'],
          'DriverIsGoingToPassenger': DateTime.now().toString(),
          'status': 'Applied'
        });
        CRUD().post(
            link:
                "${AppLink.endPoint}/ride/notificationCaptain/updateWaitingTrip.php",
            payload: {'id': rideInfo['id'], 'status': 'Applied'});
      }

      FirebaseMessagesController().sendNotificationToPassengerToken(
          "Accepted Ride".tr,
          'your ride is Accepted'.tr,
          // arguments['DriverList'][9].toString(),
          rideInfo['passengerToken'].toString(),
          // box.read(BoxName.tokenDriver).toString(),
          bodyToPassenger,
          'start.wav');
      Get.back();
      Get.to(() => PassengerLocationMapPage(), arguments: {
        'passengerLocation': rideInfo['start_location'].toString(),
        'passengerDestination': rideInfo['end_location'].toString(),
        'Duration': rideInfo['duration'].toString(),
        'totalCost': rideInfo['price'].toString(),
        'Distance': rideInfo['distance'].toString(),
        'name': rideInfo['first_name'].toString(),
        'phone': rideInfo['phone'].toString(),
        'email': rideInfo['email'].toString(),
        'WalletChecked': rideInfo['payment_method'].toString(),
        'tokenPassenger': rideInfo['passengerToken'].toString(),
        'direction':
            'https://www.google.com/maps/dir/${rideInfo['start_location']}/${rideInfo['end_location']}/',
        'DurationToPassenger': rideInfo['duration'].toString(),
        'rideId': rideInfo['id'].toString(),
        'passengerId': rideInfo['passenger_id'].toString(),
        'driverId': box.read(BoxName.driverID).toString(),
        'durationOfRideValue': rideInfo['duration'].toString(),
        'paymentAmount': rideInfo['price'].toString(),
        'paymentMethod': 'cash'.toString() == //todo fix payment method
                'true'
            ? 'visa'
            : 'cash',
        'isHaveSteps': 'startEnd'.toString(),
        'step0': ''.toString(),
        'step1': ''.toString(),
        'step2': ''.toString(),
        'step3': ''.toString(),
        'step4': ''.toString(),
        'passengerWalletBurc': rideInfo['bruc'].toString(),
        'timeOfOrder': DateTime.now().toString(),
        'totalPassenger': rideInfo['price'].toString(),
        'carType': rideInfo['carType'].toString(),
        'kazan': Get.find<HomeCaptainController>().kazan.toString(),
      });
    } else {
      MyDialog().getDialog(
          "This ride is already taken by another driver.".tr, '', () {
        CRUD().post(
            link: AppLink.deleteAvailableRide, payload: {'id': rideInfo['id']});
        if (AppLink.endPoint.toString() != AppLink.seferCairoServer) {
          CRUD().post(
              link:
                  '${AppLink.endPoint}/ride/notificationCaptain/deleteAvailableRide.php',
              payload: {'id': rideInfo['id']});
        }
        Get.back();
      });
    }
  }
}
