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<File> _getCustomerFile() async {
    final directory = await getApplicationDocumentsDirectory();
    return File('${directory.path}/$_customerFileName');
  }

  /// 商品マスターのファイルを取得
  Future<File> _getProductFile() async {
    final directory = await getApplicationDocumentsDirectory();
    return File('${directory.path}/$_productFileName');
  }

  /// 自社情報のファイルを取得
  Future<File> _getCompanyFile() async {
    final directory = await getApplicationDocumentsDirectory();
    return File('${directory.path}/$_companyFileName');
  }

  // --- 顧客マスター操作 ---

  /// 全ての顧客データを読み込む
  Future<List<Customer>> loadCustomers() async {
    try {
      final file = await _getCustomerFile();
      if (!await file.exists()) return [];

      final String content = await file.readAsString();
      final List<dynamic> jsonList = json.decode(content);

      return jsonList.map((j) => Customer.fromJson(j)).toList();
    } catch (e) {
      debugPrint('Customer Master Loading Error: $e');
      return [];
    }
  }

  /// 顧客リストを保存する
  Future<void> saveCustomers(List<Customer> 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<void> 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<List<Product>> 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<dynamic> 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<void> saveProducts(List<Product> 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<void> 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<Company> loadCompany() async {
    try {
      final file = await _getCompanyFile();
      if (!await file.exists()) {
        return Company.defaultCompany;
      }

      final String content = await file.readAsString();
      final Map<String, dynamic> jsonMap = json.decode(content);

      return Company.fromJson(jsonMap);
    } catch (e) {
      debugPrint('Company Info Loading Error: $e');
      return Company.defaultCompany; // エラー時もデフォルトを返す
    }
  }

  /// 自社情報を保存する
  Future<void> 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');
    }
  }
}
