import 'package:flutter/foundation.dart'; import 'package:get_it/get_it.dart'; import 'package:injectable/injectable.dart'; import 'package:superport/core/errors/exceptions.dart'; import 'package:superport/core/errors/failures.dart'; import 'package:superport/data/datasources/remote/warehouse_remote_datasource.dart'; import 'package:superport/data/models/common/paginated_response.dart'; import 'package:superport/data/models/warehouse/warehouse_dto.dart'; import 'package:superport/models/warehouse_location_model.dart'; @lazySingleton class WarehouseService { final WarehouseRemoteDataSource _remoteDataSource = GetIt.instance(); // 창고 위치 목록 조회 Future> getWarehouseLocations({ int page = 1, int perPage = 20, bool? isActive, String? search, bool includeInactive = false, }) async { try { final response = await _remoteDataSource.getWarehouseLocations( page: page, perPage: perPage, isActive: isActive, search: search, includeInactive: includeInactive, ); return PaginatedResponse( items: response.items.map((dto) => _convertDtoToWarehouseLocation(dto)).toList(), page: response.page, size: response.perPage, totalElements: response.total, totalPages: response.totalPages, first: response.page == 1, last: response.page >= response.totalPages, ); } on ApiException catch (e) { debugPrint('[WarehouseService] ApiException: ${e.message}'); throw ServerFailure(message: e.message); } catch (e, stackTrace) { debugPrint('[WarehouseService] Error loading warehouse locations: $e'); debugPrint('[WarehouseService] Stack trace: $stackTrace'); throw ServerFailure(message: '창고 위치 목록을 불러오는 데 실패했습니다: $e'); } } // 창고 위치 상세 조회 Future getWarehouseLocationById(int id) async { try { final dto = await _remoteDataSource.getWarehouseLocationById(id); return _convertDtoToWarehouseLocation(dto); } on ApiException catch (e) { throw ServerFailure(message: e.message); } catch (e) { throw ServerFailure(message: '창고 위치 정보를 불러오는 데 실패했습니다: $e'); } } // 창고 위치 생성 Future createWarehouseLocation(WarehouseLocation location) async { try { final request = CreateWarehouseLocationRequest( name: location.name, address: location.address, // 단일 문자열 주소 managerName: location.managerName, managerPhone: location.managerPhone, capacity: location.capacity, remark: location.remark, ); final dto = await _remoteDataSource.createWarehouseLocation(request); return _convertDtoToWarehouseLocation(dto); } on ApiException catch (e) { throw ServerFailure(message: e.message); } catch (e) { throw ServerFailure(message: '창고 위치 생성에 실패했습니다: $e'); } } // 창고 위치 수정 Future updateWarehouseLocation(WarehouseLocation location) async { try { final request = UpdateWarehouseLocationRequest( name: location.name, address: location.address, // 단일 문자열 주소 managerName: location.managerName, managerPhone: location.managerPhone, capacity: location.capacity, remark: location.remark, ); final dto = await _remoteDataSource.updateWarehouseLocation(location.id, request); return _convertDtoToWarehouseLocation(dto); } on ApiException catch (e) { throw ServerFailure(message: e.message); } catch (e) { throw ServerFailure(message: '창고 위치 수정에 실패했습니다: $e'); } } // 창고 위치 삭제 Future deleteWarehouseLocation(int id) async { try { await _remoteDataSource.deleteWarehouseLocation(id); } on ApiException catch (e) { throw ServerFailure(message: e.message); } catch (e) { throw ServerFailure(message: '창고 위치 삭제에 실패했습니다: $e'); } } // 창고별 장비 목록 조회 Future>> getWarehouseEquipment( int warehouseId, { int page = 1, int perPage = 20, }) async { try { final response = await _remoteDataSource.getWarehouseEquipment( warehouseId, page: page, perPage: perPage, ); return response.items.map((dto) => { 'id': dto.id, 'equipmentNumber': dto.equipmentNumber, 'manufacturer': dto.manufacturer, 'equipmentName': dto.equipmentName, 'serialNumber': dto.serialNumber, 'quantity': dto.quantity, 'status': dto.status, 'storedAt': dto.storedAt, }).toList(); } on ApiException catch (e) { throw ServerFailure(message: e.message); } catch (e) { throw ServerFailure(message: '창고 장비 목록을 불러오는 데 실패했습니다: $e'); } } // 창고 용량 정보 조회 Future getWarehouseCapacity(int id) async { try { return await _remoteDataSource.getWarehouseCapacity(id); } on ApiException catch (e) { throw ServerFailure(message: e.message); } catch (e) { throw ServerFailure(message: '창고 용량 정보를 불러오는 데 실패했습니다: $e'); } } // 사용 중인 창고 위치 목록 조회 Future> getInUseWarehouseLocations() async { try { final dtos = await _remoteDataSource.getInUseWarehouseLocations(); return dtos.map((dto) => _convertDtoToWarehouseLocation(dto)).toList(); } on ApiException catch (e) { throw ServerFailure(message: e.message); } catch (e) { throw ServerFailure(message: '사용 중인 창고 위치를 불러오는 데 실패했습니다: $e'); } } // DTO를 Flutter 모델로 변환 (백엔드 API 호환) WarehouseLocation _convertDtoToWarehouseLocation(WarehouseLocationDto dto) { return WarehouseLocation( id: dto.id, name: dto.name, address: dto.address, // 단일 문자열 주소 managerName: dto.managerName, managerPhone: dto.managerPhone, capacity: dto.capacity, remark: dto.remark, isActive: dto.isActive, createdAt: dto.createdAt, ); } // 페이지네이션 정보 Future getTotalWarehouseLocations({bool? isActive}) async { try { final response = await _remoteDataSource.getWarehouseLocations( page: 1, perPage: 1, isActive: isActive, ); return response.total; } catch (e) { return 0; } } }