import 'package:dio/dio.dart'; import '../core/api/api_client.dart'; import '../core/device/device_id.dart'; import '../core/exceptions.dart'; import '../models/license.dart'; class LicenseRepository { final ApiClient _client; const LicenseRepository(this._client); Future getInfo() async { try { final resp = await _client.get('/license/info'); final data = resp.data['data']; if (data == null) return null; return LicenseInfo.fromJson(data as Map); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '获取授权信息失败', statusCode: e.response?.statusCode, ); } } /// Activate a license key for this device. Future activate(String licenseKey, {String? deviceName}) async { final deviceId = await DeviceId.get(); try { await _client.post('/license/activate', data: { 'license_key': licenseKey, 'device_id': deviceId, 'device_name': deviceName ?? DeviceId.platformName, 'platform': DeviceId.platformName, }); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '激活失败', statusCode: e.response?.statusCode, ); } } /// 在线购买/续费下单(仅管理员),返回 pay 收银台跳转信息。 Future createPurchase(String bizCode) async { try { final resp = await _client.post('/license/purchase', data: {'biz_code': bizCode}); return PurchaseOrder.fromJson(resp.data['data'] as Map); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '下单失败,请稍后重试', statusCode: e.response?.statusCode, ); } } /// 查询购买单状态(到账轮询)。到账(paid)后返回续期后的授权到期时间。 Future purchaseStatus(String outTradeNo) async { try { final resp = await _client.get('/license/purchase/$outTradeNo'); return PurchaseStatusInfo.fromJson( resp.data['data'] as Map); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '查询订单状态失败', statusCode: e.response?.statusCode, ); } } /// 本店首月特惠是否已享用(购买弹窗据此置灰特惠档)。 Future promoUsed() async { try { final resp = await _client.get('/license/promo-status'); final data = resp.data['data'] as Map?; return data?['used'] as bool? ?? false; } on DioException { // 查询失败不阻塞弹窗:按未享用展示,下单时服务端仍会强校验 return false; } } /// Deactivate (unbind) this device from its license. Future deactivate() async { final deviceId = await DeviceId.get(); try { await _client.post('/license/deactivate', data: {'device_id': deviceId}); } on DioException catch (e) { throw AppException( e.response?.data?['error'] as String? ?? '解绑失败', statusCode: e.response?.statusCode, ); } } }