import 'package:dio/dio.dart'; import 'package:get_it/get_it.dart'; import 'package:superport/core/constants/api_endpoints.dart'; import 'package:superport/core/errors/exceptions.dart'; import 'package:superport/data/datasources/remote/api_client.dart'; import 'package:superport/data/models/model/model_dto.dart'; abstract class ModelRemoteDataSource { Future getModels({ int page = 1, int perPage = 10, String? search, int? vendorId, bool? includeDeleted, }); Future createModel(CreateModelRequest request); Future getModelDetail(int id); Future updateModel(int id, UpdateModelRequest request); Future deleteModel(int id); Future restoreModel(int id); Future> getModelsByVendor(int vendorId); } class ModelRemoteDataSourceImpl implements ModelRemoteDataSource { final ApiClient _apiClient = GetIt.instance(); @override Future getModels({ int page = 1, int perPage = 10, String? search, int? vendorId, bool? includeDeleted, }) async { try { final queryParams = { 'page': page, 'per_page': perPage, }; if (search != null && search.isNotEmpty) { queryParams['search'] = search; } if (vendorId != null) { queryParams['vendor_id'] = vendorId; } if (includeDeleted != null) { queryParams['include_deleted'] = includeDeleted; } final response = await _apiClient.dio.get( ApiEndpoints.models, queryParameters: queryParams, ); if (response.statusCode == 200) { return ModelListDto.fromJson(response.data); } else { throw ServerException(message: '모델 목록 조회 실패: ${response.statusCode}'); } } on DioException catch (e) { throw ServerException(message: '네트워크 오류: ${e.message}'); } catch (e) { throw ServerException(message: '모델 목록 조회 실패: $e'); } } @override Future getModelDetail(int id) async { try { final response = await _apiClient.dio.get('${ApiEndpoints.models}/$id'); if (response.statusCode == 200) { return ModelDto.fromJson(response.data); } else { throw ServerException(message: '모델 상세 조회 실패: ${response.statusCode}'); } } on DioException catch (e) { throw ServerException(message: '네트워크 오류: ${e.message}'); } catch (e) { throw ServerException(message: '모델 상세 조회 실패: $e'); } } @override Future createModel(CreateModelRequest request) async { try { final response = await _apiClient.dio.post( ApiEndpoints.models, data: request.toJson(), ); if (response.statusCode == 201) { return ModelDto.fromJson(response.data); } else { throw ServerException(message: '모델 생성 실패: ${response.statusCode}'); } } on DioException catch (e) { throw ServerException(message: '네트워크 오류: ${e.message}'); } catch (e) { throw ServerException(message: '모델 생성 실패: $e'); } } @override Future updateModel(int id, UpdateModelRequest request) async { try { final response = await _apiClient.dio.put( '${ApiEndpoints.models}/$id', data: request.toJson(), ); if (response.statusCode == 200) { return ModelDto.fromJson(response.data); } else { throw ServerException(message: '모델 수정 실패: ${response.statusCode}'); } } on DioException catch (e) { throw ServerException(message: '네트워크 오류: ${e.message}'); } catch (e) { throw ServerException(message: '모델 수정 실패: $e'); } } @override Future deleteModel(int id) async { try { final response = await _apiClient.dio.delete('${ApiEndpoints.models}/$id'); if (response.statusCode != 200) { throw ServerException(message: '모델 삭제 실패: ${response.statusCode}'); } } on DioException catch (e) { throw ServerException(message: '네트워크 오류: ${e.message}'); } catch (e) { throw ServerException(message: '모델 삭제 실패: $e'); } } @override Future restoreModel(int id) async { try { final response = await _apiClient.dio.put('${ApiEndpoints.models}/$id/restore'); if (response.statusCode == 200) { return ModelDto.fromJson(response.data); } else { throw ServerException(message: '모델 복구 실패: ${response.statusCode}'); } } on DioException catch (e) { throw ServerException(message: '네트워크 오류: ${e.message}'); } catch (e) { throw ServerException(message: '모델 복구 실패: $e'); } } @override Future> getModelsByVendor(int vendorId) async { try { final response = await _apiClient.dio.get('${ApiEndpoints.modelsByVendor}/$vendorId'); if (response.statusCode == 200) { final List data = response.data; return data.map((json) => ModelDto.fromJson(json)).toList(); } else { throw ServerException(message: '제조사별 모델 조회 실패: ${response.statusCode}'); } } on DioException catch (e) { throw ServerException(message: '네트워크 오류: ${e.message}'); } catch (e) { throw ServerException(message: '제조사별 모델 조회 실패: $e'); } } }