import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:http/http.dart' as http; import 'package:nhance_app_pwa/customAppBar/toastHelper.dart'; import 'package:nhance_app_pwa/pages/service/TokenService.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'dart:convert'; import '../../../config/environment.dart'; import 'package:nhance_app_pwa/logger.dart'; class ApiService { final BuildContext context; String? _postToken; ApiService(this.context) { _initializeToken(); } Future _initializeToken() async { _postToken = await TokenService.getPostToken(); } Future> getActiveAndInactivePolicyDetails( String? clientId, String? empCode, String? status, String? branchID, String? mobileNo, String? emailId) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getEmployeeActiveOrInactivePolicy?client_id=${clientId ?? ''}&emp_code=${empCode ?? ''}&type=${status ?? ''}&client_branch_id=${branchID ?? ''}&mobile_no=${mobileNo ?? ''}&email_id=${emailId ?? ''}'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getClaimsHistoryToApi( String ticket_type_id) async { logDebug("getCashDepositDetailsToApi1"); logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}claimView?ticket_id=$ticket_type_id'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getAdvertisementImageToApi(clientID) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getAdvertisementImage?client_id=$clientID'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getCashlessAndReimbursementToApi() async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getFEContent'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getSelfEmployeeProfileDetails( String clientId, String empCode, String branchID) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getEmployeeProfile?emp_code=$empCode&client_id=$clientId&client_branch_id=$branchID'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } /// Dependent-add UI: policy details, family slots, and add_button_show. Future> getEmployeePolicy({ required String id, required String empCode, required String clientId, required String clientBranchId, required String clientPolicyId, }) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getEmployeeByPolicy?id=$id&emp_code=$empCode&client_id=$clientId&client_branch_id=$clientBranchId&client_policy_id=$clientPolicyId'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } /// Add or update dependent (creates with pending_approval). Future> addEmployeeAndDependence( List> dependents) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}addEmployeeAndDependence'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', 'Content-Type': 'application/json', }; final response = await _makePostRequestWithoutFormData( url, jsonEncode(dependents), headers, ); return response; } /// Soft-delete a dependent (status → deleted, is_active → 0). Future> deleteDependence(String dependentId) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}deleteDependence?id=$dependentId'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getFAQsApiData() async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}FAQ'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getTrackClaimsList( String empPrimaryId, mobileNo, emailID) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}get_ticket_data?emp_id=$empPrimaryId&mobile_number=$mobileNo&email_id=$emailID'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getTicketListByMobile(String empMobileNo) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}ticketList?mobile=$empMobileNo'); final url1 = Uri.parse('${Environment.apiUrl}ticketList?mobile=1234567890'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getTicketConverList(String thz_id) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url1 = Uri.parse('${Environment.apiUrl}ticketList?mobile=$thz_id'); final url = Uri.parse('${Environment.apiUrl}ticketConversationList?thz_id=$thz_id'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getInsurerClaimFormDownloadUrl( String clientPolicyId) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}getInsurerClaimFormDownloadUrl?client_policy_id=$clientPolicyId'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getWellnessLink( empPrimaryId, client_policy_id) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getWellnessURL?emp_id=$empPrimaryId'); // final url = Uri.parse('${Environment.apiUrl}getWellnessURL?emp_id=$empPrimaryId&client_policy_id=$client_policy_id'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getEcardRequest(eCardParam) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}ecardRequest'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', 'Content-Type': 'application/json', // Ensure content type is JSON }; final jsonBody = jsonEncode(eCardParam); // Send formDataJson as the body final response = await _makePostRequestWithoutFormData(url, jsonBody, headers); return response; } Future> sendRetailPolicyDetails(formData) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}addEmpRetailPolicy'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', 'Content-Type': 'application/json', // Ensure content type is JSON }; final jsonBody = jsonEncode(formData); // Send formDataJson as the body final response = await _makePostRequestWithoutFormData(url, jsonBody, headers); return response; } Future updateMobileNumber(Map updateParam) async { if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}updateMobileNumber'); final headers = { 'Authorization': 'Bearer $_postToken', 'Content-Type': 'application/json', }; final jsonBody = jsonEncode(updateParam); final response = await _makePostRequestWithoutFormData( url, jsonBody, headers, ); return response['status'] == 'success'; } Future> fetchPolicyTypeAndInsurer() async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getPolicyTypeAndInsurer'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> fetchDepartmentList( String clientId, String empCode) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse( '${Environment.apiUrl}get_ticket_type?client_id=$clientId&emp_code=$empCode'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> getClaimTypeMasterApi() async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getClaimTypeMaster'); final headers = { 'Authorization': 'Bearer $_postToken' ?? '', }; final response = await _makeGetRequest(url, headers); return response; } Future> sendTicketFormDataToApi( Map formData) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}ticketSave'); // Convert formData to Map Map stringFormData = formData.map((key, value) => MapEntry(key, value.toString())); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } Future> sendClaimsFormDataToApi( Map formData) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}initiateClaim'); // Convert formData to Map Map stringFormData = formData.map((key, value) => MapEntry(key, value.toString())); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } Future> sendClaimsMessageToApi( Map formData) async { logDebug(_postToken); if (_postToken == null) { await _initializeToken(); } logDebug("sendClaimsMessageToApi"); final url = Uri.parse('${Environment.apiUrl}ticketConversationSave'); // final url = Uri.parse('${Environment.apiUrlTicket}/messages/create'); // Convert formData to Map logDebug("sendClaimsMessageToApi1"); Map stringFormData = formData.map((key, value) => MapEntry(key, value.toString())); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } Future _clearLocalStorageAndRedirect() async { if (!context.mounted) return; await TokenService().logout(context); } Future> getBotDetails( Map formData) async { if (_postToken == null) { await _initializeToken(); } final url = Uri.parse('${Environment.apiUrl}getChatResponse'); // Convert formData to Map Map stringFormData = formData.map((key, value) => MapEntry(key, value.toString())); logDebug(url); final response = await _makePostRequest(url, stringFormData, { 'Content-Type': 'application/x-www-form-urlencoded', 'Authorization': 'Bearer $_postToken' ?? '', }); return response; } // Future> getBotDetails(String requestFor, is_option, // option, returnMessage, mobileNo, policyID) async { // logDebug('requestFor: $requestFor'); // logDebug('is_option: $is_option'); // logDebug('option: $option'); // logDebug('returnMessage: $returnMessage'); // logDebug('mobileNo: $mobileNo'); // logDebug('policyID: $policyID'); // if (_postToken == null) { // await _initializeToken(); // } // final url; // if (is_option != '0') { // url = Uri.parse( // '${Environment.apiUrl}getChatResponse?request_for=$requestFor&is_option=$is_option&option=$option&mobile_no=$mobileNo&policy_id=$policyID'); // } else { // url = Uri.parse( // '${Environment.apiUrl}getChatResponse?request_for=$requestFor&is_option=$is_option&text=$returnMessage&value=$option&mobile_no=$mobileNo&policy_id=$policyID'); // } // logDebug(url); // // final headers = { // 'Authorization': 'Bearer $_postToken' ?? '', // }; // final response = await _makeGetRequest(url, headers); // return response; // } Future> _makeGetRequest( Uri url, Map headers) async { // Always refresh token at request time to avoid using stale login tokens. if (headers.containsKey('Authorization')) { _postToken = await TokenService.getPostToken(); headers['Authorization'] = 'Bearer ${_postToken ?? ''}'; } // Add global APP_SIGNATURE header headers['APP-SIGNATURE'] = 'nhance-2025-signature-T8f6gV9k5fK2wf5V5c4vId3b0J8z6cAm2x8Y'; final response = await http.get(url, headers: headers); return _handleResponse(response); } Future> _makePostRequest( Uri url, Map body, Map headers) async { // Always refresh token at request time to avoid using stale login tokens. if (headers.containsKey('Authorization')) { _postToken = await TokenService.getPostToken(); headers['Authorization'] = 'Bearer ${_postToken ?? ''}'; } // Add global APP_SIGNATURE header headers['APP-SIGNATURE'] = 'nhance-2025-signature-T8f6gV9k5fK2wf5V5c4vId3b0J8z6cAm2x8Y'; final response = await http.post(url, headers: headers, body: body); return _handleResponse(response); } Future> _makePostRequestWithoutFormData( Uri url, String body, Map headers) async { // Always refresh token at request time to avoid using stale login tokens. if (headers.containsKey('Authorization')) { _postToken = await TokenService.getPostToken(); headers['Authorization'] = 'Bearer ${_postToken ?? ''}'; } // Add global APP_SIGNATURE header headers['APP-SIGNATURE'] = 'nhance-2025-signature-T8f6gV9k5fK2wf5V5c4vId3b0J8z6cAm2x8Y'; final response = await http.post(url, headers: headers, body: body); return _handleResponse(response); } Future> _handleResponse(http.Response response) async { if (response.statusCode == 200) { return jsonDecode(response.body); } else if (response.statusCode == 401) { await _clearLocalStorageAndRedirect(); return {}; } else if (response.statusCode == 403) { await _clearLocalStorageAndRedirect(); return {}; } else if (response.statusCode == 451) { final body = jsonDecode(response.body); final message = body['message']; ToastHelper.showWarningToast(context, message); return {}; } else if (response.statusCode == 429) { final body = jsonDecode(response.body); final message = body['message']; ToastHelper.showWarningToast(context, message); return {}; } else { // Return API error payload when available so callers can show messages. try { final decoded = jsonDecode(response.body); if (decoded is Map) { return decoded; } } catch (_) {} throw Exception('Failed to load data'); } } }