Newer
Older
SmTIAS-Capture / lib / services / preview_region_service.dart
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;
    }
  }
}