/// 주소 모델
///
/// 우편번호, 시/도, 상세주소로 구성된 주소 정보를 관리합니다.
/// 회사 및 지점의 주소 정보를 일관되게 처리하기 위한 모델입니다.
class Address {
  /// 우편번호
  final String zipCode;

  /// 시/도 (서울특별시, 경기도 등)
  final String region;

  /// 상세 주소
  final String detailAddress;

  /// 생성자
  const Address({this.zipCode = '', this.region = '', this.detailAddress = ''});

  /// 주소를 문자열로 반환합니다. (전체 주소)
  ///
  /// 예시: "12345 서울특별시 강남구 테헤란로 123"
  @override
  String toString() {
    final List<String> parts = [];

    if (zipCode.isNotEmpty) {
      parts.add(zipCode);
    }

    if (region.isNotEmpty) {
      parts.add(region);
    }

    if (detailAddress.isNotEmpty) {
      parts.add(detailAddress);
    }

    return parts.join(' ');
  }

  /// 전체 주소에서 Address 객체를 생성합니다.
  ///
  /// 현재는 우편번호, 시/도, 상세주소를 분리하지 않고 전체를 detailAddress로 저장합니다.
  /// 기존 데이터 마이그레이션을 위한 메서드입니다.
  factory Address.fromFullAddress(String fullAddress) {
    return Address(detailAddress: fullAddress);
  }

  /// JSON에서 Address 객체를 생성합니다.
  factory Address.fromJson(Map<String, dynamic> json) {
    return Address(
      zipCode: json['zipCode'] ?? '',
      region: json['region'] ?? '',
      detailAddress: json['detailAddress'] ?? '',
    );
  }

  /// Address 객체를 JSON으로 변환합니다.
  Map<String, dynamic> toJson() {
    return {
      'zipCode': zipCode,
      'region': region,
      'detailAddress': detailAddress,
    };
  }

  /// 주소가 비어 있는지 확인합니다.
  bool get isEmpty =>
      zipCode.isEmpty && region.isEmpty && detailAddress.isEmpty;

  /// 주소가 비어 있지 않은지 확인합니다.
  bool get isNotEmpty => !isEmpty;

  /// 복사본을 생성하고 일부 필드를 업데이트합니다.
  Address copyWith({String? zipCode, String? region, String? detailAddress}) {
    return Address(
      zipCode: zipCode ?? this.zipCode,
      region: region ?? this.region,
      detailAddress: detailAddress ?? this.detailAddress,
    );
  }
}
