import 'dart:convert'; import 'dart:io'; import 'package:manager_api/api.dart'; import 'package:mymuseum_visitapp/Helpers/DatabaseHelper.dart'; import 'package:mymuseum_visitapp/Helpers/networkCheck.dart'; import 'package:mymuseum_visitapp/Models/resourceModel.dart'; import 'package:mymuseum_visitapp/Models/visitContext.dart'; import 'package:mymuseum_visitapp/app_context.dart'; import 'package:mymuseum_visitapp/client.dart'; class ApiService { static Future?> getConfigurations(Client client, VisitAppContext? visitAppContext) async { try { List? configurations; bool isOnline = await hasNetwork(); if(isOnline) { configurations = await client.configurationApi!.configurationGet(instanceId: visitAppContext?.instanceId); if(configurations != null) { if(configurations.isNotEmpty) { for(var configuration in configurations) { if(configuration.imageId != null) { await downloadAndPushLocalImage(client, ImageDTO(source_: configuration.imageSource, resourceId: configuration.imageId)); } } } } } else { return []; } return configurations; } catch (e) { print(e); print("getConfigurations IN CATCH"); return []; } } static Future?> getAllSections(Client client, String configurationId) async { try { bool isOnline = await hasNetwork(); if(isOnline) { List? sections = await client.sectionApi!.sectionGetFromConfiguration(configurationId); return sections; } else { return []; // TODO return local list.. } } catch (e) { print(e); print("getAllSections IN CATCH"); return []; } } static Future?> getAllBeacons(Client client, String instanceId) async { try { bool isOnline = await hasNetwork(); if(isOnline) { List? sections = await client.sectionApi!.sectionGetAllBeaconsForInstance(instanceId); return sections; } else { return []; // TODO return local list.. } } catch (e) { print(e); print("getAllSections IN CATCH"); return []; } } static Future downloadAndPushLocalImage(Client client, ImageDTO imageDTO) async { try { // Test if already here or not.. List> resourceTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, imageDTO.resourceId!); if(resourceTest.isNotEmpty) { return true; } else { bool isOnline = await hasNetwork(); if(isOnline) { ResourceModel? resourceModel = await downloadImage(client, imageDTO); if(resourceModel != null) { await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap()); } return true; } else { return false; } } } catch (e) { print(e); print("getAndDownloadImage IN CATCH"); return false; } } static Future downloadImage(Client client, ImageDTO imageDTO) async { var source = imageDTO.source_; //print("SOURCE getAndDownloadImage"); //print(source); if(imageDTO.source_!.contains("localhost:5000")) { print("Contains localhost:5000"); source = imageDTO.source_!.replaceAll("http://localhost:5000", client.apiApi!.basePath); } HttpClient client2 = HttpClient(); var _downloadData = []; final HttpClientRequest request = await client2.getUrl(Uri.parse(source!)); //print("RESPONSE"); HttpClientResponse response = await request.close(); await for(dynamic d in response) { _downloadData.addAll(d); } //print("AFTER"); final base64Str = base64.encode(_downloadData); ResourceModel resourceModel = ResourceModel(id: imageDTO.resourceId, source: imageDTO.source_, data: base64Str, type: ResourceType.Image); return resourceModel; } static Future downloadAndPushLocalAudio(Client client, String audioId) async { try { // Test if already here or not.. List> resourceTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, audioId); if(resourceTest.isNotEmpty) { return true; } else { bool isOnline = await hasNetwork(); if(isOnline) { ResourceModel? resourceModel = await downloadAudio(client, audioId); if(resourceModel != null) { await DatabaseHelper.instance.insert(DatabaseTableType.resources, resourceModel.toMap()); } return true; } else { return false; } } } catch (e) { print(e); print("getAndDownloadAudio IN CATCH"); return false; } } static Future downloadAudio(Client client, String audioId) async { var url = "https://api.mymuseum.be/api/Resource/"+audioId; // TO TEST TODO UPDATE ROUTE HttpClient client2 = HttpClient(); var _downloadData = []; final HttpClientRequest request = await client2.getUrl(Uri.parse(url)); HttpClientResponse response = await request.close(); await for(dynamic d in response) { _downloadData.addAll(d); } final base64Str = base64.encode(_downloadData); ResourceModel resourceModel = ResourceModel(id: audioId, data: base64Str, type: ResourceType.Audio, source: ""); return resourceModel; } static Future getResource(AppContext appContext, String imageId) async { if((appContext.getContext() as VisitAppContext).configuration == null || (appContext.getContext() as VisitAppContext).configuration!.isOffline!) { // OFFLINE List> resourceTest = await DatabaseHelper.instance.queryWithColumnId(DatabaseTableType.resources, imageId); if(resourceTest.isNotEmpty) { return DatabaseHelper.instance.getResourceFromDB(resourceTest.first); } else { return null; } } else { // ONLINE return ResourceModel(); // To mock } } }