import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';
import '../../Models/crmModels/crmProspectDetailsResponse.dart';
import '../../Utils/commonServices.dart';
import '../../services/api_calling.dart';
import '../HomeScreenNotifier.dart';

class crmProspectDetailsProvider extends ChangeNotifier {


  List<Leads> _leadsList = [];
  List<Contacts> _contactsList = [];
  List<Orders> _ordersList = [];
  List<Payments> _paymentsList = [];
  AccountDetails _accountDetails = AccountDetails();

  bool _isLoading = false;

  TextEditingController nameController = TextEditingController();
  TextEditingController designationController = TextEditingController();
  TextEditingController mobileNumberController = TextEditingController();
  TextEditingController alternativeMobileController = TextEditingController();
  TextEditingController telephoneController = TextEditingController();
  TextEditingController emailController = TextEditingController();
  TextEditingController editNameController = TextEditingController();
  TextEditingController editDesignationController = TextEditingController();
  TextEditingController editMobileNumberController = TextEditingController();
  TextEditingController editAlternativeMobileController = TextEditingController();
  TextEditingController editTelephoneController = TextEditingController();
  TextEditingController editEmailController = TextEditingController();
  TextEditingController dateController = TextEditingController();
  TextEditingController noteController = TextEditingController();

  String? _nameError;
  String? _designationError;
  String? _mobileNumError;
  String? _altMobError;
  String? _teleError;
  String? _emailError;
  String? _noteError;

  String? _editNameError;
  String? _editDesignationError;
  String? _editMobileNumError;
  String? _editAltMobError;
  String? _editTeleError;
  String? _editEmailError;

  String? _dateError;

  List<String> _headings = [];
  List<String> _subHeadings = [];
  DateTime? _date;
  String? _formattedDate;


  List<Leads> get leadList => _leadsList;
  List<Contacts> get contactList => _contactsList;
  List<Orders> get ordersList =>  _ordersList;
  List<Payments> get paymentsList => _paymentsList;
  AccountDetails get accountDetails => _accountDetails;

  String? get nameError => _nameError;
  String? get designationError => _designationError;
  String? get mobileNumError => _mobileNumError;
  String? get altMobError => _altMobError;
  String? get teleError => _teleError;
  String? get emailError => _emailError;
  String? get noteError => _noteError;

  String? get editNameError => _editNameError;
  String? get editDesignationError => _editDesignationError;
  String? get editMobileNumError => _editMobileNumError;
  String? get editAltMobError => _editAltMobError;
  String? get editTeleError => _editTeleError;
  String? get editEmailError => _editEmailError;

  String? get dateError => _dateError;

  bool get isLoading => _isLoading;


  List<String> get Headings => _headings;

  List<String> get subHeadings => _subHeadings;

  String? get formattedDate => _formattedDate;


  set nameError(String? value){
    _nameError = value;
    notifyListeners();
  }
  set designationError(String? value){
    _designationError = value;
    notifyListeners();
  }
  set mobileNumError(String? value){
    _mobileNumError = value;
    notifyListeners();
  }
  set altMobError(String? value){
    _altMobError = value;
    notifyListeners();
  }
  set teleError(String? value){
    _teleError = value;
    notifyListeners();
  }
  set emailError(String? value){
    _emailError = value;
    notifyListeners();
  }

  set noteError(String? value){
    _noteError = value;
    notifyListeners();
  }


  set editNameError(String? value){
    _editNameError = value;
    notifyListeners();
  }
  set editDesignationError(String? value){
    _editDesignationError = value;
    notifyListeners();
  }
  set editMobileNumError(String? value){
    _editMobileNumError = value;
    notifyListeners();
  }
  set editAltMobError(String? value){
    _editAltMobError = value;
    notifyListeners();
  }
  set editTeleError(String? value){
    _editTeleError = value;
    notifyListeners();
  }
  set editEmailError(String? value){
    _editEmailError = value;
    notifyListeners();
  }

  set isLoading(bool value){
    _isLoading = value;
    notifyListeners();
  }

  set formattedDate(String? value) {
    _formattedDate = value;
    dateController.text = _formattedDate!;
    _dateError = null;
    notifyListeners();
  }

  set dateError(value){
    _dateError = value;
    notifyListeners();
  }

  void setDate(DateTime newDate) {
    _date = newDate;
    _formattedDate = DateFormat('yyyy-MM-dd').format(newDate);
    dateController.text = _formattedDate!;
    _dateError = null;
    notifyListeners();
  }
  Future<void> crmProspectDetailsAPIFunction(context, leadID) async {
    try {
      var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
      final data = await ApiCalling.crmProspectDetailsAPI(
        HomeProv.empId,
        HomeProv.session,
        leadID,
      );
      _isLoading = true;
      notifyListeners();
      if (data != null) {
        if (data.error == "0") {
          _leadsList = data.leads!;
          _accountDetails = data.accountDetails!;
          _contactsList =data.contacts!;
          _ordersList = data.orders!;
          _paymentsList = data.payments!;
          _headings = [
            "Company Name",
            "Address",
            "Account Manager Name",
            "Account Created By",
            "State",
            "District",
            "Sub Locality",
            "Pincode",
            "Source",
            "Reference",
            "Team",
            "Segment",
            "Account Age",
          ];
          _subHeadings = [
            data.accountDetails!.name??"-",
            data.accountDetails!.address??"-",
            data.accountDetails!.accManager??"-",
            data.accountDetails!.owner??"-",
            data.accountDetails!.state??"-",
            data.accountDetails!.district??"-",
            data.accountDetails!.subLocality??"-",
            data.accountDetails!.pincode??"-",
            data.accountDetails!.source??"-",
            data.accountDetails!.reference??"-",
            data.accountDetails!.team??"-",
            data.accountDetails!.segment??"-",
            "${data.accountDetails!.aage ?? "-"} days old",
          ];

          _isLoading = false;
          notifyListeners();
        }else{
          _isLoading = false;
          notifyListeners();
        }
      }else{
        _isLoading = false;
        notifyListeners();
      }
    } catch (e, s) {
      _isLoading = false;
      notifyListeners();
    }
  }

  Future<void> crmProspectDetailsAddContactAPIFunction(context, accID) async {
    try {
      var prov = Provider.of<HomescreenNotifier>(context, listen: false);
      final data = await ApiCalling.crmProspectDetailsAddAccountAPI(prov.empId, prov.session, accID,
          nameController.text, mobileNumberController.text, designationController.text, alternativeMobileController.text, telephoneController.text, emailController.text);
      _isLoading = true;
      notifyListeners();
      if (data != null) {
        if (data.error == "0") {
          Navigator.pop(context,true);
          resetAll();
          _isLoading = false;
          notifyListeners();
        }else{
          _isLoading = false;
          notifyListeners();
        }
      }else{
        _isLoading = false;
        notifyListeners();
      }
    } catch (e, s) {
      _isLoading = false;
      notifyListeners();
    }
  }

  Future<void> crmProspectDetailsEditContactAPIFunction(context,contactID,accID) async {
    try {
      var prov = Provider.of<HomescreenNotifier>(context, listen: false);
      final data = await ApiCalling.crmProspectDetailsEditContactAPI(prov.empId, prov.session, contactID,
          nameController.text,accID, mobileNumberController.text, designationController.text, alternativeMobileController.text, telephoneController.text, emailController.text);
      _isLoading = true;
      notifyListeners();
      if (data != null) {
        if (data.error == "0") {
          _isLoading = false;
          Navigator.pop(context,true);
          resetAll();
          _isLoading = false;
          notifyListeners();
        }else{
          _isLoading = false;
          notifyListeners();
        }
      }else{
        _isLoading = false;
        notifyListeners();
      }
    } catch (e, s) {
      _isLoading = false;
      notifyListeners();
    }
  }



  void showDatePickerDialog(BuildContext context) {
    showCupertinoModalPopup<void>(
      context: context,
      builder:
          (BuildContext context) => Container(
        height: 216,
        padding: const EdgeInsets.only(top: 6.0),
        margin: EdgeInsets.only(
          bottom: MediaQuery.of(context).viewInsets.bottom,
        ),
        color: CupertinoColors.systemBackground.resolveFrom(context),
        child: SafeArea(
          top: false,
          child: Column(
            children: [
              Expanded(
                flex: 1,
                child: SizedBox(
                  height: 40,
                  child: Row(
                    mainAxisAlignment: MainAxisAlignment.spaceBetween,
                    children: [
                      CupertinoButton(
                        child: Text(
                          'Cancel',
                          style: TextStyle(fontFamily: "JakartaMedium"),
                        ),
                        onPressed: () {
                          Navigator.pop(context);
                        },
                      ),
                      CupertinoButton(
                        child: Text(
                          'Done',
                          style: TextStyle(fontFamily: "JakartaMedium"),
                        ),
                        onPressed: () {
                          Navigator.pop(context);
                        },
                      ),
                    ],
                  ),
                ),
              ),
              Expanded(
                flex: 3,
                child: CupertinoDatePicker(
                  initialDateTime: _date ?? DateTime.now(),
                  mode: CupertinoDatePickerMode.date,
                  use24hFormat: true,
                  showDayOfWeek: true,
                  onDateTimeChanged: (DateTime newDate) {
                    setDate(newDate);
                  },
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }

  void onChangeName(value){
    _nameError = "";
    notifyListeners();
  }
  void onChangeDesignation(value){
    _designationError = "";
    notifyListeners();
  }
  void onChangeMobile(value){
    _mobileNumError = "";
    notifyListeners();
  }
  void onChangeAltMobile(value){
    _altMobError = "";
    notifyListeners();
  }
  void onChangeTelephone(value){
    _teleError = "";
    notifyListeners();
  }
  void onChangeEmailId(value){
    _emailError = "";
    notifyListeners();
  }

  void onChangeEditName(value){
    _editNameError = "";
    notifyListeners();
  }
  void onChangeEditDesignation(value){
    _editDesignationError = "";
    notifyListeners();
  }
  void onChangeEditMobile(value){
    _editMobileNumError = "";
    notifyListeners();
  }
  void onChangeEditAltMobile(value){
    _editAltMobError = "";
    notifyListeners();
  }
  void onChangeEditTelephone(value){
    _editTeleError = "";
    notifyListeners();
  }
  void onChangeEditEmailId(value){
    _editEmailError = "";
    notifyListeners();
  }
  void onChangeNote(value){
    _noteError = "";
    notifyListeners();
  }

  void resetAll(){
    nameController.clear();
    designationController.clear();
    mobileNumberController.clear();
    alternativeMobileController.clear();
    telephoneController.clear();
    emailController.clear();
    editNameController.clear();
    editDesignationController.clear();
    editMobileNumberController.clear();
    editAlternativeMobileController.clear();
    editTelephoneController.clear();
    editEmailController.clear();
    _nameError = "";
    _designationError = "";
    _mobileNumError = "";
    _altMobError = "";
    _teleError = "";
    _emailError = "";
    _editNameError = "";
    _editDesignationError = "";
    _editMobileNumError = "";
    _editAltMobError = "";
    _editTeleError = "";
    _editEmailError = "";
    notifyListeners();
  }
}
