import 'dart:ui';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/services.dart';
import 'package:http/http.dart' as http;
import 'package:dropdown_search/dropdown_search.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:go_router/go_router.dart';
import 'package:google_fonts/google_fonts.dart';
import 'package:intl/intl.dart';
import 'package:nhance_partner/presentation/screens/staff/Enquiry/quotationPopUpAccptReject.dart';
import 'package:nhance_partner/presentation/screens/staff/Enquiry/raise_enq_form.dart';
import 'package:nhance_partner/presentation/screens/staff/Enquiry/tabs/tab.dart';
import 'package:shared_preferences/shared_preferences.dart';

import '../../../../core/config/env.dart';
import '../../../../core/routing/routes.dart';

import '../../../../core/services/api_service.dart';
import 'package:universal_html/html.dart' as html;

import '../../../../data/services/auth_service.dart';
import '../../../../data/utils/Pagination.dart';
import '../../../../data/utils/toastNotification.dart';
import '../../../../data/utils/validators.dart';
import '../../../layouts/main_layout.dart';
import '../../../layouts/responsive_layout.dart';
import '../../../providers/manager_provider.dart';
import '../../../providers/quotation_staff_proivder.dart';
import '../../../providers/userRoleProvider.dart';
import '../../../themes/indicators/customizd_file_upload.dart';
import '../../../themes/indicators/export_btn.dart';
import '../../../themes/indicators/input_field_decoration.dart';
import '../../../themes/indicators/search_field_theme.dart';
import '../../../themes/indicators/text_field_theme.dart';
import '../../../themes/indicators/text_field_theme_inline_editor.dart'
    hide UpperCaseTextFormatter;
import '../../../widgets/custom_Stdate_EnDate_Filter.dart';
import '../assignStaff.dart';

class EnquiryListStaffInlineTST extends ConsumerStatefulWidget {
  const EnquiryListStaffInlineTST({super.key});
  @override
  ConsumerState<EnquiryListStaffInlineTST> createState() => EnquiryStaffState();
}

class EnquiryStaffState extends ConsumerState<EnquiryListStaffInlineTST> {
  int currentPage = 1;
  int itemsPerPage = 10;
  late ApiService apiService;
  dynamic userId;
  dynamic idPrimary;
  dynamic managerId;
  dynamic dashboardKey;
  dynamic SelectedStatus;
  dynamic SelectedStaffId;
  dynamic handlerId;
  String? _token;
  final _formKey = GlobalKey<FormState>();
  Map<String, String?> fieldErrors = {};

  final raiseEnqKey = GlobalKey<RaiseEnqFormState>();

  // List<Map<String, dynamic>> dataVal = [];
  List<Map<String, dynamic>> getStaffData = [];
  List<Map<String, dynamic>> originalData = [];
  List<Map<String, dynamic>> filteredData = [];
  bool isLoading = false;
  dynamic roleId;
  bool _showFilterRow = false;

  Map<int, bool> rowExpanded = {};
  Map<String, TextEditingController> controllers = {};
  List<String> tabHeader = [
    'startDate',
    'endDate',
    'name',
    'email',
    'mobile',
    'code',
    'address',
    'regNo',
    'remarks',
  ];

  Map<int, bool> isEditingRow = {};
  Map<int, Map<String, TextEditingController>> rowControllers = {};

  //---------------------- Enquiry TAB Initializations Starts -------------------------------- //

  List<Map<String, dynamic>> getVehicleTypeData = [];
  List<Map<String, dynamic>> filteredVechicleData = [];

  List<Map<String, dynamic>> getAgentListData = [];
  List<Map<String, dynamic>> filteredAgentData = [];

  List<Map<String, dynamic>> getInsurersData = [];
  List<Map<String, dynamic>> filteredInsurersData = [];

  String? selectedVehicleType;
  String? selectedInsurer;
  String? selectedAgent;
  PlatformFile? docUploadedRCFile;
  PlatformFile? docUploadedIDProof;
  PlatformFile? docUploadedPrevPolicy;

  String? selectedRCFile;
  String? selectedIdProof;
  String? selectedPrevPolicy;

  String? selectedRCFileName;

  String? rcFileUrlFromApi;
  String? idProofFileUrlFromApi;
  String? prevPolicyFileUrlFromApi;

  String? selectedId;

  Map<String, dynamic> dataDetails() {
    final data = {
      "agent_id": ((roleId == 'handler') || (roleId == 'manager'))
          ? selectedAgent
          : userId,
      "name": controllers["name"]?.text,
      "mobile": controllers["mobile"]?.text,
      "email": controllers["email"]?.text,
      "reg_no": controllers["regNo"]?.text,
      "vehicle_type_id": selectedVehicleType,
      "is_data_created_by_handler": roleId == 'handler' ? '1' : '0',
      "is_data_created_by_manager": roleId == 'manager' ? '1' : '0',
      // "insurer_id": selectedInsurer,
      // "rc_file_name": "rc_doc.pdf",
      // "id_proof_file_name": "id_proof.pdf",
      // "previous_policy_file_name": "previous_policy.pdf",
      "remarks": controllers["remarks"]?.text,
      "assigned_to": selectedStaff,
      "insurer_id": selectedInsurer,
      "broker_id": selectedBroker,
      "manager_id": managerId,
      "created_by": userId,
    };

    return data;
  }

  final GlobalKey<DropdownSearchState<Map<String, dynamic>>> dropDownKey =
      GlobalKey<DropdownSearchState<Map<String, dynamic>>>();
  final GlobalKey<DropdownSearchState<Map<String, dynamic>>>
  dropDownKeyInsurer = GlobalKey<DropdownSearchState<Map<String, dynamic>>>();
  final GlobalKey<DropdownSearchState<Map<String, dynamic>>> dropDownKeyAgent =
      GlobalKey<DropdownSearchState<Map<String, dynamic>>>();
  //---------------------- Assign Staff  starts -------------------------------- //

  final GlobalKey<DropdownSearchState<Map<String, dynamic>>>
  dropDownKeyInsurerEnqAsgn =
      GlobalKey<DropdownSearchState<Map<String, dynamic>>>();

  final GlobalKey<DropdownSearchState<Map<String, dynamic>>> dropDownKeyBroker =
      GlobalKey<DropdownSearchState<Map<String, dynamic>>>();
  final GlobalKey<DropdownSearchState<Map<String, dynamic>>>
  dropDownSelectStaffKey =
      GlobalKey<DropdownSearchState<Map<String, dynamic>>>();

  List<Map<String, dynamic>> getStaffDetailsDataEnqAsgn = [];
  List<Map<String, dynamic>> filteredStaffDataEnqAsgn = [];

  String? selectedStaff;
  String? selectedRegNum;
  String? selectedStaffName;
  List<Map<String, dynamic>> getBrokerData = [];
  List<Map<String, dynamic>> filteredBrokerData = [];
  String? selectedBroker;

  //----------------------  Assign Staff  Ends -------------------------------- //
  //---------------------- Enquiry TAB Initializations Ends -------------------------------- //

  @override
  void initState() {
    super.initState();

    apiService = ApiService();

    for (String field in tabHeader) {
      controllers[field] = TextEditingController();
    }
    _initializeToken();

    Future.microtask(() async {
      // final id = ref.read(managerIdProvider);
      roleId = ref.read(userRoleProvider);
      userId = ref.read(userIdProvider);
      managerId = ref.read(managerIdProvider);

      final prefs = await SharedPreferences.getInstance();
      dashboardKey = prefs.getString('dashboardKeyProvider');
      final dashboardStatus = prefs.getString('dashboardStatusProvider');
      final dashboardStaffId = prefs.getString('dashboardStaffIdProvider');

      print('handlerIdENQ - $handlerId');
      print("C72 => r : $roleId | uId: $userId !mID : $managerId ");

      print('dashboardKey - $dashboardKey');
      print('dashboardStatus - $dashboardStatus');
      print('dashboardStaffId - $dashboardStaffId');

      if (managerId != null &&
          dashboardKey != null &&
          dashboardStatus != null &&
          dashboardStaffId != null) {
        print("DASHBOARD STATus-$dashboardStatus -- $dashboardStaffId -");
        SelectedStatus = dashboardStatus;
        SelectedStaffId = dashboardStaffId;
        getStaffList(
          managerId,
          roleId,
          SelectedStatus: dashboardStatus,
          SelectedStaffId: dashboardStaffId,
        );
      } else {
        print('ELSE');
        getStaffList(managerId, roleId);
      }
      if (managerId != null) {
        print('managerId - $managerId');
        getAgentList(managerId);
      }

      final userID = ref.watch(userIdProvider);

      print("managerId - $managerId");
      if (userID != null) {
        print('hansles');
        getStaffDetailsForEnquiryAssignment(userID);
      }
    });

    getVehicleType();
    getInsurers();
    getBroker();
  }

  Future<void> _initializeToken() async {
    _token = await AuthService.getToken();
    print("APISERTOKEN - $_token");
  }

  void refresh() {
    final id = ref.read(managerIdProvider);
    final roleId = ref.read(userRoleProvider);
    final userId = ref.read(userIdProvider);

    print("C82 => r : $roleId | mId: $id | uId: $userId ");
    if (managerId != null) {
      getStaffList(managerId, roleId);
    }
  }

  void filterDateRange() {
    // ✅ Call your API
    getStaffList(
      managerId,
      roleId,
      SelectedStatus: SelectedStatus ?? '',
      SelectedStaffId: SelectedStaffId ?? '',
    );
  }

  Future<void> refrshfilterDateRange() async {
    print('refrshfilterDateRange');
    // setState(() async {
    final prefs = await SharedPreferences.getInstance();

    // ✅ Clear any old data
    await prefs.remove('dashboardKeyProvider');
    await prefs.remove('dashboardStatusProvider');
    await prefs.remove('dashboardStaffIdProvider');
    SelectedStatus = '';
    SelectedStaffId = null;
    controllers['startDate']!.clear();
    controllers['endDate']!.clear();

    controllers['startDate']?.text = '';
    controllers['endDate']?.text = '';
    // Reset the FormField validation
    _formKey.currentState?.reset();
    // });

    final int parsedManagerId = int.tryParse(managerId.toString()) ?? 0;
    print('refrshfilterDateRange 1');
    getStaffList(
      // managerId,
      parsedManagerId,
      roleId,
      SelectedStatus: SelectedStatus ?? '',
      SelectedStaffId: SelectedStaffId ?? '',
    );
    print('refrshfilterDateRange 2');
  }

  Future<void> getInsurers() async {
    print('Insurers called');
    setState(() {
      isLoading = true;
    });

    try {
      final response = await apiService.fetchMasterDropDown('Insurers');

      if (response['status'] == 200) {
        print('getInsurers - ${response['data']}');
        setState(() {
          getInsurersData = List<Map<String, dynamic>>.from(response['data']);
          print('API Data - $getInsurersData');

          filteredInsurersData = List.from(getInsurersData);
          print('originalData - $filteredInsurersData');
        });
      } else {
        getInsurersData = [];
        filteredInsurersData = [];
      }
    } catch (e) {
      print('Exception occurred: $e');
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }

  Future<void> getBroker() async {
    print('getBroker called');
    setState(() {
      isLoading = true;
    });

    try {
      final response = await apiService.fetchMasterDropDown('Broker');

      if (response['status'] == 200) {
        print('getBroker - ${response['data']}');
        setState(() {
          getBrokerData = List<Map<String, dynamic>>.from(response['data']);
          print('API Data - $getBrokerData');

          filteredBrokerData = List.from(getBrokerData);
          print('originalData - $filteredBrokerData');
        });
      } else {
        getBrokerData = [];
        filteredBrokerData = [];
      }
    } catch (e) {
      print('Exception occurred: $e');
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }

  Future<void> getStaffDetailsForEnquiryAssignment(int id) async {
    print('getStaffDetailsForEnquiryAssignment called By handler');
    setState(() {
      isLoading = true;
    });

    try {
      // final response = await apiService.fetchStaffUserList(id, role);
      final response = await apiService.fetchStaffListForEnquiryAssignDropDown(
        managerId,
        id,
        roleId,
      );

      if (response['status'] == 'success') {
        print('getStaffDetailsForEnquiryAssignment - ${response['data']}');
        setState(() {
          getStaffDetailsDataEnqAsgn = List<Map<String, dynamic>>.from(
            response['data'],
          );
          print('API Data - $getStaffDetailsDataEnqAsgn');

          filteredStaffDataEnqAsgn = List.from(getStaffDetailsDataEnqAsgn);
          print('originalData - $filteredStaffDataEnqAsgn');
        });
      } else {
        getStaffDetailsDataEnqAsgn = [];
        filteredStaffDataEnqAsgn = [];
      }
    } catch (e) {
      print('Exception occurred: $e');
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }

  Future<void> getStaffList(
    int managerId,
    role, {
    String fromDate = '',
    String toDate = '',
    String SelectedStatus = '',
    String SelectedStaffId = '',
  }) async {
    print('A72 => Fns called => $managerId | $role');
    setState(() {
      isLoading = true;
    });

    dynamic fromDt;
    dynamic toDt;

    final fromDateVal = controllers['startDate']?.text ?? '';
    final toDateVal = controllers['endDate']?.text ?? '';
    final dateFormat = DateFormat('dd-MM-yyyy');

    if (dashboardKey != 'fromDashboard' &&
        fromDateVal == '' &&
        toDateVal == '') {
      print("ENQ LIST PAGE");

      final today = DateTime.now();
      fromDt = dateFormat.format(today.subtract(Duration(days: 15)));
      toDt = dateFormat.format(today);

      print('Enq FROM TO - $fromDt - $toDt');
    } else {
      fromDt = fromDateVal;
      toDt = toDateVal;
    }

    try {
      final response = await apiService.fetchEnquiryList(
        managerId,
        userId,
        role,
        fromDate: fromDt,
        toDate: toDt,
        selectedStatus: SelectedStatus != null ? SelectedStatus : '',
        selectedStaffId: SelectedStaffId ?? '',
      );

      if (response['status'] == 'success') {
        final data = response['data'];
        final fromDate = response['from_date'] ?? '';
        final toDate = response['to_date'] ?? '';

        print('FromDate : $fromDate');
        print('ToDate : $toDate');

        setState(() {
          controllers['startDate']?.text = fromDate;
          controllers['endDate']?.text = toDate;
          if (data is List) {
            getStaffData = List<Map<String, dynamic>>.from(data);
          } else if (data is Map) {
            getStaffData = [Map<String, dynamic>.from(data)];
          } else {
            getStaffData = [];
          }
          originalData = getStaffData;
          filteredData = List.from(originalData);
        });
      } else {
        getStaffData = [];
        originalData = [];
      }
    } catch (e) {
      print('Exception occurred: $e');
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }

  List<dynamic> get _paginatedData {
    // Sort descending by id first
    final sortedData = [...filteredData]
      ..sort((a, b) => int.parse(b['id']) - int.parse(a['id']));

    if (sortedData.isEmpty) return [];

    // Ensure currentPage is valid
    final maxPage = (sortedData.length / itemsPerPage).ceil();
    final safePage = currentPage.clamp(1, maxPage);

    final startIndex = (safePage - 1) * itemsPerPage;
    final endIndex = (startIndex + itemsPerPage).clamp(0, sortedData.length);

    return sortedData.sublist(startIndex, endIndex);
  }

  void filterData(String query) {
    print("FilterDAta - $query");
    setState(() {
      filteredData = getStaffData.where((item) {
        // final isActiveStatus = item['is_active'] == "1" ? "active" : "inactive";

        return (item['agent_name'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['reg_no'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['insurer_name'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['assigned_to_name'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['insured_name'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['premium_amount'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['payment_mode'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (_formatDate(item['created_on']) ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (_formatDate(item['updated_on']) ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['policy_number'] ?? '-').toLowerCase().contains(
              query.toLowerCase(),
            ) ||
            (item['status'] ?? '-').toLowerCase().contains(query.toLowerCase());
      }).toList();
    });
  }

  final TextEditingController _searchStaffController = TextEditingController();

  String _formatDate(String rawDate) {
    try {
      final dateTime = DateTime.parse(rawDate);
      return DateFormat(
        'dd-MM-yyyy   HH:mm',
      ).format(dateTime); // 24-hour format
    } catch (e) {
      return rawDate; // fallback if parsing fails
    }
  }

  Future<void> handleStaff(
    BuildContext context,
    dynamic data,
    id,
    regNum,
  ) async {
    showDialog(
      context: context,
      builder: (ctx) => AssignStaffDialog(
        enquiryPrimaryId: id,
        regNum: regNum,
        userId: userId,
        onSubmit: (value) {
          debugPrint("New assignY: $value");
          refresh();
        },
      ),
    );
  }

  Future<void> handleProposalAccept(BuildContext context, String id) async {
    final result = showDialog(
      context: context,
      barrierDismissible: true, // allows tapping outside to close
      builder: (ctx) {
        return Dialog(
          shape: RoundedRectangleBorder(
            borderRadius: BorderRadius.circular(26),
          ),
          insetPadding: const EdgeInsets.all(24),
          child: Container(
            width: 500,
            height: 300,
            color: Colors.white,
            // width: MediaQuery.of(context).size.width * 0.4,
            // height: MediaQuery.of(context).size.height * 0.4,
            // width: MediaQuery.of(context).size.width * 0.7,
            // height: MediaQuery.of(context).size.height * 0.8,
            child: QuotationPopUpTab(id: id, onRefresh: refrshfilterDateRange),
          ),
        );
      },
    );

    print("Dialog result: $result");
    ();
  }

  void handleEdit(Map<String, dynamic> item) {
    print("handleEdit");

    final id = int.tryParse(item['id'].toString()) ?? 0;
    idPrimary = item['id'];

    print("handleEdit - $idPrimary");
    setState(() {
      selectedId = idPrimary;
      isEditingRow[id] = true;
    });
    for (final field in tabHeader) {
      // Only set if controller exists
      if (controllers.containsKey(field)) {
        controllers[field]!.text = item[field] != null
            ? item[field].toString()
            : ''; // fallback to empty string
      }
    }

    //dropdowns or IDs
    selectedVehicleType = item['vehicle_type_id'];
    selectedAgent = item['agent_id'];
    managerId = item['manager_id'];
    controllers["regNo"]?.text = item['reg_no'];
    controllers["remarks"]?.text = item['remarks'];

    selectedInsurer = item['insurer_id'];
    selectedStaff = item['assigned_to'];
    setState(() {});

    // setState(() {
    //   isEditingRow[id] = true;
    //   rowControllers[id] = {
    //     'agent_name': TextEditingController(text: item['agent_name'] ?? ''),
    //     'insurer_name': TextEditingController(text: item['insurer_name'] ?? ''),
    //     'reg_no': TextEditingController(text: item['reg_no'] ?? ''),
    //     'premium_amount': TextEditingController(
    //       text: item['premium_amount'] ?? '',
    //     ),
    //     'payment_mode': TextEditingController(text: item['payment_mode'] ?? ''),
    //   };
    // });
  }

  void handleSave(dynamic id) {
    print('SAVE -- $id');
    // final ids = int.tryParse(id.toString()) ?? 0;

    idPrimary = id;

    // final controllers = rowControllers[id];
    // if (controllers == null) return;
    // if (!_validateRequiredFields()) return;
    // setState(() {
    // final index = getStaffData.indexWhere(
    //   (e) => e['id'].toString() == id.toString(),
    // );
    // if (index != -1) {
    //   getStaffData[index] = {
    //     ...getStaffData[index],
    //     'agent_name': controllers['agent_name']?.text,
    //     'insurer_name': controllers['insurer_name']?.text,
    //     'reg_no': controllers['reg_no']?.text,
    //     'premium_amount': controllers['premium_amount']?.text,
    //     'payment_mode': controllers['payment_mode']?.text,
    //   };
    // }
    //
    // if (index != -1) {
    //   print("EDITField - ${getStaffData[index]}");
    //   getStaffData[index] = {
    //     ...getStaffData[index],
    //     'agent_id': selectedAgent,
    //     "name": controllers["name"]?.text,
    //     "mobile": controllers["mobile"]?.text,
    //     "email": controllers["email"]?.text,
    //     "reg_no": controllers["regNo"]?.text,
    //     "vehicle_type_id": selectedVehicleType,
    //   };
    // }

    // isEditingRow[id] = false;
    // rowControllers.remove(id);
    // });
    handleEnqTabSave();
  }

  void handleCancel(int id) {
    print('handleCancel id - $id');

    final bool isNewRow =
        int.tryParse(id.toString()) != null &&
        int.parse(id.toString()) > 1000000000000;

    print('isNewRow - $isNewRow');

    setState(() {
      if (isNewRow) {
        // Check if this is a new unsaved row
        final row = getStaffData.firstWhere(
          (item) => item['id'].toString() == id.toString(),
          orElse: () => {},
        );

        // If policy_number is empty, it's a new row - remove it
        if (row.isNotEmpty
        // (row['policy_number'] == null ||
        //     row['policy_number'] == '' ||
        //     row['policy_number'] == '-')
        ) {
          getStaffData.removeWhere(
            (item) => item['id'].toString() == id.toString(),
          );
          originalData.removeWhere(
            (item) => item['id'].toString() == id.toString(),
          );
          filteredData.removeWhere(
            (item) => item['id'].toString() == id.toString(),
          );
          rowControllers.remove(id);
        }
      }

      // Turn off editing mode
      isEditingRow.remove(id);

      // // Clear idPrimary if it matches
      // if (idPrimary.toString() == id.toString()) {
      //   idPrimary = null;
      // }
    });
  }

  //-------------------------------Assign Logics staff start ---------------------------//

  Widget buildSelectStaffMem(ctx) {
    Map<String, dynamic>? selectedVehicle;
    try {
      selectedVehicle = filteredStaffDataEnqAsgn.firstWhere(
        (item) => item['id'].toString() == selectedStaff,
      );
    } catch (e) {
      selectedVehicle = null; // ✅ fallback
    }

    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Assigned To', style: _tableDataTimeStyle),

        SizedBox(
          height: 30,
          width: MediaQuery.of(context).size.width * 0.08,
          child: DropdownSearch<Map<String, dynamic>>(
            key: dropDownSelectStaffKey,
            // selectedItem: selectedVehicle.isNotEmpty ? selectedVehicle : null,
            selectedItem: selectedVehicle,
            items: (filter, infiniteScrollProps) {
              return filteredStaffDataEnqAsgn;
            },

            itemAsString: (val) => val['name'].toString(),
            compareFn: (item, selectedItem) =>
                item['id'] == selectedItem['id'], // ✅ compare by id
            validator: (val) {
              if (val == null) {
                return "Required"; // ✅ error message
              }
              return null;
            },
            suffixProps: DropdownSuffixProps(
              // make sure the dropdown button is visible
              dropdownButtonProps: DropdownButtonProps(
                isVisible: true,
                padding: EdgeInsets.zero, // remove default padding
                constraints: const BoxConstraints(
                  // shrink icon tap area
                  minWidth: 12,
                  minHeight: 12,
                ),
                iconSize: 15, // smaller icon
                // icon: const Icon(Icons.arrow_drop_down),
              ),
            ),
            decoratorProps: DropDownDecoratorProps(
              decoration:
                  AppInputDecorations.dropdownDecoration(
                    label: "Select Staff Member",
                  ).copyWith(
                    filled: true,
                    fillColor:
                        Colors.white, // 👈 makes the dropdown input white
                    isDense: true,
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5),
                      borderSide: const BorderSide(
                        color: Colors.black,
                        width: 0.1,
                      ),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5),
                      borderSide: const BorderSide(
                        color: Colors.black,
                        width: 0.1,
                      ),
                    ),
                    contentPadding: EdgeInsets.symmetric(
                      horizontal: 8,
                      vertical: 6,
                    ),
                  ),
            ),
            dropdownBuilder: (context, selectedItem) => Align(
              alignment: Alignment.centerLeft,
              child: Text(
                selectedItem != null ? selectedItem['name'].toString() : "",
                style: GoogleFonts.poppins(fontSize: 11, color: Colors.black),
                overflow: TextOverflow.ellipsis,
                maxLines: 1,
                softWrap: false,
              ),
            ),
            popupProps: PopupProps.menu(
              fit: FlexFit.loose,
              constraints: BoxConstraints(maxHeight: 250),
              menuProps: MenuProps(
                backgroundColor:
                    Colors.white, // 👈 sets dropdown background to white
              ),
              showSearchBox: true,
              searchFieldProps: TextFieldProps(
                decoration: InputDecoration(
                  filled: true,
                  fillColor: Colors.white,
                  hintText: "Search Staff ...",
                  hintStyle: GoogleFonts.inter(
                    fontSize: 12,
                    color: Colors.black,
                  ),
                  enabledBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: Colors.white,
                    ), // 👈 Normal border
                  ),
                  focusedBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: Colors.white,
                      width: 1.5,
                    ), // 👈 Focused border
                  ),
                ),
              ),
              // constraints: BoxConstraints(),
              itemBuilder: (context, item, isDisabled, isSelected) {
                return Container(
                  // color: isSelected ? Colors.blue.withOpacity(0.1) : null,
                  padding: const EdgeInsets.symmetric(
                    horizontal: 8,
                    vertical: 3,
                  ),
                  child: Text(
                    item['name'].toString(),
                    style: GoogleFonts.inter(fontSize: 12, color: Colors.black),
                  ),
                );
              },
            ),

            onChanged: (val) {
              if (val != null) {
                print("Selected Staff : ${val['name']}");
                print("Id: ${val['id']}");
                selectedStaffName = val['name'];
                selectedStaff = val['id'];
                // controllers['agentId']?.text = val['agent_code'];
                // agentId = agent['id'];
              }
            },
          ),
        ),
      ],
    );
  }

  Widget buildInsurer(BuildContext context, {fromHeader = true}) {
    Map<String, dynamic>? selectedInsurerd = filteredInsurersData.firstWhere(
      (item) => item['id'].toString() == selectedInsurer,
      orElse: () => {},
    );
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Insurer', style: _tableDataTimeStyle),
        Container(
          height: 30,
          width: fromHeader
              ? MediaQuery.of(context).size.width * 0.1
              : MediaQuery.of(context).size.width * 0.08,
          child: DropdownSearch<Map<String, dynamic>>(
            key: dropDownKeyInsurerEnqAsgn,
            selectedItem: selectedInsurerd.isNotEmpty ? selectedInsurerd : null,
            items: (filter, infiniteScrollProps) {
              return filteredInsurersData;
            },

            itemAsString: (val) => val['name'].toString(), // what to show
            compareFn: (item, selectedItem) =>
                item['id'] == selectedItem['id'], // ✅ compare by id
            validator: (val) {
              if (val == null) {
                return "Required"; // ✅ error message
              }
              return null;
            },
            suffixProps: DropdownSuffixProps(
              // make sure the dropdown button is visible
              dropdownButtonProps: DropdownButtonProps(
                isVisible: true,
                padding: EdgeInsets.zero, // remove default padding
                constraints: const BoxConstraints(
                  // shrink icon tap area
                  minWidth: 12,
                  minHeight: 12,
                ),
                iconSize: 15, // smaller icon
                // icon: const Icon(Icons.arrow_drop_down),
              ),
            ),
            dropdownBuilder: (context, selectedItem) => Align(
              alignment: Alignment.centerLeft,
              child: Text(
                selectedItem != null ? selectedItem['name'].toString() : "",
                style: GoogleFonts.poppins(fontSize: 11, color: Colors.black),
                overflow: TextOverflow.ellipsis,
                maxLines: 1,
                softWrap: false,
              ),
            ),
            decoratorProps: DropDownDecoratorProps(
              decoration:
                  AppInputDecorations.dropdownDecoration(
                    label: "Insurer",
                  ).copyWith(
                    filled: true,
                    fillColor:
                        Colors.white, // 👈 makes the dropdown input white
                    isDense: true,
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5),
                      borderSide: const BorderSide(
                        color: Colors.black,
                        width: 0.1,
                      ),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5),
                      borderSide: const BorderSide(
                        color: Colors.black,
                        width: 0.1,
                      ),
                    ),
                    contentPadding: EdgeInsets.symmetric(
                      horizontal: 8,
                      vertical: 6,
                    ),
                  ),
            ),

            popupProps: PopupProps.menu(
              fit: FlexFit.loose,
              constraints: BoxConstraints(maxHeight: 250),
              menuProps: MenuProps(
                backgroundColor:
                    Colors.white, // 👈 sets dropdown background to white
              ),
              showSearchBox: true,
              searchFieldProps: TextFieldProps(
                decoration: InputDecoration(
                  filled: true,
                  fillColor: Colors.white,
                  hintText: "Search Insurer...",
                  hintStyle: GoogleFonts.inter(
                    fontSize: 12,
                    color: Colors.black,
                  ),
                  enabledBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: Colors.white,
                    ), // 👈 Normal border
                  ),
                  focusedBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: Colors.white,
                      width: 1.5,
                    ), // 👈 Focused border
                  ),
                ),
              ),
              itemBuilder: (context, item, isDisabled, isSelected) {
                return Container(
                  // color: isSelected ? Colors.blue.withOpacity(0.1) : null,
                  padding: const EdgeInsets.symmetric(
                    horizontal: 8,
                    vertical: 3,
                  ),
                  child: Text(
                    item['name'].toString(),
                    style: GoogleFonts.inter(fontSize: 12, color: Colors.black),
                  ),
                );
              },
              // constraints: BoxConstraints(),
            ),

            onChanged: (val) {
              if (val != null) {
                print("Selected Insurer : ${val['name']}");
                print("Id: ${val['id']}");
                selectedInsurer = val['id'];
                // controllers['agentId']?.text = val['agent_code'];
                // agentId = agent['id'];
              }
            },
          ),
        ),
      ],
    );
  }

  Widget buildBroker(BuildContext context) {
    Map<String, dynamic>? selectedBrokers = filteredBrokerData.firstWhere(
      (item) => item['id'].toString() == selectedBroker,
      orElse: () => {},
    );
    return SizedBox(
      height: 30,
      width: MediaQuery.of(context).size.width * 0.07,
      child: DropdownSearch<Map<String, dynamic>>(
        key: dropDownKeyBroker,
        selectedItem: selectedBrokers.isNotEmpty ? selectedBrokers : null,
        items: (filter, infiniteScrollProps) {
          return filteredBrokerData;
        },

        itemAsString: (val) => val['name'].toString(), // what to show
        compareFn: (item, selectedItem) =>
            item['id'] == selectedItem['id'], // ✅ compare by id
        validator: (val) {
          if (val == null) {
            return "Required"; // ✅ error message
          }
          return null;
        },
        suffixProps: DropdownSuffixProps(
          // make sure the dropdown button is visible
          dropdownButtonProps: DropdownButtonProps(
            isVisible: true,
            padding: EdgeInsets.zero, // remove default padding
            constraints: const BoxConstraints(
              // shrink icon tap area
              minWidth: 12,
              minHeight: 12,
            ),
            iconSize: 15, // smaller icon
            // icon: const Icon(Icons.arrow_drop_down),
          ),
        ),
        dropdownBuilder: (context, selectedItem) => Align(
          alignment: Alignment.centerLeft,
          child: Text(
            selectedItem != null ? selectedItem['name'].toString() : "",
            style: GoogleFonts.poppins(fontSize: 11, color: Colors.black),
            overflow: TextOverflow.ellipsis,
            maxLines: 1,
            softWrap: false,
          ),
        ),
        decoratorProps: DropDownDecoratorProps(
          decoration:
              AppInputDecorations.dropdownDecoration(
                label: "Select Broker",
              ).copyWith(
                filled: true,
                fillColor: Colors.white, // 👈 makes the dropdown input white
                isDense: true,
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(5),
                  borderSide: const BorderSide(color: Colors.black, width: 0.1),
                ),
                enabledBorder: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(5),
                  borderSide: const BorderSide(color: Colors.black, width: 0.1),
                ),
                contentPadding: EdgeInsets.symmetric(
                  horizontal: 8,
                  vertical: 6,
                ),
              ),
        ),

        popupProps: PopupProps.menu(
          fit: FlexFit.loose,
          constraints: BoxConstraints(maxHeight: 250),
          menuProps: MenuProps(
            backgroundColor:
                Colors.white, // 👈 sets dropdown background to white
          ),
          showSearchBox: true,
          searchFieldProps: TextFieldProps(
            decoration: InputDecoration(
              filled: true,
              fillColor: Colors.white,
              hintText: "Search Broker...",
              hintStyle: GoogleFonts.inter(fontSize: 12, color: Colors.black),
              enabledBorder: OutlineInputBorder(
                borderSide: BorderSide(color: Colors.white), // 👈 Normal border
              ),
              focusedBorder: OutlineInputBorder(
                borderSide: BorderSide(
                  color: Colors.white,
                  width: 1.5,
                ), // 👈 Focused border
              ),
            ),
          ),

          itemBuilder: (context, item, isDisabled, isSelected) {
            return Container(
              // color: isSelected ? Colors.blue.withOpacity(0.1) : null,
              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3),
              child: Text(
                item['name'].toString(),
                style: GoogleFonts.inter(fontSize: 12, color: Colors.black),
              ),
            );
          },
          // constraints: BoxConstraints(),
        ),

        onChanged: (val) {
          if (val != null) {
            print("Selected Broker : ${val['name']}");
            print("Id: ${val['id']}");
            selectedBroker = val['id'];
            // controllers['agentId']?.text = val['agent_code'];
            // agentId = agent['id'];
          }
        },
      ),
    );
  }

  // -------------------------------Assign Logics staff  end---------------------------//

  //---------------------- Enquiry TAB Logins Starts -------------------------------- //

  Map<String, dynamic> dataEnquiryTabDetails() {
    final data = {
      "agent_id": ((roleId == 'handler') || (roleId == 'manager'))
          ? selectedAgent
          : userId,
      "name": controllers["name"]?.text,
      "mobile": controllers["mobile"]?.text,
      "email": controllers["email"]?.text,
      "reg_no": controllers["regNo"]?.text,
      "vehicle_type_id": selectedVehicleType,
      "is_data_created_by_handler": roleId == 'handler' ? '1' : '0',
      "is_data_created_by_manager": roleId == 'manager' ? '1' : '0',
      // "insurer_id": selectedInsurer,
      // "rc_file_name": "rc_doc.pdf",
      // "id_proof_file_name": "id_proof.pdf",
      // "previous_policy_file_name": "previous_policy.pdf",
      "remarks": controllers["remarks"]?.text,
      "manager_id": managerId,
      "created_by": userId,
    };

    return data;
  }

  Future<void> getVehicleType() async {
    print('getClaimList called');
    setState(() {
      isLoading = true;
    });

    try {
      final response = await apiService.fetchMasterDropDown('vehicleType');

      if (response['status'] == 200) {
        print('getVehicleTypeData - ${response['data']}');
        setState(() {
          getVehicleTypeData = List<Map<String, dynamic>>.from(
            response['data'],
          );
          print('API Data - $getVehicleTypeData');

          filteredVechicleData = List.from(getVehicleTypeData);
          print('originalData - $filteredVechicleData');
        });
      } else {
        getVehicleTypeData = [];
        filteredVechicleData = [];
      }
    } catch (e) {
      print('Exception occurred: $e');
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }

  Future<void> getAgentList(id) async {
    print('getAgentListData called');
    setState(() {
      isLoading = true;
    });

    try {
      final response = await apiService.fetchAgentNameDropDown(id);
      print('getAgentListData called response');
      print('get Agent- ${response['data']}');
      if (response['status'] == 'success') {
        print('get Agent- ${response['data']}');
        setState(() {
          getAgentListData = List<Map<String, dynamic>>.from(response['data']);
          print('API Data - $getAgentListData');

          filteredAgentData = List.from(getAgentListData);
          print('originalAgentData - $filteredAgentData');
        });
      } else {
        getAgentListData = [];
        filteredAgentData = [];
      }
    } catch (e) {
      print('Exception occurred: $e');
    } finally {
      setState(() {
        isLoading = false;
      });
    }
  }

  Widget buildAgentName(BuildContext context, {fromHeader = true}) {
    Map<String, dynamic>? selectedAgntName = filteredAgentData.firstWhere(
      (item) => item['id'].toString() == selectedAgent,
      orElse: () => {},
    );
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Partner', style: _tableDataTimeStyle),
        SizedBox(
          width: MediaQuery.of(context).size.width * 0.08,
          // width: fromHeader
          //     ? MediaQuery.of(context).size.width * 0.11
          //     : MediaQuery.of(context).size.width * 0.08,
          height: 30,
          child: DropdownSearch<Map<String, dynamic>>(
            key: dropDownKeyAgent,
            selectedItem: selectedAgntName.isNotEmpty ? selectedAgntName : null,
            items: (filter, infiniteScrollProps) {
              return filteredAgentData;
            },

            itemAsString: (val) => val['name'].toString(), // what to show
            compareFn: (item, selectedItem) =>
                item['id'] == selectedItem['id'], // ✅ compare by id
            validator: (val) {
              if (val == null) {
                return "Required"; // ✅ error message
              }
              return null;
            },
            suffixProps: DropdownSuffixProps(
              // make sure the dropdown button is visible
              dropdownButtonProps: DropdownButtonProps(
                isVisible: true,
                padding: EdgeInsets.zero, // remove default padding
                constraints: const BoxConstraints(
                  // shrink icon tap area
                  minWidth: 12,
                  minHeight: 12,
                ),
                iconSize: 15, // smaller icon
                // icon: const Icon(Icons.arrow_drop_down),
              ),
            ),
            dropdownBuilder: (context, selectedItem) => Align(
              alignment: Alignment.centerLeft,
              child: Text(
                selectedItem != null
                    ? selectedItem['name'].toString()
                    : "", // ✅ FIXED
                style: GoogleFonts.poppins(fontSize: 11, color: Colors.black),
                overflow: TextOverflow.ellipsis,
                maxLines: 1,
                softWrap: false,
              ),
            ),
            decoratorProps: DropDownDecoratorProps(
              decoration:
                  AppInputDecorations.dropdownDecoration(
                    label: "Partner Name",
                  ).copyWith(
                    filled: true,
                    fillColor:
                        Colors.white, // 👈 makes the dropdown input white
                    isDense: true,
                    border: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5),
                      borderSide: const BorderSide(
                        color: Colors.black,
                        width: 0.1,
                      ),
                    ),
                    enabledBorder: OutlineInputBorder(
                      borderRadius: BorderRadius.circular(5),
                      borderSide: const BorderSide(
                        color: Colors.black,
                        width: 0.1,
                      ),
                    ),
                    contentPadding: EdgeInsets.symmetric(
                      horizontal: 8,
                      vertical: 6,
                    ),
                  ),
            ),

            popupProps: PopupProps.menu(
              fit: FlexFit.loose,
              constraints: BoxConstraints(maxHeight: 250),
              menuProps: MenuProps(
                backgroundColor:
                    Colors.white, // 👈 sets dropdown background to white
              ),
              showSearchBox: true,

              searchFieldProps: TextFieldProps(
                decoration: InputDecoration(
                  filled: true,
                  fillColor: Colors.white,
                  hintText: "Partner Name",
                  hintStyle: GoogleFonts.inter(
                    fontSize: 10,
                    color: Colors.grey,
                  ),
                  enabledBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: Colors.white,
                    ), // 👈 Normal border
                  ),
                  focusedBorder: OutlineInputBorder(
                    borderSide: BorderSide(
                      color: Colors.white,
                      width: 1.5,
                    ), // 👈 Focused border
                  ),
                ),
              ),

              // constraints: BoxConstraints(),
              itemBuilder: (context, item, isDisabled, isSelected) {
                return Container(
                  // color: isSelected ? Colors.blue.withOpacity(0.1) : null,
                  padding: const EdgeInsets.symmetric(
                    horizontal: 8,
                    vertical: 3,
                  ),
                  child: Column(
                    crossAxisAlignment: CrossAxisAlignment.start,
                    mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Text(
                        item['name'].toString(),
                        style: GoogleFonts.inter(
                          fontSize: 12,
                          color: Colors.black,
                        ),
                      ),
                      Text(
                        item['agent_code'].toString(),
                        style: GoogleFonts.inter(
                          fontSize: 11,
                          color: Colors.grey,
                        ),
                      ),
                    ],
                  ),
                );
              },
            ),

            onChanged: (val) {
              if (val != null) {
                print("Selected Partner : ${val['name']}");
                print("Id: ${val['id']}");
                selectedAgent = val['id'];
                // controllers['agentId']?.text = val['agent_code'];
                // agentId = agent['id'];
              }
            },
          ),
        ),
      ],
    );
  }

  Widget buildVehicleNumber(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Vehicle Number', style: _tableDataTimeStyle),
        SizedBox(
          width: MediaQuery.of(context).size.width * 0.08,
          child: ThemedFormInlineField(
            controller: controllers['regNo']!,
            hintText: 'Vehicle Number',
            borderColor: Colors.black,
            isdense: true,
            inputFormatters: [
              UpperCaseTextFormatter(), // 👈 custom formatter for uppercase
              FilteringTextInputFormatter.allow(RegExp(r'[A-Za-z0-9- ]')),
            ],
            validator: (value) => Validators.requiredVechileNum(value, "regNo"),
            widthNone: true,
          ),
        ),
      ],
    );
  }

  Widget buildInsuredName(BuildContext context, {fromHeader = true}) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Insured', style: _tableDataTimeStyle),
        SizedBox(
          width: fromHeader
              ? MediaQuery.of(context).size.width * 0.1
              : MediaQuery.of(context).size.width * 0.08,
          child: ThemedFormInlineField(
            controller: controllers['name']!,
            hintText: 'Insured Name',
            // errorText: fieldErrors['name'],
            borderColor: Colors.black,
            isdense: true,
            validator: (value) => Validators.requiredField(value, "name"),
            widthNone: true,
          ),
        ),
      ],
    );
  }

  Widget buildVehicleType(BuildContext context) {
    // Find the matching map from your list

    Map<String, dynamic>? selectedVehicle = filteredVechicleData.firstWhere(
      (item) => item['id'].toString() == selectedVehicleType,
      orElse: () => {},
    );

    return SizedBox(
      width: MediaQuery.of(context).size.width * 0.07,
      height: 30,
      child: DropdownSearch<Map<String, dynamic>>(
        key: dropDownKey,
        selectedItem: selectedVehicle.isNotEmpty ? selectedVehicle : null,
        items: (filter, infiniteScrollProps) {
          return filteredVechicleData;
        },
        validator: (val) {
          if (val == null) {
            return "Required"; // ✅ error message
          }
          return null;
        },

        itemAsString: (val) => val['vehicle_type'].toString(),
        compareFn: (item, selectedItem) =>
            item['id'] == selectedItem['id'], // ✅ compare by id

        suffixProps: DropdownSuffixProps(
          // make sure the dropdown button is visible
          dropdownButtonProps: DropdownButtonProps(
            isVisible: true,
            padding: EdgeInsets.zero, // remove default padding
            constraints: const BoxConstraints(
              // shrink icon tap area
              minWidth: 12,
              minHeight: 12,
            ),
            iconSize: 15, // smaller icon
            // icon: const Icon(Icons.arrow_drop_down),
          ),
        ),

        dropdownBuilder: (context, selectedItem) => Align(
          alignment: Alignment.centerLeft,
          child: Text(
            selectedItem != null
                ? selectedItem['vehicle_type'].toString()
                : "", // ✅ FIXED
            style: GoogleFonts.poppins(fontSize: 11, color: Colors.black),
            overflow: TextOverflow.ellipsis,
            maxLines: 1,
            softWrap: false,
          ),
        ),
        decoratorProps: DropDownDecoratorProps(
          decoration:
              AppInputDecorations.dropdownDecoration(
                label: "Select Vehicle Type",
              ).copyWith(
                filled: true,
                fillColor: Colors.white, // 👈 makes the dropdown input white
                isDense: true,
                border: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(5),
                  borderSide: const BorderSide(color: Colors.black, width: 0.1),
                ),
                enabledBorder: OutlineInputBorder(
                  borderRadius: BorderRadius.circular(5),
                  borderSide: const BorderSide(color: Colors.black, width: 0.1),
                ),
                contentPadding: EdgeInsets.symmetric(
                  horizontal: 8,
                  vertical: 6,
                ),
              ),
        ),

        popupProps: PopupProps.menu(
          fit: FlexFit.loose,
          constraints: BoxConstraints(maxHeight: 200),
          menuProps: MenuProps(
            backgroundColor:
                Colors.white, // 👈 sets dropdown background to white
          ),
          showSearchBox: true,
          searchFieldProps: TextFieldProps(
            padding: const EdgeInsets.all(1.0),
            decoration: InputDecoration(
              filled: true,
              fillColor: Colors.white,
              hintText: "Search Vehicle Type...",
              hintStyle: GoogleFonts.inter(fontSize: 10, color: Colors.black),
              labelStyle: GoogleFonts.inter(fontSize: 10, color: Colors.black),
              enabledBorder: OutlineInputBorder(
                borderSide: BorderSide(color: Colors.white), // 👈 Normal border
              ),
              isDense: true, // reduces height
              contentPadding: const EdgeInsets.symmetric(
                horizontal: 8,
                vertical: 8, // reduce this value for smaller height
              ),
              focusedBorder: OutlineInputBorder(
                borderSide: BorderSide(
                  color: Colors.white,
                  width: 1.5,
                ), // 👈 Focused border
              ),
            ),
          ),

          // constraints: BoxConstraints(),
          itemBuilder: (context, item, isDisabled, isSelected) {
            return Container(
              // color: isSelected ? Colors.blue.withOpacity(0.1) : null,
              padding: const EdgeInsets.symmetric(horizontal: 8, vertical: 3),
              child: Text(
                item['vehicle_type'].toString(),
                style: GoogleFonts.inter(fontSize: 12, color: Colors.black),
              ),
            );
          },
        ),

        onChanged: (val) {
          if (val != null) {
            print("Selected vehicle_type : ${val['vehicle_type']}");
            print("Id: ${val['id']}");
            selectedVehicleType = val['id'];
            // controllers['agentId']?.text = val['agent_code'];
            // agentId = agent['id'];
          }
        },
      ),
    );
  }

  Widget buildEmail(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Email', style: _tableDataTimeStyle),
        SizedBox(
          width: MediaQuery.of(context).size.width * 0.1,
          child: ThemedFormInlineField(
            controller: controllers['email']!,
            borderColor: Colors.black,
            hintText: 'Email',
            isdense: true,
            validator: (value) => Validators.nonReqemail(value, "email"),
            inputFormatters: [
              FilteringTextInputFormatter.allow(RegExp(r'[a-zA-Z0-9_@.]')),
            ],
            txtwidth: ResponsiveLayout.isMobile(context)
                ? null
                : MediaQuery.of(context).size.width * 0.16,
          ),
        ),
      ],
    );
  }

  Widget buildPhNumber(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Mobile', style: _tableDataTimeStyle),
        SizedBox(
          width: MediaQuery.of(context).size.width * 0.1,
          child: ThemedFormInlineField(
            controller: controllers['mobile']!,
            borderColor: Colors.black,
            hintText: 'Mobile',
            isdense: true,
            validator: (value) => Validators.nonReqphone(value, "phone"),
            inputFormatters: [
              FilteringTextInputFormatter.allow(RegExp(r'[ 0-9]')),
            ],
            txtwidth: ResponsiveLayout.isMobile(context)
                ? null
                : MediaQuery.of(context).size.width * 0.26,
          ),
        ),
      ],
    );
  }

  Widget buildRemarks(BuildContext context) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Text('Remarks', style: _tableDataTimeStyle),
        ThemedFormField(
          // maxLength: 500,
          enableBorderWidth: 0.1,
          hintText: 'Remarks',
          controller: controllers['remarks']!,
          borderColor: Colors.black,
          verticalPad: 10,
          horizonalPad: 10,
          isdense: true,
          // keyboardType: TextInputType.multiline,
          txtwidth: ResponsiveLayout.isMobile(context)
              ? null
              : MediaQuery.of(context).size.width * 0.1,
        ),
      ],
    );
  }

  Widget buildResponsiveUploadField({
    required String label,
    required String? hintText,
    required double? width,
    required void Function(String fileName, dynamic file) onFileSelected,
    bool showDownload = false,
    VoidCallback? onRemove,
    VoidCallback? onDownload,
  }) {
    final isMobile = ResponsiveLayout.isMobile(context);

    final uploadWidget = ThemedUploadField(
      hintText: hintText ?? "Upload Document",
      txtwidth: width,
      // txtwidth: MediaQuery.of(context).size.width * 0.08,
      padVertical: 6,
      padHorizontal: 8,

      // backgroundColor: Color(0xffD9EBE8),
      txtName: label,
      isTxtBtnCase: true,
      onFileSelected: onFileSelected,
    );

    return Column(
      crossAxisAlignment: CrossAxisAlignment.end,
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [uploadWidget],
        ),
      ],
    );
  }

  Widget buildUploadRCDocument(BuildContext context) {
    return SizedBox(
      // width: MediaQuery.of(context).size.width * 0.08,
      child: buildResponsiveUploadField(
        label: "RC",
        width: 60,
        hintText: selectedRCFile,
        onFileSelected: (fileName, file) {
          setState(() {
            docUploadedRCFile = file;
            selectedRCFileName = fileName;
          });
          ToastHelper.showSuccessToast(context, 'File Uploaded Successfully');
        },
        showDownload: docUploadedRCFile != null || rcFileUrlFromApi != null,
        onRemove: () {
          setState(() {
            docUploadedRCFile = null;
            rcFileUrlFromApi = null;
            selectedRCFileName = null;
          });
        },
        onDownload: () => apiService.downloadFile(
          // apiUrl: 'agent/downloadAgentCertificateFile?agent_id=$selectedId',
          apiUrl:
              'enquiry/downloadEnquiryFile?enquiry_id=$selectedId&file_type=rc',

          apiId: selectedId.toString(),

          localFile: docUploadedRCFile,
          fileName: 'RC',
        ),
      ),
    );
  }

  Widget buildUploadIDDocument(BuildContext context) {
    return SizedBox(
      // width: MediaQuery.of(context).size.width * 0.08,
      child: buildResponsiveUploadField(
        label: "ID Proof",
        width: 80,
        hintText: selectedIdProof,
        onFileSelected: (fileName, file) {
          setState(() {
            docUploadedIDProof = file;
            // selectedFileNames = fileName;
          });

          ToastHelper.showSuccessToast(context, 'File Uploaded Successfully');
        },
        showDownload:
            docUploadedIDProof != null || idProofFileUrlFromApi != null,
        onRemove: () {
          setState(() {
            docUploadedIDProof = null;
            idProofFileUrlFromApi = null;
            // selectedFileNames = null;
          });
        },
        onDownload: () => apiService.downloadFile(
          // apiUrl: 'agent/downloadAgentCertificateFile?agent_id=$selectedId',
          apiUrl:
              'enquiry/downloadEnquiryFile?enquiry_id=$selectedId&file_type=id_proof',

          apiId: selectedId.toString(),
          localFile: docUploadedIDProof,
          fileName: 'Id_Proof',
        ),
      ),
    );
  }

  Widget buildUploadPolicyDocument(BuildContext context) {
    return SizedBox(
      // width: MediaQuery.of(context).size.width * 0.08,
      child: buildResponsiveUploadField(
        width: 100,
        label: "PrevPolicy",
        hintText: selectedPrevPolicy,
        onFileSelected: (fileName, file) {
          setState(() {
            docUploadedPrevPolicy = file;
            // selectedFileNames = fileName;
          });
          ToastHelper.showSuccessToast(context, 'File Uploaded Successfully');
        },
        showDownload:
            docUploadedPrevPolicy != null || prevPolicyFileUrlFromApi != null,
        onRemove: () {
          setState(() {
            docUploadedPrevPolicy = null;
            prevPolicyFileUrlFromApi = null;
            // selectedFileNames = null;
          });
        },
        onDownload: () => apiService.downloadFile(
          // apiUrl: 'agent/downloadAgentCertificateFile?agent_id=$selectedId',
          apiUrl:
              'enquiry/downloadEnquiryFile?enquiry_id=$selectedId&file_type=previous_policy',

          apiId: selectedId.toString(),
          localFile: docUploadedPrevPolicy,
          fileName: 'Previous_Policy',
        ),
      ),
    );
  }

  Widget buildDocRC(BuildContext context, selectedEnquiryId) {
    return SizedBox(
      width: MediaQuery.of(context).size.width * 0.16,
      child: InkWell(
        onTap: () {
          print("Upload $selectedEnquiryId");
          final selectedId = selectedEnquiryId;
          // final path =
          //     'agent/downloadAgentIncentiveFile?id=$selectedId';
          final path =
              'enquiry/downloadEnquiryFile?enquiry_id=$selectedId&file_type=rc';
          print("Uploadpath $path");
          apiService.getPdfDownload(path, selectedId);
        },
        child: Container(
          padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 6),
          decoration: BoxDecoration(
            borderRadius: BorderRadius.circular(5),
            color: const Color(0xFF425B5B),
          ),
          child: Row(
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            children: [
              Tooltip(
                message: 'Download RC',
                child: Text(
                  "RC",
                  style: GoogleFonts.inter(
                    fontSize: 12,
                    fontWeight: FontWeight.w500,
                    color: Colors.white,
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Widget buildDocIdProof(BuildContext context, selectedEnquiryId) {
    return InkWell(
      onTap: () {
        print("Upload $selectedEnquiryId");
        final selectedId = selectedEnquiryId;
        // final path =
        //     'agent/downloadAgentIncentiveFile?id=$selectedId';
        final path =
            'enquiry/downloadEnquiryFile?enquiry_id=$selectedId&file_type=id_proof';
        print("Uploadpath $path");
        apiService.getPdfDownload(path, selectedId);
      },
      child: Container(
        padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 6),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(5),
          color: const Color(0xFF425B5B),
        ),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Tooltip(
              message: 'Download ID Proof',
              child: Text(
                "ID Proof",
                style: GoogleFonts.inter(
                  fontSize: 12,
                  fontWeight: FontWeight.w500,
                  color: Colors.white,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget buildDocPrevPolicy(BuildContext context, selectedEnquiryId) {
    return InkWell(
      onTap: () {
        print("QD597 Upload $selectedEnquiryId");
        final selectedId = selectedEnquiryId;
        // final path =
        //     'agent/downloadAgentIncentiveFile?id=$selectedId';
        final path =
            'enquiry/downloadEnquiryFile?enquiry_id=$selectedId&file_type=previous_policy';

        print("Uploadpath $path");
        apiService.getPdfDownload(path, selectedId);
      },
      child: Container(
        padding: const EdgeInsets.symmetric(vertical: 4, horizontal: 6),
        decoration: BoxDecoration(
          borderRadius: BorderRadius.circular(5),
          color: const Color(0xFF425B5B),
        ),
        child: Row(
          mainAxisAlignment: MainAxisAlignment.spaceBetween,
          children: [
            Tooltip(
              message: 'Download Previous Policy',
              child: Text(
                "Prev Policy",
                style: GoogleFonts.inter(
                  fontSize: 12,
                  fontWeight: FontWeight.w500,
                  color: Colors.white,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  // Update validation method to set errors
  bool _validateRequiredFields() {
    setState(() {
      fieldErrors.clear(); // Clear previous errors

      // Validate Partner/Agent
      if (selectedAgent == null || selectedAgent == '') {
        fieldErrors['agent'] = 'Partner is required';
      }

      // Validate Insured Name
      if (controllers['name']?.text.trim().isEmpty ?? true) {
        fieldErrors['name'] = 'Insured Name is required';
      }

      // Validate Vehicle Number
      if (controllers['regNo']?.text.trim().isEmpty ?? true) {
        fieldErrors['regNo'] = 'Vehicle Number is required';
      }

      // Validate Vehicle Type
      if (selectedVehicleType == null || selectedVehicleType == '') {
        fieldErrors['vehicleType'] = 'Vehicle Type is required';
      }

      // Validate email format if provided
      final email = controllers['email']?.text.trim() ?? '';
      if (email.isNotEmpty) {
        final emailRegex = RegExp(r'^[\w-\.]+@([\w-]+\.)+[\w-]{2,4}$');
        if (!emailRegex.hasMatch(email)) {
          fieldErrors['email'] = 'Invalid email format';
        }
      }

      // Validate mobile number if provided
      final mobile = controllers['mobile']?.text.trim() ?? '';
      if (mobile.isNotEmpty) {
        final cleanMobile = mobile.replaceAll(' ', '');
        if (cleanMobile.length < 10) {
          fieldErrors['mobile'] = 'Must be at least 10 digits';
        }
      }
    });

    return true;

    return fieldErrors.isEmpty;
  }

  Future<void> handleEnqTabSave() async {
    if (!_validateRequiredFields()) return;

    // setState(() {
    //   isSaving = true; // start saving
    // });

    final dataSet = dataDetails();

    try {
      await createUserData(dataSet); // API call

      // ToastHelper.showInfoToast(context, "Enquiry saved successfully");
    } catch (e) {
      showDialog(
        context: context,
        builder: (_) => AlertDialog(
          title: const Text('Error'),
          content: Text(e.toString()),
          actions: [
            TextButton(
              onPressed: () => Navigator.of(context).pop(),
              child: const Text('OK'),
            ),
          ],
        ),
      );
    } finally {
      // setState(() => isSaving = false); // re-enable button after save
    }
  }

  Future<void> attachFiles(http.MultipartRequest request) async {
    Future<void> addFileOrKeepName(
      PlatformFile? file,
      String? apiFileName,
      String fieldName,
    ) async {
      if (file != null) {
        // User uploaded a new file → send as multipart
        if (file.bytes != null) {
          request.files.add(
            http.MultipartFile.fromBytes(
              fieldName,
              file.bytes!,
              filename: file.name,
            ),
          );
        } else if (file.path != null) {
          request.files.add(
            await http.MultipartFile.fromPath(
              fieldName,
              file.path!,
              filename: file.name,
            ),
          );
        }
        print("📎 Attached new file → $fieldName");
      } else if (apiFileName != null && apiFileName.isNotEmpty) {
        // No new upload → tell backend to keep old file
        request.fields[fieldName] = apiFileName;
        print("🔗 Kept old file → $fieldName = $apiFileName");
      } else {
        // Nothing at all
        request.fields[fieldName] = "";
      }
    }

    await addFileOrKeepName(
      docUploadedRCFile,
      rcFileUrlFromApi,
      'rc_file_name',
    );
    await addFileOrKeepName(
      docUploadedIDProof,
      idProofFileUrlFromApi,
      'id_proof_file_name',
    );
    await addFileOrKeepName(
      docUploadedPrevPolicy,
      prevPolicyFileUrlFromApi,
      'previous_policy_file_name',
    );
  }

  List<Widget> _buildPopupDownload(BuildContext context, selectId) {
    bool isMobile = ResponsiveLayout.isMobile(context);
    return [
      // editing
      //     ?
      Container(
        // color: Colors.red.shade50,
        padding: EdgeInsets.only(top: 10),
        child: Row(
          crossAxisAlignment: CrossAxisAlignment.center,

          children: [
            buildUploadRCDocument(context),
            SizedBox(width: 3),
            buildUploadIDDocument(context),
            SizedBox(width: 3),
            buildUploadPolicyDocument(context),
          ],
        ),
      ),
      //     : Row(
      //   children: [
      //     buildDocRC(context, selectId),
      //     SizedBox(width: 3),
      //     buildDocIdProof(context, selectId),
      //     SizedBox(width: 3),
      //     buildDocPrevPolicy(context, selectId),
      //   ],
      // ),
    ];
  }

  Widget _buildSubRow(context, selectId, id) {
    return Wrap(
      spacing: 12,
      runSpacing: 12,
      children: [
        buildAgentName(context, fromHeader: false),
        buildSelectStaffMem(context),

        buildInsurer(context),
        buildInsuredName(context),
        buildVehicleNumber(context),

        buildEmail(context),
        buildPhNumber(context),
        buildRemarks(context),

        Padding(
          padding: const EdgeInsets.only(top: 8.0),
          child: Builder(
            builder: (buttonContext) => Material(
              color: Color(0xFFFFFCF2),
              child: InkWell(
                hoverColor: const Color(0xFFFFFCF2),
                // hoverColor: const Color(0xFFEAF6F4),
                onTap: () async {
                  // ✅ Get overlay and button position RELATIVE to InkWell
                  final RenderBox button =
                      buttonContext.findRenderObject() as RenderBox;
                  final RenderBox overlay =
                      Overlay.of(buttonContext).context.findRenderObject()
                          as RenderBox;

                  final Offset position = button.localToGlobal(
                    Offset.zero,
                    ancestor: overlay,
                  );

                  await showMenu(
                    context: buttonContext,
                    position: RelativeRect.fromLTRB(
                      position.dx,
                      position.dy + button.size.height,
                      overlay.size.width,
                      0,
                    ),
                    items: [
                      PopupMenuItem(
                        child: Column(
                          mainAxisSize: MainAxisSize.min,
                          children: _buildPopupDownload(
                            buttonContext,
                            selectId,
                          ),
                        ),
                      ),
                    ],
                    // color: Colors.white,
                    color: Color(0xFFFFFCF2),
                  );
                },
                child: Tooltip(
                  message: 'Click To Upload Documents',

                  waitDuration: const Duration(milliseconds: 500),
                  showDuration: const Duration(seconds: 2),
                  child: Icon(
                    Icons.upload_file,
                    // editing ? Icons.upload_file : Icons.download_for_offline,
                    // color: editing ? Colors.blue : Colors.green,
                    size: 28,
                  ),
                ),
              ),
            ),
          ),
        ),
        Padding(
          padding: const EdgeInsets.only(top: 8.0),
          child: IconButton(
            tooltip: 'Save',
            padding: EdgeInsets.zero,
            constraints: const BoxConstraints(minWidth: 24, minHeight: 24),
            icon: const Icon(
              Icons.check,
              color: Colors.green,
              size: 28, // smaller icon
            ),
            splashRadius: 14, // ripple radius
            onPressed: () => {
              setState(() {
                rowExpanded[id] = !(rowExpanded[id] ?? false);
              }),
              handleSave(selectId),
            },
          ),
        ),
      ],
    );
  }

  Widget _buildSubRow2(BuildContext context, String selectId) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,

      children: [
        Row(
          children: [
            Expanded(child: buildAgentName(context)),
            Expanded(child: buildVehicleNumber(context)),
          ],
        ),
        const SizedBox(height: 12),
        Row(
          children: [
            Expanded(child: buildEmail(context)),
            Expanded(child: buildPhNumber(context)),
          ],
        ),
        const SizedBox(height: 12),
        Row(
          children: [
            Expanded(child: buildRemarks(context)),
            SizedBox(
              width: 50,
              child: Builder(
                builder: (buttonContext) => Material(
                  color: Color(0xFFFFFCF2),
                  child: InkWell(
                    hoverColor: const Color(0xFFFFFCF2),
                    // hoverColor: const Color(0xFFEAF6F4),
                    onTap: () async {
                      // ✅ Get overlay and button position RELATIVE to InkWell
                      final RenderBox button =
                          buttonContext.findRenderObject() as RenderBox;
                      final RenderBox overlay =
                          Overlay.of(buttonContext).context.findRenderObject()
                              as RenderBox;

                      final Offset position = button.localToGlobal(
                        Offset.zero,
                        ancestor: overlay,
                      );

                      await showMenu(
                        context: buttonContext,
                        position: RelativeRect.fromLTRB(
                          position.dx,
                          position.dy + button.size.height,
                          overlay.size.width,
                          0,
                        ),
                        items: [
                          PopupMenuItem(
                            child: Column(
                              mainAxisSize: MainAxisSize.min,
                              children: _buildPopupDownload(
                                buttonContext,
                                selectId,
                              ),
                            ),
                          ),
                        ],
                        // color: Colors.white,
                        color: Color(0xFFFFFCF2),
                      );
                    },
                    child: Tooltip(
                      message: 'Click To Upload Documents',

                      waitDuration: const Duration(milliseconds: 500),
                      showDuration: const Duration(seconds: 2),
                      child: Icon(
                        Icons.upload_file,
                        // editing ? Icons.upload_file : Icons.download_for_offline,
                        // color: editing ? Colors.blue : Colors.green,
                        size: 22,
                      ),
                    ),
                  ),
                ),
              ),
            ),
          ],
        ),
      ],
    );
  }

  Future<void> createUserData(Map<String, dynamic> userData) async {
    final bool isNewRow =
        idPrimary != null &&
        int.tryParse(idPrimary.toString()) != null &&
        int.parse(idPrimary.toString()) > 1000000000000;

    final bool isUpdating =
        idPrimary != null && idPrimary != 'null' && !isNewRow;

    print('isNewRow: $isNewRow, isUpdating: $isUpdating');

    // final bool isUpdating = idPrimary != 'null';
    final id = idPrimary;
    print('UPDId- $id');

    // final bool isUpdating = false;
    final uri = Uri.parse(
      isUpdating
          ? '${Env.apiUrl}enquiry/updateEnquiry'
          : '${Env.apiUrl}enquiry/createEnquiry',
    );
    if (_token == null) {
      throw Exception('Token not found. Please log in.');
    }

    // Use MultipartRequest (POST only)
    final request = http.MultipartRequest('POST', uri);
    request.headers['Authorization'] = 'Bearer $_token';
    request.headers['app-signature'] = Env.App_Signature;

    // If updating, spoof the method Laravel-style
    if (isUpdating) {
      request.fields['id'] = id!;
      request.fields['updated_by'] = userId!.toString();
    } else {
      request.fields['created_by'] = userId!.toString();
    }

    print("USerDAta - $userData");

    // userData.forEach((key, value) {
    //   request.fields[key] = value.toString();
    //   print("✅ Encoded travel_details2: ${request.fields[key]}");
    // });
    await attachFiles(request);
    userData.forEach((key, value) {
      if (key != 'rc_file_name' && key != 'id_proof_file_name') {
        request.fields[key] = value.toString();
        print("✅ Encoded $key: ${request.fields[key]}");
      } else {
        print('Something Missing..');
      }
    });

    // attach files

    // request.fields['agent_id'] = selectedId.toString();

    print(" Sending request with fields: ${request.fields}");

    try {
      final streamedResponse = await request.send();
      final response = await http.Response.fromStream(streamedResponse);
      print("Response status: ${response.statusCode}");
      print("Response body: ${response.body}");

      if (response.statusCode == 200 || response.statusCode == 201) {
        // dispose();
        print("✅ Enquiry submitted successfully!");
        ToastHelper.showSuccessToast(context, 'Saved Enquiry');
        print("Response: ${response.body}");
        // Clear the temporary ID
        idPrimary = null;
        refrshfilterDateRange();
        // getStaffList(managerId, roleId);
        // setState(() => isSaving = false);
      } else if (response.statusCode == 403) {
        await apiService.clearLocalStorageAndRedirect();
      } else {
        print("❌ Submission failed. Status: ${response.statusCode}");
        print("Body: ${response.body}");

        // setState(() => isSaving = false);
        showDialog(
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              title: Text("Enquiry Creation Failed"),
              content: Text(
                "There was a problem in creating enquiry. Please try again.",
              ),
              actions: [
                TextButton(
                  child: Text("OK"),
                  onPressed: () {
                    Navigator.of(context).pop();
                  },
                ),
              ],
            );
          },
        );
      }
    } catch (e) {
      print("🔥 Error submitting user: $e");
    }
  }

  //---------------------- Enquiry TAB Logins End -------------------------------- //
  @override
  Widget build(BuildContext context) {
    return MainLayout(
      title: "Enquiries",
      body: Container(
        // color: Colors.yellow.shade50,
        // color: Color(0xFFFCFCFC),
        width: MediaQuery.of(context).size.width,
        padding: EdgeInsets.all(3.0),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          mainAxisAlignment: MainAxisAlignment.start,
          children: [
            if (roleId != 'staff') ...[
              RaiseEnqForm(
                key: raiseEnqKey,
                onSubmit: (dataSet) async {
                  try {
                    await createUserData(dataSet); // <-- API call here
                    print("Enquiry saved successfully");
                    // RESET FORM
                    raiseEnqKey.currentState?.resetFormFields();
                    getStaffDetailsForEnquiryAssignment(userId);
                  } catch (e) {
                    showDialog(
                      context: context,
                      builder: (_) => AlertDialog(
                        title: const Text('Error'),
                        content: Text(e.toString()),
                        actions: [
                          TextButton(
                            onPressed: () => Navigator.of(context).pop(),
                            child: const Text('OK'),
                          ),
                        ],
                      ),
                    );
                  }
                },
              ),
            ],

            // SizedBox(height: 5),
            ResponsiveLayout.isMobile(context)
                ? Container(
                    height: MediaQuery.of(context).size.height * 0.69,
                    child: SingleChildScrollView(
                      child: Padding(
                        padding: EdgeInsets.all(2),
                        child: _buildContent(context),
                      ),
                    ),
                  )
                : Expanded(
                    child: Container(
                      width: MediaQuery.of(context).size.width,
                      // padding: EdgeInsets.symmetric(
                      //   horizontal: 8.0,
                      //   vertical: 2.0,
                      // ),
                      child: _buildContent(context),
                    ),
                  ),

            Container(
              // height: 20,
              width: MediaQuery.of(context).size.width,
              // color: Colors.green.shade50,
              child: PaginationControls(
                currentPage: currentPage,
                itemsPerPage: itemsPerPage,
                // totalItems: dataVal.length,
                totalItems: filteredData.length,
                // activeColor: layoutColor, // your theme color
                onPageChanged: (page) {
                  setState(() {
                    currentPage = page;
                  });
                },
                onItemsPerPageChanged: (items) {
                  setState(() {
                    itemsPerPage = items;
                    currentPage = 1;
                  });
                },
              ),
            ),
          ],
        ),
      ),
    );
  }

  Future<void> buildStatusActions(BuildContext context, status, id) async {
    print("Actionsstatus - $status -$id");
    dynamic val;
    if (status == 'Awaiting Proposal' || status == 'Proposal Created') {
      val = '';
    } else {
      val = 'Policy';
    }

    final result = await showDialog(
      context: context,
      barrierDismissible:
          false, // optional - prevents closing by tapping outside
      builder: (context) => TabEnquiryStaffList(showKey: val),
    );

    // ✅ Code here runs *after* the dialog is closed
    print("Dialog closed");
    print("Dialog result: $result");
    refrshfilterDateRange();
  }

  Widget _buildContent(BuildContext context) {
    final isDesktop = !ResponsiveLayout.isMobile(context);
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      children: [
        Container(
          // height: 40,
          // color: Colors.pink,
          child: Row(
            crossAxisAlignment: CrossAxisAlignment.start,
            mainAxisAlignment: MainAxisAlignment.start,
            children: [
              Container(
                // height: 30,
                // width: MediaQuery.of(context).size.width,
                child: GestureDetector(
                  onTap: () {
                    context.go(AppRoutes.dashboard);
                  },
                  child: Row(
                    // crossAxisAlignment: CrossAxisAlignment.center,
                    // mainAxisAlignment: MainAxisAlignment.start,
                    children: [
                      Tooltip(
                        message: 'Back',
                        child: IconButton(
                          icon: const Icon(Icons.arrow_left_sharp, size: 25),
                          onPressed: () async {
                            context.go(AppRoutes.dashboard);
                            final prefs = await SharedPreferences.getInstance();
                            await prefs.remove('dashboardKeyProvider');
                            await prefs.remove('dashboardStatusProvider');
                            await prefs.remove('dashboardStaffIdProvider');
                          },
                          splashRadius: 18,
                          padding: const EdgeInsets.all(4),
                          hoverColor: Colors.black12,
                          constraints: const BoxConstraints(),
                        ),
                      ),
                      const SizedBox(width: 5), // spacing between icon and text
                      Text(
                        "Enquiries",
                        style: TextStyle(
                          fontSize: 18,
                          fontWeight: FontWeight.w600,
                        ),
                      ),
                    ],
                  ),
                ),
              ),
              Spacer(),

              IconButton(
                icon: Icon(
                  _showFilterRow
                      ? Icons.close_fullscreen
                      : Icons.filter_alt_outlined,
                ),
                iconSize: 20,
                tooltip: _showFilterRow ? 'Hide Filters' : 'Show Filters',
                onPressed: () {
                  setState(() {
                    _showFilterRow = !_showFilterRow;
                  });
                },
              ),
              if (_showFilterRow) ...[
                DateFilterRow(
                  key: ValueKey(SelectedStatus ?? ''),
                  role: roleId,
                  id: userId,
                  selectedStatusVal: SelectedStatus,
                  onFilterStaff: (val) {
                    print('Selected Filterd STAFF Id - $val');
                    SelectedStaffId = val;
                  },
                  selectedStaffId: SelectedStaffId,
                  startController: controllers['startDate']!,
                  endController: controllers['endDate']!,
                  onStatusChanged: (val) {
                    SelectedStatus = val; // update parent
                  },
                  formKey: _formKey,
                  isMobile: ResponsiveLayout.isMobile(context),
                  onFilter: () {
                    // call your filter logic
                    filterDateRange();
                  },
                  onRefresh: () {
                    // call your refresh logic
                    refrshfilterDateRange();
                  },
                ),
              ],

              // ResponsiveLayout.isMobile(context)
              //     ? Spacer()
              //     :
              // SizedBox(width: 10),
              ThemedSearchField(
                hintText: 'Search',
                // backgroundColor: Color(0xFFF6F8F8),
                backgroundColor: Colors.white,
                onChanged: filterData,
                txtHeight: 35,
                controller: _searchStaffController,
                txtwidth: ResponsiveLayout.isMobile(context)
                    ? MediaQuery.of(context).size.width * 0.7
                    : MediaQuery.of(context).size.width * 0.13,
              ),
              SizedBox(width: 10),
              ExportBtn(
                sheetName: "Enquiry",
                fileName: "Enquiry_list",
                data: filteredData,
                txt: !ResponsiveLayout.isMobile(context) ? true : false,
                displayHeaders: [
                  "Received Date & Time",
                  "Partner",
                  "Assigned To",
                  "Insurer",
                  "Vehicle.No.",
                  "Insured Name",
                  "Assigned Date & Time",
                  "Premium",
                  "Payment Mode",
                  "Policy Number",
                  "Status",
                ],
                keys: [
                  "created_on",
                  "agent_name",
                  "assigned_to_name",
                  "insurer_name",
                  "reg_no",
                  "insured_name",
                  "updated_on",
                  "premium_amount",
                  "payment_mode",
                  "policy_number",
                  "status",
                ],
              ),
              // if (roleId != 'staff') ...[
              //   SizedBox(width: 10),
              //   GestureDetector(
              //     onTap: () async {
              //       // final prefs = await SharedPreferences.getInstance();
              //       //
              //       // await prefs.remove('enqAgentDataId');
              //       // ref.read(enquiryIdProvider.notifier).state = null;
              //       // context.go(AppRoutes.tabEnquiry);
              //       // print('Export');
              //
              //       // Generate a unique ID for the new row
              //       final newId = DateTime.now().millisecondsSinceEpoch;
              //
              //       // Clear all existing form controllers
              //       for (String field in tabHeader) {
              //         controllers[field]?.clear();
              //       }
              //
              //       // Reset dropdown selections
              //       selectedVehicleType = null;
              //       selectedAgent = null;
              //       selectedInsurer = null;
              //
              //       // Reset file uploads
              //       docUploadedRCFile = null;
              //       docUploadedIDProof = null;
              //       docUploadedPrevPolicy = null;
              //       selectedRCFile = null;
              //       selectedIdProof = null;
              //       selectedPrevPolicy = null;
              //
              //       setState(() {
              //         // Create a new empty row data
              //         final newRow = {
              //           'id': newId
              //               .toString(), // Keep as String for consistency
              //           'created_on': '',
              //           'agent_name': '',
              //           'agent_id': '',
              //           'assigned_to_name': '',
              //           'insurer_name': '',
              //           'insured_name': '',
              //           'reg_no': '',
              //           'vehicle_type': '',
              //           'vehicle_type_id': '',
              //           'email': '',
              //           'mobile': '',
              //           'remarks': '',
              //           'updated_on': '',
              //           'premium_amount': '',
              //           'payment_mode': '',
              //           'policy_number': '',
              //           'status': '',
              //         };
              //
              //         // Insert at the beginning of ALL lists
              //         getStaffData.insert(0, newRow);
              //         originalData.insert(0, newRow);
              //         filteredData.insert(0, newRow);
              //
              //         // Set to editing mode immediately
              //         isEditingRow[newId] = true;
              //
              //         // Store the ID as string
              //         idPrimary = newId.toString();
              //         selectedId = newId.toString();
              //
              //         // Reset to first page to see the new row
              //         currentPage = 1;
              //       });
              //     },
              //     child: Container(
              //       padding: EdgeInsets.all(8.0),
              //       decoration: BoxDecoration(
              //         color: Color(0xFF425B5B),
              //         borderRadius: BorderRadius.circular(8.0),
              //       ),
              //       child: Row(
              //         mainAxisSize: MainAxisSize.min,
              //         children: [
              //           Tooltip(
              //             message: 'Raise Enquiry',
              //             child: Icon(Icons.add, color: Colors.white, size: 15),
              //           ),
              //         ],
              //       ),
              //     ),
              //   ),
              // ],
            ],
          ),
        ),

        // SizedBox(height: 10),

        // Container(
        //   decoration: BoxDecoration(
        //     color: const Color(0xFFEDF6F5),
        //     borderRadius: BorderRadius.circular(6),
        //   ),
        //   padding: const EdgeInsets.symmetric(vertical: 12, horizontal: 16),
        //   child: Row(
        //     children: const [
        //       Expanded(flex: 1, child: Text('S.No', style: _headerStyle)),
        //       Expanded(
        //         flex: 2,
        //         child: Text('Received Date', style: _headerStyle),
        //       ),
        //       Expanded(flex: 2, child: Text('Partner *', style: _headerStyle)),
        //       Expanded(
        //         flex: 2,
        //         child: Text('Assigned To *', style: _headerStyle),
        //       ),
        //       Expanded(flex: 2, child: Text('Broker *', style: _headerStyle)),
        //       Expanded(flex: 3, child: Text('Insurer *', style: _headerStyle)),
        //       Expanded(
        //         flex: 3,
        //         child: Text('Insured Name *', style: _headerStyle),
        //       ),
        //       Expanded(
        //         flex: 2,
        //         child: Text('Vehicle No *', style: _headerStyle),
        //       ),
        //       Expanded(
        //         flex: 2,
        //         child: Text('Vehicle Type *', style: _headerStyle),
        //       ),
        //       Expanded(flex: 2, child: Text('Email', style: _headerStyle)),
        //       Expanded(flex: 2, child: Text('Mobile', style: _headerStyle)),
        //       Expanded(flex: 2, child: Text('Documents', style: _headerStyle)),
        //       Expanded(flex: 2, child: Text('Remarks', style: _headerStyle)),
        //       Expanded(
        //         flex: 2,
        //         child: Text('Assigned Date', style: _headerStyle),
        //       ),
        //       Expanded(flex: 2, child: Text('Premium', style: _headerStyle)),
        //       Expanded(
        //         flex: 2,
        //         child: Text('Payment Mode', style: _headerStyle),
        //       ),
        //       Expanded(
        //         flex: 2,
        //         child: Text('Policy Number', style: _headerStyle),
        //       ),
        //       Expanded(flex: 2, child: Text('Status', style: _headerStyle)),
        //       Expanded(flex: 1, child: Text('Action', style: _headerStyle)),
        //     ],
        //   ),
        // ),
        Container(
          width: double.infinity,
          decoration: BoxDecoration(
            color: Colors.white,
            boxShadow: [
              BoxShadow(
                color: Colors.black.withOpacity(0.08),
                blurRadius: 8,
                spreadRadius: 1,
                offset: const Offset(0, 2), // soft drop shadow
              ),
            ],
          ),
          // color: Colors.white,

          // color: Color(0xFFE8F5F3),
          // color: Color(0xFFE8F5F3),
          child: _buildTableHeader(isDesktop),
        ),
        ResponsiveLayout.isMobile(context)
            ? _buildDataTable(context)
            : Expanded(
                child: Container(
                  decoration: BoxDecoration(
                    color: Colors.white,
                    border: Border.all(color: Colors.grey, width: 0.1),
                    boxShadow: [
                      BoxShadow(
                        color: Colors.black.withOpacity(0.08),
                        blurRadius: 8,
                        spreadRadius: 1,
                        offset: const Offset(0, 2), // soft drop shadow
                      ),
                    ],
                  ),
                  child: _buildDataTable(context),
                ),
              ),
      ],
    );
  }

  // Add this to your EnquiryStaffState class

  // 1. Add group expansion state tracking
  Map<String, bool> groupExpanded = {
    'Awaiting Proposal': true,
    'Proposal Created': true,
    'Proposal Accepted': true,
    'Proposal Rejected': true,
    'Policy Created': true,
  };

  // 2. Add method to group enquiries by status
  Map<String, List<Map<String, dynamic>>> get _groupedEnquiries {
    final grouped = <String, List<Map<String, dynamic>>>{};

    // Initialize all status groups
    grouped['Awaiting Proposal'] = [];
    grouped['Proposal Created'] = [];
    grouped['Proposal Accepted'] = [];
    grouped['Proposal Rejected'] = [];
    grouped['Policy Created'] = [];

    // Group the filtered/paginated data by status
    for (var item in _paginatedData) {
      final status = item['status']?.toString() ?? 'Unknown';
      if (grouped.containsKey(status)) {
        grouped[status]!.add(item);
      }
    }

    return grouped;
  }

  // 3. Add method to get status icon and color
  Map<String, dynamic> _getStatusConfig(String status) {
    switch (status) {
      case 'Awaiting Proposal':
        return {'icon': '🕐', 'color': Color(0xFFfff3cd)};
      case 'Proposal Created':
        return {'icon': '📝', 'color': Color(0xFFd1ecf1)};
      case 'Proposal Accepted':
        return {'icon': '✅', 'color': Color(0xFFd4edda)};
      case 'Proposal Rejected':
        return {'icon': '❌', 'color': Color(0xFFf8d7da)};
      case 'Policy Created':
        return {'icon': '📋', 'color': Color(0xFFcfe2ff)};
      default:
        return {'icon': '📄', 'color': Color(0xFFe9ecef)};
    }
  }

  // 4. Build group header widget
  Widget _buildGroupHeader(String status, int count) {
    final config = _getStatusConfig(status);
    final isExpanded = groupExpanded[status] ?? true;

    return InkWell(
      onTap: () {
        setState(() {
          groupExpanded[status] = !isExpanded;
        });
      },
      child: Container(
        decoration: BoxDecoration(
          // color: Colors.grey.shade50,
          // color: Color(0xFFF0F7F6),
          color: Colors.grey.shade100,
          border: Border.all(color: Colors.grey.shade200, width: 1.6),
          // border: Border(
          //   bottom: BorderSide(
          //     width: 0.1,
          //     color: Colors.grey.shade50,
          //     // color: Color(0xffE0E7E6),
          //   ),
          // ),
        ),

        padding: EdgeInsets.symmetric(horizontal: 10, vertical: 8),
        child: Row(
          children: [
            Icon(
              isExpanded ? Icons.arrow_drop_down : Icons.arrow_right,
              size: 20,
            ),
            SizedBox(width: 8),
            Text(
              // '${config['icon']} $status',
              '$status',
              style: GoogleFonts.inter(
                fontSize: 13,
                color: Colors.black,
                // color: Colors.orange,
                fontWeight: FontWeight.w800,
              ),
            ),
            Spacer(),
            // SizedBox(width: 8),
            Container(
              padding: EdgeInsets.symmetric(horizontal: 10, vertical: 2),
              decoration: BoxDecoration(
                color: Color(0xFFe3f2fd),
                borderRadius: BorderRadius.circular(12),
              ),
              child: Text(
                'COUNTS : $count',
                style: GoogleFonts.inter(
                  fontSize: 12,
                  color: Color(0xFF1976d2),
                  fontWeight: FontWeight.w500,
                ),
              ),
            ),
          ],
        ),
      ),
    );
  }

  Widget _buildDataTable(BuildContext context) {
    if (filteredData.isEmpty) {
      return const SizedBox(
        height: 50,
        child: Center(child: Text('No available data')),
      );
    }

    final isDesktop = !ResponsiveLayout.isMobile(context);
    final groupedData = _groupedEnquiries;

    return LayoutBuilder(
      builder: (context, constraints) {
        double minWidth = constraints.maxWidth < 1300
            ? 1300
            : constraints.maxWidth;

        return ScrollConfiguration(
          behavior: const MaterialScrollBehavior().copyWith(
            dragDevices: {PointerDeviceKind.mouse, PointerDeviceKind.touch},
          ),
          child: SingleChildScrollView(
            scrollDirection: Axis.horizontal,
            child: SizedBox(
              width: minWidth,
              child: SingleChildScrollView(
                scrollDirection: Axis.vertical,
                child: Column(
                  crossAxisAlignment: CrossAxisAlignment.start,
                  // mainAxisSize: MainAxisSize.min,
                  children: [
                    // Build DataTable for each group
                    ...groupedData.entries.map((entry) {
                      final status = entry.key;
                      final items = entry.value;
                      final isExpanded = groupExpanded[status] ?? true;

                      return Column(
                        crossAxisAlignment: CrossAxisAlignment.start,
                        mainAxisSize: MainAxisSize.min,
                        children: [
                          // Group Header
                          Container(
                            width: double.infinity,
                            child: _buildGroupHeader(status, items.length),
                          ),

                          // Group DataTable (if expanded and has items)
                          // Table rows with expandable content
                          if (isExpanded && items.isNotEmpty)
                            ...items.asMap().entries.map((itemEntry) {
                              final index = itemEntry.key;
                              final item = itemEntry.value;
                              final startIndex =
                                  (currentPage - 1) * itemsPerPage;
                              final sno = startIndex + index + 1;
                              final id =
                                  int.tryParse(item['id'].toString()) ?? 0;
                              final selectId = item['id'].toString() ?? '0';

                              // ⭐ THIS IS THE KEY - Column with DataTable + Container
                              return Column(
                                crossAxisAlignment: CrossAxisAlignment.start,
                                children: [
                                  // Single-row DataTable
                                  Container(
                                    width: double.infinity,

                                    child: DataTable(
                                      headingRowHeight: 0,
                                      dividerThickness: 0.3,
                                      columnSpacing: isDesktop ? 20.0 : 16.0,
                                      dataRowMinHeight: 40,
                                      // border: TableBorder(
                                      //   bottom: BorderSide(
                                      //     width: 0.2,
                                      //     color: Colors.grey.shade50,
                                      //     // color: Color(0xffE0E7E6),
                                      //   ),
                                      // ),
                                      columns: _buildDataColumns(),
                                      rows: [
                                        _buildDataRow(item, sno),
                                      ], // Single row
                                    ),
                                  ),
                                  if (rowExpanded[id] ?? false) ...[
                                    Container(
                                      width: double.infinity,
                                      // height: 60,
                                      decoration: BoxDecoration(
                                        borderRadius: const BorderRadius.only(
                                          topLeft: Radius.circular(25),
                                          topRight: Radius.circular(25),
                                        ),
                                        color: Color(0xFFFFFCF2),
                                      ),
                                      padding: const EdgeInsets.symmetric(
                                        vertical: 8.0,
                                        horizontal: 5.0,
                                      ),
                                      child: _buildSubRow(
                                        context,
                                        selectId,
                                        id,
                                      ),
                                    ),
                                  ],
                                ],
                              );
                            }).toList(),

                          // Container(color: Colors.green, child: Text('Sub Row')),
                          // if (isExpanded && items.isNotEmpty)
                          //   Container(
                          //     width: double.infinity,
                          //     child: DataTable(
                          //       headingRowHeight:
                          //           0, // Hide header for groups (shown once at top)
                          //       dividerThickness: 0.5,
                          //       columnSpacing: isDesktop ? 20.0 : 16.0,
                          //       border: TableBorder(
                          //         horizontalInside: BorderSide(
                          //           width: 0.5,
                          //           color: Colors.grey.shade200,
                          //         ),
                          //       ),
                          //       columns: _buildDataColumns(),
                          //       rows: items.asMap().entries.map((itemEntry) {
                          //         final index = itemEntry.key;
                          //         final item = itemEntry.value;
                          //         final startIndex =
                          //             (currentPage - 1) * itemsPerPage;
                          //         final sno = startIndex + index + 1;
                          //         return _buildDataRow(item, sno);
                          //       }).toList(),
                          //     ),
                          //   ),

                          // Empty state
                          if (isExpanded && items.isEmpty)
                            Padding(
                              padding: EdgeInsets.all(20),
                              child: Center(
                                child: Text(
                                  'No records found',
                                  style: GoogleFonts.inter(
                                    fontSize: 12,
                                    color: Colors.grey,
                                    fontStyle: FontStyle.italic,
                                  ),
                                ),
                              ),
                            ),
                        ],
                      );
                    }).toList(),
                  ],
                ),
              ),
            ),
          ),
        );
      },
    );
  }

  DataRow _buildDataRow(Map<String, dynamic> item, int sno) {
    final id = int.tryParse(item['id'].toString()) ?? 0;
    final selectId = item['id'].toString() ?? '0';

    final bool isNewRow =
        int.tryParse(id.toString()) != null &&
        int.parse(id.toString()) > 1000000000000;

    print('idPrimary - $idPrimary');
    print('isNewRow - $isNewRow');
    final editing = isEditingRow[id] ?? false;
    final controllers = rowControllers[id];

    return DataRow(
      cells: [
        // S.No.
        // DataCell(Text('$sno', style: _dataBold)),

        // Created On
        DataCell(
          SizedBox(
            width: 80,
            child: Row(
              children: [
                // Text(item['created_on'], style: _dataBold),
                Text(
                  formatDateTimeForTable(item['created_on'], newLine: true),
                  style: _dataBold,
                ),
              ],
            ),
          ),
        ),

        // Agent Name
        DataCell(
          // editing
          //     ? buildSelectStaffMem(context)
          //     :
          SizedBox(
            width: 80,
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              mainAxisAlignment: MainAxisAlignment.center,
              children: [
                Text(item['agent_code'] ?? '-', style: _dataBold),
                Text(
                  item['agent_name'] != null
                      ? _truncateText(item['agent_name'], 10)
                      : '-',
                  style: _tableDataTimeStyle,
                ),
              ],
            ),
          ),
        ),

        // Assigned To
        DataCell(
          // editing
          //     ? buildAgentName(context)
          //     :
          SizedBox(
            width: 90,
            child: Text(
              item['assigned_to_name'] != null
                  ? _truncateText(item['assigned_to_name'], 10)
                  : '-',
              style: _dataBold,
            ),
          ),
        ),

        // DataCell(
        //   editing
        //       ? buildBroker(context)
        //       : Text(item['broker_name'] ?? '-', style: _dataBold),
        // ),

        // Insurer Name
        DataCell(
          // editing
          //     ? buildInsurer(context)
          //     :
          SizedBox(
            width: 80,
            child: Text(item['insurer_short_name'] ?? '-', style: _dataBold),
          ),
        ),

        DataCell(
          // editing
          //     ? buildInsuredName(context)
          //     :
          SizedBox(
            width: 90,
            child: Tooltip(
              message: item['insured_name'],
              child: Text(
                item['insured_name'] != null
                    ? _truncateText(item['assigned_to_name'], 15)
                    : '-',
                style: _dataBold,
              ),
            ),
          ),
        ),
        // Vehicle No
        DataCell(
          // editing
          //     ? buildVehicleNumber(context)
          //     :
          SizedBox(
            width: 80,
            child: Text(item['reg_no'] ?? '-', style: _dataBold),
          ),
        ),

        DataCell(
          SizedBox(
            width: 40.0,
            child: Row(
              children: [
                Tooltip(
                  message:
                      'Email   : ${item["email"]}\n'
                      'Mobile  : ${item["mobile"]}\n'
                      'Remarks : ${item["remarks"]}',
                  decoration: BoxDecoration(
                    color: Colors.white, // background color
                    borderRadius: BorderRadius.circular(6),
                    border: Border.all(color: Colors.grey, width: 1),
                  ),
                  textStyle: GoogleFonts.inter(
                    color: Colors.black,
                    fontSize: 12,
                  ),

                  padding: const EdgeInsets.symmetric(
                    horizontal: 8,
                    vertical: 4, // reduce tooltip height
                  ),
                  margin: const EdgeInsets.only(
                    left: 10,
                  ), // tooltip distance from widget
                  waitDuration: Duration(milliseconds: 500),
                  showDuration: Duration(seconds: 2),
                  child: Icon(
                    Icons.info_outline_rounded,
                    size: 15,
                    color: Colors.blue,
                  ),
                ),

                if (roleId != 'staff') ...[
                  IconButton(
                    padding: EdgeInsets.zero, // remove outer padding
                    constraints: BoxConstraints(
                      // reduce clickable area
                      minWidth: 24,
                      minHeight: 24,
                    ),
                    icon: Icon(
                      rowExpanded[id] == true
                          ? Icons.edit_off_sharp
                          : Icons.edit,
                      color: Colors.blue,
                      size: 15,
                    ),

                    tooltip: "Edit",
                    onPressed: () {
                      setState(() {
                        rowExpanded[id] = !(rowExpanded[id] ?? false);
                      });
                      handleEdit(item);
                    },
                  ),
                ],
              ],
            ),
          ),
        ),

        // Assigned Date (formatted)
        DataCell(
          SizedBox(
            width: 80,
            child: Text(
              // item['updated_on'] ?? '-',
              formatDateTimeForTable(item['updated_on'], newLine: true),
              style: _dataBold,
              softWrap: true,
              maxLines: 3,
            ),
          ),
        ),

        // Premium
        DataCell(
          // ((item['premium_amount'] != null) &&
          //         (item['premium_amount'] != '') &&
          //         ((item['status'] != 'Awaiting Proposal') ||
          //             (item['status'] == 'Proposal Created') ||
          //             (item['status'] == 'Proposal Rejected')))
          (item['status'] == 'Proposal Created' ||
                  item['status'] == 'Proposal Rejected')
              ? SizedBox(
                  width: 80,
                  child: InkWell(
                    onTap: () {
                      // handle approval logic

                      handleProposalAccept(context, item['id']);
                    },
                    child: Text(
                      'Click To\nApprove',
                      style: GoogleFonts.inter(
                        color: Colors.green,
                        fontSize: 11,
                        fontWeight: FontWeight.w700,
                      ),
                    ),
                  ),
                )
              : SizedBox(
                  width: 80,
                  child: Text(
                    item['premium_amount']?.toString() ?? '-',
                    style: _dataBold,
                  ),
                ),
        ),

        // Payment Mode
        DataCell(
          SizedBox(
            width: 80,
            child: Text(item['payment_mode'] ?? '-', style: _dataBold),
          ),
        ),

        // Policy Number
        DataCell(
          SizedBox(
            width: 90,
            child: Text(
              item['policy_number'] ?? '-',
              style: _dataBold,
              softWrap: true,
              maxLines: 3,
            ),
          ),
        ),

        // Status
        // DataCell(Text(item['status'] ?? '-', style: _dataBold)),
        DataCell(
          SizedBox(
            width: 80,
            child: Material(
              color: Colors.white,
              child: InkWell(
                hoverColor: Color(0xFFEAF6F4),
                onTap: () async {
                  var status = item['status'];
                  var enqId = item['id'];

                  final prefs = await SharedPreferences.getInstance();

                  // ✅ Remove old value (if any)
                  await prefs.remove('enqStaffDataId');

                  // ✅ Save the new id
                  await prefs.setString('enqStaffDataId', enqId.toString());
                  ref.read(quotationStaffIdProvider.notifier).state = enqId;
                  buildStatusActions(context, status, enqId);
                },
                child: Tooltip(
                  message: 'Click to View or Process Enquiry', //
                  waitDuration: const Duration(milliseconds: 500), // optional
                  showDuration: const Duration(seconds: 2), // optional
                  child: Text(
                    item['status'] ?? '-',
                    style: _dataBold,
                    overflow: TextOverflow.clip, //
                  ),
                ),
                // child: Text(item['status'] ?? '-', style: _dataBold),
              ),
            ),
          ),
        ),
      ],
    );
  }

  // Add this helper method to generate DataColumns
  List<DataColumn> _buildDataColumns() {
    return [
      const DataColumn(label: Text('Received Date', style: _headerStyle)),
      const DataColumn(label: Text('Partner *', style: _headerStyle)),
      const DataColumn(label: Text('Assigned To *', style: _headerStyle)),
      // const DataColumn(label: Text('Broker *', style: _headerStyle)),
      const DataColumn(label: Text('Insurer *', style: _headerStyle)),
      const DataColumn(label: Text('Insured Name *', style: _headerStyle)),
      const DataColumn(label: Text('Vehicle No *', style: _headerStyle)),
      // const DataColumn(label: Text('Vehicle Type *', style: _headerStyle)),
      // const DataColumn(label: Text('Email', style: _headerStyle)),
      // const DataColumn(label: Text('Mobile', style: _headerStyle)),
      // const DataColumn(label: Text('Documents', style: _headerStyle)),
      // const DataColumn(label: Text('Remarks', style: _headerStyle)),
      const DataColumn(label: Text('Action', style: _headerStyle)),
      const DataColumn(label: Text('Assigned Date', style: _headerStyle)),
      const DataColumn(label: Text('Premium', style: _headerStyle)),
      const DataColumn(label: Text('Payment Mode', style: _headerStyle)),
      const DataColumn(label: Text('Policy Number', style: _headerStyle)),
      const DataColumn(label: Text('Status', style: _headerStyle)),
    ];
  }

  // 6. Build table header
  Widget _buildTableHeader(bool isDesktop) {
    return Padding(
      padding: EdgeInsets.symmetric(horizontal: 16, vertical: 8),
      child: Row(
        children: [
          _buildHeaderCell('Received Date', 100),
          _buildHeaderCell('Partner *', 100),
          _buildHeaderCell('Assigned To *', 110),
          // _buildHeaderCell('Broker *', 100),
          _buildHeaderCell('Insurer *', 90),
          _buildHeaderCell('Insured Name *', 120),
          _buildHeaderCell('Vehicle No *', 100),
          // _buildHeaderCell('Vehicle Type *', 110),
          // _buildHeaderCell('Email', 150),
          // _buildHeaderCell('Mobile', 100),
          // _buildHeaderCell('Documents', 100),
          // _buildHeaderCell('Remarks', 120),
          _buildHeaderCell('Action', 60),
          _buildHeaderCell('Assigned Date', 100),
          _buildHeaderCell('Premium', 100),
          _buildHeaderCell('Payment Mode', 100),
          _buildHeaderCell('Policy Number', 120),
          _buildHeaderCell('Status', 100),
        ],
      ),
    );
  }

  Widget _buildHeaderCell(String label, double width) {
    return Container(
      padding: EdgeInsets.symmetric(horizontal: 4),
      child: SizedBox(
        width: width,
        child: Text(
          label,
          style: GoogleFonts.inter(
            fontSize: 12,
            fontWeight: FontWeight.w600,
            color: Colors.black87,
          ),
        ),
      ),
    );
  }

  static final _dataBold = TextStyle(
    fontSize: 12,

    fontWeight: FontWeight.w500,
    color: Colors.black,
    // color: Color(0xFF000000),
  );
  final _tableDataTimeStyle = GoogleFonts.inter(
    fontSize: 10,
    fontWeight: FontWeight.w400,
  );
  static final _dataBoldsmall = TextStyle(
    fontSize: 12,

    fontWeight: FontWeight.w400,
    color: Color(0xFF000000),
  );

  static final _dataSub = TextStyle(
    fontSize: 10,
    fontWeight: FontWeight.w300,
    color: Color(0xFF585757),
  );

  static const _headerStyle = TextStyle(
    color: Colors.black,
    fontWeight: FontWeight.w500,
  );
  static const _cardheaderStyle = TextStyle(
    color: Colors.black,
    fontWeight: FontWeight.w600,
    fontSize: 12,
  );

  static final TextStyle _textStyle = TextStyle(
    fontSize: 12,
    fontWeight: FontWeight.w600,
  );

  static const _cardBodyStyle = TextStyle(
    color: Color(0xFF545454),
    fontWeight: FontWeight.w400,
    fontSize: 12,
  );

  String _truncateText(String text, int limit) {
    if (text.length <= limit) return text;
    return '${text.substring(0, limit)}...';
  }

  String _wrapText(String text, int chunkSize) {
    if (text.isEmpty) return '-';
    final buffer = StringBuffer();
    for (int i = 0; i < text.length; i += chunkSize) {
      int end = (i + chunkSize < text.length) ? i + chunkSize : text.length;
      buffer.writeln(text.substring(i, end)); // adds '\n' after each chunk
    }
    return buffer.toString().trim();
  }

  String formatDateTimeForTable(String? input, {bool newLine = false}) {
    if (input == null || input.trim().isEmpty) return '-';

    final s = input.trim();
    DateTime dt;

    try {
      // Case 1: ISO-like (yyyy-MM-dd ...), DateTime.parse will handle
      if (RegExp(r'^\d{4}-\d{2}-\d{2}').hasMatch(s)) {
        dt = DateTime.parse(s);
      }
      // Case 2: day-month-year at start (e.g. 13-11-2025 07:28 AM or 13-11-2025 07:28)
      else if (RegExp(r'^\d{2}-\d{2}-\d{4}').hasMatch(s)) {
        // Try with am/pm (hh:mm a)
        if (RegExp(r'\b(am|pm)\b', caseSensitive: false).hasMatch(s)) {
          dt = DateFormat('dd-MM-yyyy hh:mm a').parse(s);
        }
        // Try 24-hour time "dd-MM-yyyy HH:mm" or just date "dd-MM-yyyy"
        else if (RegExp(r'^\d{2}-\d{2}-\d{4}\s+\d{1,2}:\d{2}').hasMatch(s)) {
          dt = DateFormat('dd-MM-yyyy HH:mm').parse(s);
        } else {
          dt = DateFormat('dd-MM-yyyy').parse(s);
        }
      }
      // Case 3: fallback — try parse with DateTime.parse (may throw)
      else {
        dt = DateTime.parse(s);
      }

      final dateStr = DateFormat('dd-MM-yyyy').format(dt);
      final timeStr = DateFormat('hh:mm a').format(dt); // e.g. 07:28 AM

      return newLine ? '$dateStr\n$timeStr' : '$dateStr | $timeStr';
    } catch (e) {
      // If parsing fails, return original string as fallback (or '-' if empty)
      return s.isNotEmpty ? s : '-';
    }
  }
}
