import 'dart:convert'; import 'dart:io'; import 'package:flutter/foundation.dart'; import 'package:path_provider/path_provider.dart'; import '../models/customer_model.dart'; import '../models/company_model.dart'; // Companyモデルをインポート import '../data/product_master.dart'; /// 顧客マスター、商品マスター、自社情報のデータをローカルファイルに保存・管理するリポジトリ class MasterRepository { static const String _customerFileName = 'customers_master.json'; static const String _productFileName = 'products_master.json'; static const String _companyFileName = 'company_info.json'; // 自社情報ファイル名 /// 顧客マスターのファイルを取得 Future _getCustomerFile() async { final directory = await getApplicationDocumentsDirectory(); return File('${directory.path}/$_customerFileName'); } /// 商品マスターのファイルを取得 Future _getProductFile() async { final directory = await getApplicationDocumentsDirectory(); return File('${directory.path}/$_productFileName'); } /// 自社情報のファイルを取得 Future _getCompanyFile() async { final directory = await getApplicationDocumentsDirectory(); return File('${directory.path}/$_companyFileName'); } // --- 顧客マスター操作 --- /// 全ての顧客データを読み込む Future> loadCustomers() async { try { final file = await _getCustomerFile(); if (!await file.exists()) return []; final String content = await file.readAsString(); final List jsonList = json.decode(content); return jsonList.map((j) => Customer.fromJson(j)).toList(); } catch (e) { debugPrint('Customer Master Loading Error: $e'); return []; } } /// 顧客リストを保存する Future saveCustomers(List customers) async { try { final file = await _getCustomerFile(); final String encoded = json.encode(customers.map((c) => c.toJson()).toList()); await file.writeAsString(encoded); } catch (e) { debugPrint('Customer Master Saving Error: $e'); } } /// 特定の顧客を追加または更新する簡易メソッド Future upsertCustomer(Customer customer) async { final customers = await loadCustomers(); final index = customers.indexWhere((c) => c.id == customer.id); if (index != -1) { customers[index] = customer; } else { customers.add(customer); } await saveCustomers(customers); } // --- 商品マスター操作 --- /// 全ての商品データを読み込む /// ファイルがない場合は、ProductMasterに定義された初期データを返す Future> loadProducts() async { try { final file = await _getProductFile(); if (!await file.exists()) { // 初期データが存在しない場合は、ProductMasterのハードコードされたリストを返す return List.from(ProductMaster.products); } final String content = await file.readAsString(); final List jsonList = json.decode(content); return jsonList.map((j) => Product.fromJson(j)).toList(); } catch (e) { debugPrint('Product Master Loading Error: $e'); return List.from(ProductMaster.products); // エラー時も初期データを返す } } /// 商品リストを保存する Future saveProducts(List products) async { try { final file = await _getProductFile(); final String encoded = json.encode(products.map((p) => p.toJson()).toList()); await file.writeAsString(encoded); } catch (e) { debugPrint('Product Master Saving Error: $e'); } } /// 特定の商品を追加または更新する簡易メソッド Future upsertProduct(Product product) async { final products = await loadProducts(); final index = products.indexWhere((p) => p.id == product.id); if (index != -1) { products[index] = product; } else { products.add(product); } await saveProducts(products); } // --- 自社情報操作 --- /// 自社情報を読み込む /// ファイルがない場合は、Company.defaultCompany を返す Future loadCompany() async { try { final file = await _getCompanyFile(); if (!await file.exists()) { return Company.defaultCompany; } final String content = await file.readAsString(); final Map jsonMap = json.decode(content); return Company.fromJson(jsonMap); } catch (e) { debugPrint('Company Info Loading Error: $e'); return Company.defaultCompany; // エラー時もデフォルトを返す } } /// 自社情報を保存する Future saveCompany(Company company) async { try { final file = await _getCompanyFile(); final String encoded = json.encode(company.toJson()); await file.writeAsString(encoded); } catch (e) { debugPrint('Company Info Saving Error: $e'); } } }