import 'dart:io';

import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:google_maps_flutter/google_maps_flutter.dart';
import 'package:supplier_new/common/settings.dart';
import '../common/keys.dart';
import '../google_maps_place_picker_mb/src/models/pick_result.dart';
import '../google_maps_place_picker_mb/src/place_picker.dart';
import 'package:supplier_new/google_maps_place_picker_mb/google_maps_place_picker.dart';
import 'dart:io' show File, Platform;
import 'package:google_maps_flutter_android/google_maps_flutter_android.dart';
import 'package:google_maps_flutter_platform_interface/google_maps_flutter_platform_interface.dart';
import 'package:location/location.dart' as locationmap;

void main() => runApp(const MaterialApp(home: SourceLocation()));

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

  @override
  State<SourceLocation> createState() => _SourceLocationState();
}

class _SourceLocationState extends State<SourceLocation> {
  final _formKey = GlobalKey<FormState>();

  // Controllers
  final _locationNameController = TextEditingController();
  final _mobileCtrl = TextEditingController();
  String address='';

  String address1 = '';
  String address2 = '';
  String city = '';
  String state = '';
  String zip = '';
  String country = '';
  double lat=0;
  double lng=0;

  PickResult? selectedPlace;

  bool _mapsInitialized = false;
  final String _mapsRenderer = "latest";

  var kInitialPosition = const LatLng(15.462477, 78.717401);

  locationmap.Location location = locationmap.Location();

  final GoogleMapsFlutterPlatform mapsImplementation =
      GoogleMapsFlutterPlatform.instance;

  void initRenderer() {
    if (_mapsInitialized) return;
    if (mapsImplementation is GoogleMapsFlutterAndroid) {
      switch (_mapsRenderer) {
        case "legacy":
          (mapsImplementation as GoogleMapsFlutterAndroid)
              .initializeWithRenderer(AndroidMapRenderer.legacy);
          break;
        case "latest":
          (mapsImplementation as GoogleMapsFlutterAndroid)
              .initializeWithRenderer(AndroidMapRenderer.latest);
          break;
      }
    }
    setState(() {
      _mapsInitialized = true;
    });
  }


  // Dropdowns
  final List<String> waterTypes = [
    "Drinking Water",
    "Bore Water",
    "Industrial",
    "Construction",
    "Non-potable",
  ];
  String? selectedWaterType;

  // Data bucket
  final List<Map<String, dynamic>> _drivers = [];

  // Validators
  String? _required(String? v, {String field = "This field"}) {
    if (v == null || v.trim().isEmpty) return "$field is required";
    return null;
  }

  String? _validatePhone(String? v, {String label = "Phone Number"}) {
    if (v == null || v.trim().isEmpty) return "$label is required";
    final digits = v.replaceAll(RegExp(r'\D'), '');
    if (digits.length != 10) return "Enter a 10-digit $label";
    if (!RegExp(r'^[6-9]\d{9}$').hasMatch(digits)) {
      return "$label must start with 6/7/8/9";
    }
    return null;
  }

  @override
  void dispose() {
    _locationNameController.dispose();
    _mobileCtrl.dispose();
    super.dispose();
  }
  bool addBusinessAsSource = false;


  void _clearForm() {
    _locationNameController.clear();
    _mobileCtrl.clear();
    selectedWaterType = null;
    setState(() {});
  }

  void _addSourceLocation() async{
    final ok = _formKey.currentState?.validate() ?? false;

    if(addBusinessAsSource){
      setState(() {
        address=AppSettings.userAddress;
        lat=AppSettings.supplierLatitude;
        lng=AppSettings.supplierLongitude;
      });
    }

    setState(() {}); // ensure error texts render
    if (!ok ||
        selectedWaterType == null ||
        selectedWaterType!.isEmpty) {
      if (selectedWaterType == null) {
        ScaffoldMessenger.of(context).showSnackBar(
          const SnackBar(content: Text("Please select Water type")),
        );
      }
      return;
    }
    var payload = new Map<String, dynamic>();
    payload["location_name"] = _locationNameController.text.toString();
    payload["phone"] = _mobileCtrl.text.toString();
    payload["water_type"] =selectedWaterType.toString();
    payload["status"] ='string';
    payload["address"] = address;
    payload["city"] = '';
    payload["state"] = '';
    payload["zip"] ='';
    payload["latitude"] = lat;
    payload["longitude"] = lng;



    bool tankStatus = await AppSettings.addSourceLocations(payload);

    try {
      if (tankStatus) {
        AppSettings.longSuccessToast("Source location added Successfully");
        _locationNameController.text = '';
        Navigator.pop(context,true);

      }
      else {
        AppSettings.longFailedToast("Tanker Creation failed");
      }
    } catch (exception) {
      print(exception);
    }
    _clearForm();
    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(content: Text("Driver added (${_drivers.length})")),
    );
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.white,
      appBar: AppBar(
        backgroundColor: Colors.white,
        surfaceTintColor: Colors.transparent,
        elevation: 0,
        scrolledUnderElevation: 0,
        title: const Text("Complete Profile"),
        actions: [
          Padding(
            padding: const EdgeInsets.fromLTRB(10, 10, 0, 10),
            child: IconButton(
              splashRadius: 20,
              padding: EdgeInsets.zero,
              icon: const Image(image: AssetImage('images/calendar_appbar.png'), width: 22, height: 22),
              onPressed: () {},
            ),
          ),
          Padding(
            padding: const EdgeInsets.fromLTRB(0, 10, 10, 10),
            child: IconButton(
              splashRadius: 20,
              padding: EdgeInsets.zero,
              icon: Image.asset('images/notification_appbar.png', width: 22, height: 22),
              onPressed: () {},
            ),
          ),
        ],
      ),
      body: SafeArea(
        child: Form(
          key: _formKey,
          child: ListView(
            padding: const EdgeInsets.fromLTRB(20, 10, 20, 24),
            children: [
              // Step indicator
              Text(
                "Step 3/5",
                style: fontTextStyle(16, const Color(0xFFC3C4C4), FontWeight.w500),
              ),
              const SizedBox(height: 16),
              Row(
                children: List.generate(4, (index) {
                  return Expanded(
                    child: Container(
                      margin: const EdgeInsets.symmetric(horizontal: 2),
                      height: 5,
                      decoration: BoxDecoration(
                        color: index < 4 ? const Color(0xFFC3C4C4) : Colors.grey,
                        borderRadius: BorderRadius.circular(2),
                      ),
                    ),
                  );
                }),
              ),
              const SizedBox(height: 12),
              Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  Text("SORURCE LOCATION", style: fontTextStyle(20, const Color(0xFF515253), FontWeight.w600)),
                  const SizedBox(height: 8),
                  Container(
                    width: 24,
                    height: 24,
                    decoration: const BoxDecoration(
                      image: DecorationImage(image: AssetImage('images/flag.png'), fit: BoxFit.contain),
                    ),
                  ),
                ],
              ),
              const SizedBox(height: 6),
              Text(
                "Add your source Location",
                style: fontTextStyle(14, const Color(0xFF939495), FontWeight.w500),
              ),
              const SizedBox(height: 6),
              Align(
                alignment: Alignment.centerLeft, // keep the whole thing on the left
                child: Row(
                  mainAxisSize: MainAxisSize.min, // don't stretch full width
                  children: [
                    Checkbox(
                      value: addBusinessAsSource,
                      onChanged: (v) => setState(() => addBusinessAsSource = v ?? false),
                      materialTapTargetSize: MaterialTapTargetSize.shrinkWrap,
                      visualDensity: const VisualDensity(horizontal: -4, vertical: -4),
                    ),
                    const SizedBox(width: 6), // control the exact gap
                    Text(
                      "Add Business Location as a Source Location",
                      style: fontTextStyle(14, const Color(0xFF939495), FontWeight.w500),
                      maxLines: 1,
                      overflow: TextOverflow.ellipsis,
                    ),
                  ],
                ),
              ),

              const SizedBox(height: 16),

              // Section header (just the bar)
              _SectionHeaderBar(
                title: "SOURCE LOCATION #1",
                icon: Image.asset('images/arrow-up.png', width: 16, height: 16),
                radius: 20,
              ),
              const SizedBox(height: 12),

              // === Fields
              _LabeledField(
                label: "Location Name *",
                child: TextFormField(
                  controller: _locationNameController,
                  validator: (v) => _required(v, field: "Location Name"),
                  decoration:  InputDecoration(
                    hintText: "Location Name",
                    hintStyle: fontTextStyle(14, const Color(0xFF939495), FontWeight.w400),
                    border: OutlineInputBorder(),
                    isDense: true,
                  ),
                  textInputAction: TextInputAction.next,
                ),
              ),



              _LabeledField(
                label: "Mobile Number *",
                child: TextFormField(
                  controller: _mobileCtrl,
                  validator: (v) => _validatePhone(v, label: "Mobile Number"),
                  keyboardType: TextInputType.phone,
                  inputFormatters: [
                    FilteringTextInputFormatter.digitsOnly,
                    LengthLimitingTextInputFormatter(10),
                  ],
                  decoration: InputDecoration(
                    hintText: "Mobile Number",
                    hintStyle: fontTextStyle(14, const Color(0xFF939495), FontWeight.w400),
                    border: const OutlineInputBorder(),
                    isDense: true,
                  ),
                  textInputAction: TextInputAction.next,
                ),
              ),
              Visibility(
                visible: !addBusinessAsSource,
                child: Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  SizedBox(
                    width: double.infinity,
                    child: OutlinedButton.icon(
                      onPressed: (){
                        location.serviceEnabled().then((value) {
                          if (value) {
                            initRenderer();
                            Navigator.push(
                              context,
                              MaterialPageRoute(
                                builder: (context) {
                                  return PlacePicker(
                                    resizeToAvoidBottomInset: false,
                                    hintText: "Find a place ...",
                                    searchingText: "Please wait ...",
                                    selectText: "Select place",
                                    outsideOfPickAreaText: "Place not in area",
                                    initialPosition: kInitialPosition,
                                    useCurrentLocation: true,
                                    selectInitialPosition: true,
                                    usePinPointingSearch: true,
                                    usePlaceDetailSearch: true,
                                    zoomGesturesEnabled: true,
                                    zoomControlsEnabled: true,
                                    onMapCreated: (GoogleMapController controller) {},
                                    onPlacePicked: (PickResult result) {
                                      setState(() {
                                        selectedPlace = result;
                                        lat=selectedPlace!.geometry!.location.lat;
                                        lng=selectedPlace!.geometry!.location.lng;
                                        if(selectedPlace!.types!.length==1){
                                          address =
                                          selectedPlace!.formattedAddress!;
                                        }
                                        else{
                                          address =selectedPlace!.name!+', '+selectedPlace!.formattedAddress!;
                                        }
                                        Navigator.of(context).pop();
                                      });
                                    },
                                    onMapTypeChanged: (MapType mapType) {},
                                    apiKey: Platform.isAndroid
                                        ? APIKeys.androidApiKey
                                        : APIKeys.iosApiKey,
                                    forceAndroidLocationManager: true,
                                  );
                                },
                              ),
                            );
                          } else {
                            showGeneralDialog(
                              context: context,
                              pageBuilder: (context, x, y) {
                                return Scaffold(
                                  backgroundColor: Colors.grey.withOpacity(.5),
                                  body: Center(
                                    child: Container(
                                      width: double.infinity,
                                      height: 150,
                                      padding:
                                      const EdgeInsets.symmetric(horizontal: 20),
                                      child: Card(
                                        child: Padding(
                                          padding: const EdgeInsets.all(10.0),
                                          child: Column(
                                            mainAxisAlignment: MainAxisAlignment.center,
                                            children: [
                                              const Text(
                                                "Please enable the location",
                                                style: TextStyle(
                                                  fontSize:18,
                                                  fontWeight: FontWeight.w500,
                                                ),
                                              ),
                                              const SizedBox(
                                                height: 20,
                                              ),
                                              ElevatedButton(
                                                onPressed: () {
                                                  Navigator.pop(context);
                                                },
                                                child: const Text("Cancel"),
                                              ),
                                            ],
                                          ),
                                        ),
                                      ),
                                    ),
                                  ),
                                );
                              },
                            );
                          }
                        });
                      },
                      icon: Image.asset('images/Add_icon.png', width: 16, height: 16),
                      label: Text(
                        "Add Location on map",
                        style: fontTextStyle(14, const Color(0xFF646566), FontWeight.w600),
                      ),
                    ),
                  ),
                  const SizedBox(height: 12),

                ],
              ),),
              _LabeledField(
                label: "Water Type *",
                child: DropdownButtonFormField<String>(
                  value: selectedWaterType,
                  items: waterTypes
                      .map((w) => DropdownMenuItem(value: w, child: Text(w)))
                      .toList(),
                  onChanged: (v) => setState(() => selectedWaterType = v),
                  validator: (v) => v == null || v.isEmpty ? "Water Type is required" : null,
                  isExpanded: true,
                  alignment: Alignment.centerLeft,
                  hint: Text(
                    "Select Water Type",
                    style: fontTextStyle(14, const Color(0xFF939495), FontWeight.w400),
                  ),
                  icon: Image.asset('images/downarrow.png', width: 16, height: 16),
                  decoration: const InputDecoration(
                    border: OutlineInputBorder(),
                    isDense: false,
                    contentPadding: EdgeInsets.symmetric(horizontal: 12, vertical: 14),
                  ),
                ),
              ),


              const SizedBox(height: 20),

              // Actions
              Column(
                crossAxisAlignment: CrossAxisAlignment.stretch,
                children: [
                  SizedBox(
                    width: double.infinity,
                    child: OutlinedButton.icon(
                      onPressed: _addSourceLocation,
                      icon: Image.asset('images/Add_icon.png', width: 16, height: 16),
                      label: Text(
                        "Add Location",
                        style: fontTextStyle(14, const Color(0xFF646566), FontWeight.w600),
                      ),
                    ),
                  ),
                  const SizedBox(height: 12),
                  SizedBox(
                    width: double.infinity,
                    child: ElevatedButton(
                      style: ElevatedButton.styleFrom(
                        backgroundColor: const Color(0xFF8270DB),
                        foregroundColor: Colors.white,
                        padding: const EdgeInsets.symmetric(vertical: 14),
                        shape: RoundedRectangleBorder(borderRadius: BorderRadius.circular(24)),
                      ),
                      onPressed: () {
                        // // TODO: Navigate to the next step/screen
                        // Navigator.push(context, MaterialPageRoute(builder: (_) => const SourceLocation1()));
                        // // ScaffoldMessenger.of(context).showSnackBar(
                        // //   SnackBar(content: Text("Saved ${_drivers.length} driver(s). Proceeding…")),
                        // // );
                      },

                      child: Text(
                        "Continue",
                        style: fontTextStyle(14, Colors.white, FontWeight.w400),
                      ),
                    ),
                  ),
                ],
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// ======= UI helpers =======

class _SectionHeaderBar extends StatelessWidget {
  final String title;
  final Widget? icon;
  final Color backgroundColor;
  final Color borderColor;
  final double radius;

  const _SectionHeaderBar({
    required this.title,
    this.icon,
    this.backgroundColor = const Color(0xFFEEEEEE),
    this.borderColor = const Color(0xFFE5E7EB),
    this.radius = 12,
    Key? key,
  }) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return Container(
      decoration: BoxDecoration(
        color: backgroundColor,
        border: Border.all(color: borderColor, width: 1),
        borderRadius: BorderRadius.circular(radius),
        boxShadow: [
          BoxShadow(
            color: Colors.black.withOpacity(0.04),
            blurRadius: 6,
            offset: const Offset(0, 2),
          ),
        ],
      ),
      padding: const EdgeInsets.symmetric(horizontal: 12, vertical: 10),
      child: Row(
        children: [
          Expanded(
            child: Text(
              title,
              style: fontTextStyle(12, const Color(0xFF2D2E30), FontWeight.w600),
            ),
          ),
          if (icon != null) icon!,
        ],
      ),
    );
  }
}

class _LabeledField extends StatelessWidget {
  final String label;
  final Widget child;
  final String? Function()? validator; // (kept from your earlier helper; not used here)

  const _LabeledField({
    required this.label,
    required this.child,
    this.validator,
  });

  @override
  Widget build(BuildContext context) {
    final errorText = validator != null ? validator!() : null;

    return Padding(
      padding: const EdgeInsets.only(bottom: 14.0),
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: [
          Text(label, style: fontTextStyle(12, const Color(0xFF515253), FontWeight.w600)),
          const SizedBox(height: 6),
          child,
          if (errorText != null)
            Padding(
              padding: const EdgeInsets.only(top: 6),
              child: Text(
                errorText,
                style: fontTextStyle(14, const Color(0xFF939495), FontWeight.w400),
              ),
            ),
        ],
      ),
    );
  }
}
