import 'package:flutter/cupertino.dart';
import 'package:flutter/foundation.dart';
import 'package:intl/intl.dart';
import 'package:provider/provider.dart';

import '../../Models/crmModels/LeadDetailsResponse.dart';
import '../../Utils/app_colors.dart';
import '../../services/api_calling.dart';
import '../HomeScreenNotifier.dart';

class crmLeadDetailsProvider extends ChangeNotifier {

  bool _isLoading = false;
  bool _showMoreDetails = false;

  var _showEditButton;
  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;

  LeadDetails _leadDetails = LeadDetails();
  AccountDetails _accountDetails = AccountDetails();
  List<LeadProducts> _leadProducts = [];
  List<ContactDetails> _contactDetails = [];
  List<FollowupDetails> _followupDetails = [];
  List<AppointmentDetails> _appointmentDetails = [];
  List<QuotationsDetails> _quotationsDetails = [];
  List<String> _visitTypes = [];
  String? _selectedVisitType;
  List<String> _headings = [];
  List<String> _subHeadings = [];
  DateTime? _date;
  String? _formattedDate;
  String? _visitTypeError = "";

  get showEditButton => _showEditButton;
  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 visitTypeError => _visitTypeError;

  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;
  bool get showMoreDetails => _showMoreDetails;

  List<String> get visitTypes => _visitTypes;
  String? get selectedVisitType => _selectedVisitType;
  LeadDetails get leadDetails => _leadDetails;

  AccountDetails get accountDetails => _accountDetails;

  List<LeadProducts> get leadProducts => _leadProducts;

  List<ContactDetails> get contactDetails => _contactDetails;

  List<FollowupDetails> get followupDetails => _followupDetails;

  List<AppointmentDetails> get appointmentDetails => _appointmentDetails;

  List<QuotationsDetails> get quotationsDetails => _quotationsDetails;

  // List<String> get Headings => _headings;
  //
  // List<String> get subHeadings => _subHeadings;

  String? get formattedDate => _formattedDate;

  set selectedVisitType(String? value){
    _selectedVisitType = value;
    _visitTypeError = "";
    notifyListeners();
  }

  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 showMoreDetails(bool value){
    _showMoreDetails = 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> crmLeadDetailsAPIFunction(context, leadID, mode) async {
    try {
      var HomeProv = Provider.of<HomescreenNotifier>(context, listen: false);
      final data = await ApiCalling.crmLeadDetailsAPI(
        HomeProv.empId,
        HomeProv.session,
        leadID,
        mode,
      );
      _isLoading = true;
      notifyListeners();
      if (data != null) {
        if (data.error == "0") {
          _leadDetails = data.leadDetails!;
          _accountDetails = data.accountDetails!;
          _leadProducts = data.leadProducts!;
          _contactDetails = data.contactDetails!;
          _followupDetails = data.followupDetails!;
          _appointmentDetails = data.appointmentDetails!;
          _quotationsDetails = data.quotationsDetails!;
          _showEditButton = data.showEditAccountButton;
          _visitTypes = ["Phone","Visit"];
          _isLoading = false;
          notifyListeners();
        }else{
          _isLoading = false;
          notifyListeners();
        }
      }else{
        _isLoading = false;
        notifyListeners();
      }
    } catch (e, s) {
      _isLoading = false;
      notifyListeners();
    }
  }

  Future<void> crmLeadDetailsAddContactAPIFunction(context, accID) async {
    try {
      var prov = Provider.of<HomescreenNotifier>(context, listen: false);
      final data = await ApiCalling.crmLeadDetailsAddContactAPI(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> crmLeadDetailsEditContactAPIFunction(context,contactID) async {
    try {
      var prov = Provider.of<HomescreenNotifier>(context, listen: false);
      final data = await ApiCalling.crmLeadDetailsEditContactAPI(prov.empId, prov.session, contactID,
          nameController.text, 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();
    }
  }

  Future<void> crmLeadDetailsAddAppointmentAPIFunction(context, leadID, appointmentDate, appointmentType, note) async {
    try {
      var prov = Provider.of<HomescreenNotifier>(context, listen: false);
      final data = await ApiCalling.crmLeadDetailsAddAppointmentAPI(prov.empId, prov.session, leadID, appointmentDate, appointmentType, note);
      _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",color: AppColors.app_blue),
                        ),
                        onPressed: () {
                          Navigator.pop(context);
                        },
                      ),
                      CupertinoButton(
                        child: Text(
                          'Done',
                          style: TextStyle(fontFamily: "JakartaMedium",color: AppColors.app_blue),
                        ),
                        onPressed: () {
                          Navigator.pop(context);
                        },
                      ),
                    ],
                  ),
                ),
              ),
              Expanded(
                flex: 3,
                child: CupertinoDatePicker(
                  dateOrder: DatePickerDateOrder.dmy,
                  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();
  }
}
