import ' dart:async ' ;
import ' dart:developer ' ;
import ' package:appinio_swiper/appinio_swiper.dart ' ;
import ' package:easy_localization/easy_localization.dart ' ;
import ' package:flutter/cupertino.dart ' ;
import ' package:flutter/material.dart ' ;
import ' package:mohem_flutter_app/api/marathon/demo_marathon_repo.dart ' ;
import ' package:mohem_flutter_app/classes/utils.dart ' ;
import ' package:mohem_flutter_app/config/routes.dart ' ;
import ' package:mohem_flutter_app/models/disclosure/disclosure_details_model.dart ' ;
import ' package:mohem_flutter_app/models/disclosure/disclosure_question_model.dart ' ;
import ' package:mohem_flutter_app/ui/disclosure/widgets/disclosure_question_card.dart ' ;
class DisclosureProvider extends ChangeNotifier {
//************************************************ VARIABLES **********************************************************
final AppinioSwiperController swiperController = AppinioSwiperController ( ) ;
DisclosureQuestionsOptionStatus currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus . unSelected ;
DisclosureDetailsModel disclosureDetailsModel = DisclosureDetailsModel ( ) ;
List < DisclosureCardContent > cardContentList = < DisclosureCardContent > [ ] ;
DisclosureQuestionModel currentQuestion = DisclosureQuestionModel ( ) ;
List < DisclosureQuestionCardStatus > answerStatusesList = < DisclosureQuestionCardStatus > [ ] ;
DisclosureQuestionCardStatus questionCardStatus = DisclosureQuestionCardStatus . question ;
int ? selectedOptionIndex ;
String ? selectedOptionId ;
int ? totalQualifiers ;
Locale savedLocale = const Locale ( " en " , " US " ) ;
bool iAmWinner = false ;
bool isGettingQualifiers = false ;
bool isPrivilegedWithMarathon = false ;
bool _isLoading = false ;
bool get isLoading = > _isLoading ;
set isLoading ( bool value ) {
_isLoading = value ;
notifyListeners ( ) ;
}
bool _isButtonEnabled = false ;
bool get isButtonEnabled = > _isButtonEnabled ;
set isButtonEnabled ( bool value ) {
_isButtonEnabled = value ;
notifyListeners ( ) ;
}
int _currentQuestionNumber = 0 ;
int get currentQuestionNumber = > _currentQuestionNumber ;
set currentQuestionNumber ( int value ) {
_currentQuestionNumber = value ;
notifyListeners ( ) ;
}
String currentAdditionalText = " " ;
void updateCurrentAdditionalText ( String value ) {
currentAdditionalText = value ;
notifyListeners ( ) ;
}
void updateCurrentSelectionYesNo ( DisclosureQuestionsOptionStatus value ) {
currentQuestionSelectionStatus = value ;
notifyListeners ( ) ;
}
//************************************************ FUNCTIONS **********************************************************
Future < void > callNextQuestionApi ( ) async {
if ( currentQuestionNumber < ( disclosureDetailsModel . totalQuestions ! ) ) {
if ( currentQuestionNumber = = 0 ) {
for ( int i = 1 ; i < = disclosureDetailsModel . totalQuestions ! ; i + + ) {
cardContentList . add ( const DisclosureCardContent ( ) ) ;
}
currentQuestion = await DisclosureRepo ( ) . getDisclosureNextQuestion ( currentQuestionNumber: currentQuestionNumber ) ;
updateCardData ( ) ;
if ( Utils . isLoading ) {
Utils . hideLoading ( AppRoutes . navigatorKey . currentContext ! ) ;
}
Navigator . pushReplacementNamed ( AppRoutes . navigatorKey . currentContext ! , AppRoutes . disclosureScreen ) ;
} else {
currentQuestion = await DisclosureRepo ( ) . getDisclosureNextQuestion ( currentQuestionNumber: currentQuestionNumber ) ;
updateCardData ( ) ;
}
notifyListeners ( ) ;
}
}
Future < void > callPreviousQuestionApi ( ) async {
currentQuestion = await DisclosureRepo ( ) . getDisclosureNextQuestion ( currentQuestionNumber: currentQuestionNumber - 2 ) ;
updateCardData ( isForPrevious: true ) ;
notifyListeners ( ) ;
}
void updateCardData ( { bool isForPrevious = false } ) {
if ( isForPrevious ) {
selectedOptionIndex = null ;
currentQuestionNumber - - ;
cardContentList . add ( const DisclosureCardContent ( ) ) ;
cardContentList . add ( const DisclosureCardContent ( ) ) ;
swiperController . swipeLeft ( ) ;
questionCardStatus = DisclosureQuestionCardStatus . question ;
notifyListeners ( ) ;
return ;
}
if ( currentQuestionNumber > 0 ) {
swiperController . swipeRight ( ) ;
}
selectedOptionIndex = null ;
currentQuestionNumber + + ;
questionCardStatus = DisclosureQuestionCardStatus . question ;
notifyListeners ( ) ;
}
void populateQuestionStatusesList ( ) {
answerStatusesList . clear ( ) ;
if ( disclosureDetailsModel . totalQuestions ! = null ) {
for ( int i = 0 ; i < disclosureDetailsModel . totalQuestions ! ; i + + ) {
answerStatusesList . add ( DisclosureQuestionCardStatus . question ) ;
}
notifyListeners ( ) ;
}
}
void updateCurrentQuestionOptionStatus ( { required DisclosureQuestionsOptionStatus status , required int selectedOptIndex , required int correctOptionIndex } ) {
if ( selectedOptIndex = = 0 ) {
updateCurrentSelectionYesNo ( DisclosureQuestionsOptionStatus . correct ) ;
} else if ( selectedOptIndex = = 1 ) {
updateCurrentSelectionYesNo ( DisclosureQuestionsOptionStatus . wrong ) ;
}
for ( int i = 0 ; i < currentQuestion . questionOptions ! . length ; i + + ) {
currentQuestion . questionOptions ! [ i ] . optionStatus = DisclosureQuestionsOptionStatus . unSelected ;
}
if ( status = = DisclosureQuestionsOptionStatus . wrong ) {
currentQuestion . questionOptions ! [ correctOptionIndex ] . optionStatus = DisclosureQuestionsOptionStatus . correct ; // if person's answer is wrong we have to show him the actual right answer
}
currentQuestion . questionOptions ! [ selectedOptIndex ] . optionStatus = status ;
selectedOptionId = currentQuestion . questionOptions ! [ selectedOptIndex ] . id ;
selectedOptionIndex = selectedOptIndex ;
notifyListeners ( ) ;
}
void updateQuestionCardStatus ( DisclosureQuestionCardStatus status ) {
questionCardStatus = status ;
notifyListeners ( ) ;
}
void updateAnswerStatusesList ( DisclosureQuestionCardStatus status ) {
answerStatusesList [ currentQuestionNumber - 1 ] = status ;
notifyListeners ( ) ;
}
void resetValues ( ) async {
_currentQuestionNumber = 0 ;
iAmWinner = false ;
cardContentList . clear ( ) ;
isButtonEnabled = false ;
currentQuestion = DisclosureQuestionModel ( ) ;
if ( answerStatusesList . isNotEmpty ) {
for ( int i = 0 ; i < answerStatusesList . length ; i + + ) {
answerStatusesList [ i ] = DisclosureQuestionCardStatus . question ;
}
}
currentQuestionSelectionStatus = DisclosureQuestionsOptionStatus . unSelected ;
AppRoutes . navigatorKey . currentContext ! . setLocale ( savedLocale ) ;
notifyListeners ( ) ;
}
Future < void > getDisclosureDetails ( ) async {
isLoading = true ;
notifyListeners ( ) ;
disclosureDetailsModel = await DisclosureRepo ( ) . getDisclosureDetails ( ) ;
populateQuestionStatusesList ( ) ;
isLoading = false ;
notifyListeners ( ) ;
}
Future < void > onStartDisclosurePressed ( BuildContext context ) async {
await callNextQuestionApi ( ) ;
}
}