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/company/company_dto.dart'; import 'package:superport/data/models/company/company_list_dto.dart'; import 'package:superport/data/models/company/branch_dto.dart'; abstract class CompanyRemoteDataSource { Future> getCompanies({ int page = 1, int perPage = 20, String? search, bool? isActive, }); Future createCompany(CreateCompanyRequest request); Future getCompanyDetail(int id); Future getCompanyWithBranches(int id); Future updateCompany(int id, UpdateCompanyRequest request); Future deleteCompany(int id); Future> getCompanyNames(); // Branch related methods Future createBranch(int companyId, CreateBranchRequest request); Future getBranchDetail(int companyId, int branchId); Future updateBranch(int companyId, int branchId, UpdateBranchRequest request); Future deleteBranch(int companyId, int branchId); Future> getCompanyBranches(int companyId); } class CompanyRemoteDataSourceImpl implements CompanyRemoteDataSource { final ApiClient _apiClient = GetIt.instance(); @override Future> getCompanies({ int page = 1, int perPage = 20, String? search, bool? isActive, }) async { try { final queryParams = { 'page': page, 'per_page': perPage, if (search != null) 'search': search, if (isActive != null) 'is_active': isActive, }; final response = await _apiClient.dio.get( ApiEndpoints.companies, queryParameters: queryParams, ); final List data = response.data['data']; return data.map((json) => CompanyListDto.fromJson(json)).toList(); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to fetch companies', code: e.response?.statusCode, ); } } @override Future createCompany(CreateCompanyRequest request) async { try { final response = await _apiClient.dio.post( ApiEndpoints.companies, data: request.toJson(), ); return CompanyResponse.fromJson(response.data['data']); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to create company', code: e.response?.statusCode, ); } } @override Future getCompanyDetail(int id) async { try { final response = await _apiClient.dio.get( '${ApiEndpoints.companies}/$id', ); return CompanyResponse.fromJson(response.data['data']); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to fetch company detail', code: e.response?.statusCode, ); } } @override Future getCompanyWithBranches(int id) async { try { final response = await _apiClient.dio.get( '${ApiEndpoints.companies}/$id/with-branches', ); return CompanyWithBranches.fromJson(response.data['data']); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to fetch company with branches', code: e.response?.statusCode, ); } } @override Future updateCompany(int id, UpdateCompanyRequest request) async { try { final response = await _apiClient.dio.put( '${ApiEndpoints.companies}/$id', data: request.toJson(), ); return CompanyResponse.fromJson(response.data['data']); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to update company', code: e.response?.statusCode, ); } } @override Future deleteCompany(int id) async { try { await _apiClient.dio.delete( '${ApiEndpoints.companies}/$id', ); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to delete company', code: e.response?.statusCode, ); } } @override Future> getCompanyNames() async { try { final response = await _apiClient.dio.get( '${ApiEndpoints.companies}/names', ); final List data = response.data['data']; return data.map((json) => CompanyNameDto.fromJson(json)).toList(); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to fetch company names', code: e.response?.statusCode, ); } } // Branch methods @override Future createBranch(int companyId, CreateBranchRequest request) async { try { final response = await _apiClient.dio.post( '${ApiEndpoints.companies}/$companyId/branches', data: request.toJson(), ); return BranchResponse.fromJson(response.data['data']); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to create branch', code: e.response?.statusCode, ); } } @override Future getBranchDetail(int companyId, int branchId) async { try { final response = await _apiClient.dio.get( '${ApiEndpoints.companies}/$companyId/branches/$branchId', ); return BranchResponse.fromJson(response.data['data']); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to fetch branch detail', code: e.response?.statusCode, ); } } @override Future updateBranch(int companyId, int branchId, UpdateBranchRequest request) async { try { final response = await _apiClient.dio.put( '${ApiEndpoints.companies}/$companyId/branches/$branchId', data: request.toJson(), ); return BranchResponse.fromJson(response.data['data']); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to update branch', code: e.response?.statusCode, ); } } @override Future deleteBranch(int companyId, int branchId) async { try { await _apiClient.dio.delete( '${ApiEndpoints.companies}/$companyId/branches/$branchId', ); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to delete branch', code: e.response?.statusCode, ); } } @override Future> getCompanyBranches(int companyId) async { try { final response = await _apiClient.dio.get( '${ApiEndpoints.companies}/$companyId/branches', ); final List data = response.data['data']; return data.map((json) => BranchListDto.fromJson(json)).toList(); } on DioException catch (e) { throw ServerException( message: e.response?.data['message'] ?? 'Failed to fetch company branches', code: e.response?.statusCode, ); } } }