import 'package:briessenchecker/services/checklist_provider.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:flutter_dotenv/flutter_dotenv.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; import '../models/checklist.dart'; import '../models/listitem.dart'; import 'package:provider/provider.dart' as provider; class DbHelper { static const checkedItemsTableName = 'checkedItems'; static const checklistsTableName = 'checklists'; static ChecklistProvider? clProvider; static const itemsTableName = 'items'; static late final SupabaseClient _client; static Future init() async { await Supabase.initialize( url: dotenv.env['SUPABASE_URL'] ?? '', anonKey: dotenv.env['SUPABASE_ANON'] ?? ''); _client = Supabase.instance.client; } static void initStreams(BuildContext context) { clProvider = provider.Provider.of(context, listen: false); } static Future login(String email, String password) async { // email = 'sites@skup.in'; // password = 'pass'; await _client.auth.signInWithPassword( email: email, password: password, ); } static Future logout() async { await _client.auth.signOut(); } static Future> get fetchChecklist async { List checklists = []; final res = await _client .from(checklistsTableName) .select>>(); for (final element in res) { Checklist cl = Checklist( element['id'], element['owner_id'], element['title'], element['description'], DateTime.parse(element['created_time']), ); checklists.add(cl); } return checklists; } static Future> fetchcheckedItemIds(int checklistId) async { List itemIdList = []; final res = await _client .from(checkedItemsTableName) .select>>('item_id'); for (final element in res) { itemIdList.add(element['item_id']); } return itemIdList; } static Future insertCheckedEntry(int checklistId, int itemId) async { final ownerId = _client.auth.currentSession!.user.id; await _client.from(checkedItemsTableName).insert({ 'id': ownerId, 'checklist_id': checklistId, 'item_id': itemId, }); } static Future updateChecklistTitle(int id, String title) async { await _client .from(checklistsTableName) .update({'title': title}).eq('id', id); } /// returns id of newly created checklist static Future addOrUpdateChecklist(Checklist? checklist) async { final ownerId = _client.auth.currentSession!.user.id; Map upsertMap = { 'owner_id': ownerId, }; if (checklist != null) { List> entries = [ MapEntry('id', checklist.id), MapEntry('title', checklist.title), MapEntry('description', checklist.description), ]; upsertMap.addEntries(entries); } final res = await _client .from('checklists') .upsert(upsertMap) .select>>('id'); return res.last['id'] as int; } static Future addOrUpdateItem( int checklistId, String title, String description, int? itemId, ) async { try { final ownerId = _client.auth.currentSession!.user.id; Map upsertMap = { 'checklist_id': checklistId, 'owner_id': ownerId, 'title': title, 'description': description, }; if (itemId != null) { upsertMap.addEntries([ MapEntry('id', itemId), ]); } await _client.from(itemsTableName).upsert(upsertMap); } catch (e) { if (kDebugMode) { print(e); } } } static Future> getItemsByChecklistId(int checklistId) async { final List items = []; final itemRes = await _client .from(itemsTableName) .select>>() .eq('checklist_id', checklistId); for (final item in itemRes) { items.add( Item( item['id'], item['owner_id'], item['title'], item['description'], DateTime.parse(item['created_time']), null, ), ); } return items; } static Future getChecklistById(int id) async { final checklistRes = await _client .from(checklistsTableName) .select>() .eq('id', id) .single(); return Checklist( checklistRes['id'], checklistRes['owner_id'], checklistRes['title'], checklistRes['description'], DateTime.parse(checklistRes['created_time']), ); } static Future deleteCheckedEntry(int checklistId, int itemId) async { final ownerId = _client.auth.currentSession!.user.id; await _client.from(checkedItemsTableName).delete().match({ 'id': ownerId, 'checklist_id': checklistId, 'item_id': itemId, }); } static Future deleteItemById(int id) async { await _client.from(itemsTableName).delete().eq('id', id); } static Future deleteItemsById(List ids) async { await _client.from(itemsTableName).delete().in_('id', ids); } static Future deleteChecklistByid(int id) async { await _client.from(itemsTableName).delete().eq('checklist_id', id); await _client.from(checkedItemsTableName).delete().eq('checklist_id', id); await _client.from(checklistsTableName).delete().eq('id', id); } static Stream get authChangeEventStream => _client.auth.onAuthStateChange; static Stream>> get checklistChangeEventStream => _client.from(checklistsTableName).stream(primaryKey: ['id']); static Stream>> get selectedChecklistChangeEventStreamById => _client .from(checklistsTableName) .stream(primaryKey: ['id']).eq('id', clProvider?.selectedChecklistId); static Stream>> get itemsChangeEventStream => _client.from(itemsTableName).stream(primaryKey: ['id']).eq( 'checklist_id', clProvider?.selectedChecklistId); static List resToChecklistList(List> res) { List checklists = []; for (final element in res) { Checklist cl = Checklist( element['id'], element['owner_id'], element['title'], element['description'], DateTime.parse(element['created_time']), ); checklists.add(cl); } return checklists; } static List resToItemList(List> res) { final List items = []; for (final item in res) { items.add( Item( item['id'], item['owner_id'], item['title'], item['description'], DateTime.parse(item['created_time']), null, ), ); } return items; } }