import 'dart:convert'; import 'package:http/http.dart' as http; import '../core/constants.dart'; import '../models/member.dart'; import 'auth_service.dart'; import 'member_repository.dart'; export 'member_repository.dart'; class MemberService implements MemberRepository { final _auth = AuthService(); Future> _headers() async { final token = await _auth.getToken(); return { if (token != null) 'Authorization': 'Bearer $token', 'Accept': 'application/json', }; } Future _fetch(String url) async { final res = await http.get(Uri.parse(url), headers: await _headers()); if (res.statusCode == 200) { return Member.fromJson(jsonDecode(res.body) as Map); } throw Exception('Error ${res.statusCode}'); } @override Future first() => _fetch('$kApiBase/members/first'); @override Future last() => _fetch('$kApiBase/members/last'); @override Future show(int id) => _fetch('$kApiBase/members/$id'); @override Future prev(int id) => _fetch('$kApiBase/members/$id/prev'); @override Future next(int id) => _fetch('$kApiBase/members/$id/next'); @override Future> search(String term) async { final uri = Uri.parse('$kApiBase/members/search') .replace(queryParameters: {'term': term}); final res = await http.get(uri, headers: await _headers()); if (res.statusCode == 200) { final data = jsonDecode(res.body) as Map; return data.map((k, v) => MapEntry(k, v.toString())); } return {}; } Future> _postHeaders() async => {...await _headers(), 'Content-Type': 'application/json'}; // POST → respuesta con clave "member" Future _postWrapped(String path, Map body) async { final res = await http.post(Uri.parse('$kApiBase/$path'), headers: await _postHeaders(), body: jsonEncode(body)); if (res.statusCode == 200) { final data = jsonDecode(res.body) as Map; return Member.fromJson(data['member'] as Map); } throw Exception('Error ${res.statusCode}'); } // POST → respuesta es directamente el objeto member Future _postDirect(String path, Map body) async { final res = await http.post(Uri.parse('$kApiBase/$path'), headers: await _postHeaders(), body: jsonEncode(body)); if (res.statusCode == 200) { return Member.fromJson(jsonDecode(res.body) as Map); } throw Exception('Error ${res.statusCode}'); } @override Future paidCaution(int id) => _postDirect('members/paid-caution', {'pk_i_id': id}); @override Future retener(int id) => _postWrapped('members/retener', {'member': id}); @override Future retenerCancel(int id) => _postWrapped('members/retener-cancel', {'member': id}); @override Future recover(int id) => _postDirect('members/recover', {'pk_i_id': id}); @override Future> preDelete(int id) async { final res = await http.post(Uri.parse('$kApiBase/members/pre-delete'), headers: await _postHeaders(), body: jsonEncode({'pk_i_id': id})); if (res.statusCode == 200) { final data = jsonDecode(res.body) as Map; return { 'pendientes': (data['pendientes'] as num).toInt(), 'devueltos': (data['devueltos'] as num).toInt(), 'revision': (data['revision'] as num).toInt(), }; } throw Exception('Error ${res.statusCode}'); } @override Future delete(int id, String unregDate, String unregReason) => _postDirect('members/delete', { 'pk_i_id': id, 'd_unreg_date': unregDate, 's_unreg_reason': unregReason, }); }