import 'dart:convert';
import 'package:flutter/foundation.dart';
import 'package:flutter/services.dart' show rootBundle;
import 'package:smtias_capture/models/preview_region.dart';
/// `assets/config/preview_region.json` を読み込み,
/// プレビュークロップ領域([PreviewRegion])を提供するサービス.
///
/// ロード優先順位:
/// 1. assets の `preview_region.json` が valid ならそれを使用
/// 2. 読み込み失敗・不正値なら [PreviewRegion.full] にフォールバック
class PreviewRegionService {
static const _assetPath = 'assets/config/preview_region.json';
/// config を読み込んでプレビュー領域を返す.
///
/// 優先順位: assets → [PreviewRegion.full].
/// assets 読み込み失敗・不正値なら [PreviewRegion.full] にフォールバックする.
Future<PreviewRegion> load() async {
// (1) assets ファイル
final assetsRegion = await _loadAssets();
if (assetsRegion != null) {
return assetsRegion;
}
// (2) フォールバック
return PreviewRegion.full;
}
/// assets ファイルから読み込む.読み込み失敗・不正値なら null を返す.
Future<PreviewRegion?> _loadAssets() async {
try {
final raw = await rootBundle.loadString(_assetPath);
final decoded = json.decode(raw);
if (decoded is! Map<String, Object?>) {
return null;
}
final regionJson = decoded['preview_region'];
if (regionJson is! Map<String, Object?>) {
return null;
}
final region = PreviewRegion.fromJson(regionJson);
if (!region.isValid) {
debugPrint('PreviewRegionService: assets の領域値が不正のためフル表示にフォールバック');
return null;
}
return region;
} catch (e) {
debugPrint('PreviewRegionService: assets 読み込み失敗 ($e)');
return null;
}
}
}