/// Address Entity
///
/// Represents a delivery/billing address for the user.
/// Corresponds to Frappe ERPNext Address doctype.
library;

import 'package:equatable/equatable.dart';

/// Address Entity
///
/// Domain entity representing a user's delivery or billing address.
class Address extends Equatable {
  final String name;
  final String addressTitle;
  final String addressLine1;
  final String phone;
  final String? email;
  final String? fax;
  final String? taxCode;
  final String cityCode;
  final String wardCode;
  final bool isDefault;
  final String? cityName;
  final String? wardName;
  final bool isAllowEdit;

  const Address({
    required this.name,
    required this.addressTitle,
    required this.addressLine1,
    required this.phone,
    this.email,
    this.fax,
    this.taxCode,
    required this.cityCode,
    required this.wardCode,
    this.isDefault = false,
    this.cityName,
    this.wardName,
    this.isAllowEdit = true,
  });

  @override
  List<Object?> get props => [
        name,
        addressTitle,
        addressLine1,
        phone,
        email,
        fax,
        taxCode,
        cityCode,
        wardCode,
        isDefault,
        cityName,
        wardName,
        isAllowEdit,
      ];

  /// Get full address display string
  String get fullAddress {
    final parts = <String>[];
    parts.add(addressLine1);
    if (wardName != null && wardName!.isNotEmpty) {
      parts.add(wardName!);
    }
    if (cityName != null && cityName!.isNotEmpty) {
      parts.add(cityName!);
    }
    return parts.join(', ');
  }

  /// Create a copy with modified fields
  Address copyWith({
    String? name,
    String? addressTitle,
    String? addressLine1,
    String? phone,
    String? email,
    String? fax,
    String? taxCode,
    String? cityCode,
    String? wardCode,
    bool? isDefault,
    String? cityName,
    String? wardName,
    bool? isAllowEdit,
  }) {
    return Address(
      name: name ?? this.name,
      addressTitle: addressTitle ?? this.addressTitle,
      addressLine1: addressLine1 ?? this.addressLine1,
      phone: phone ?? this.phone,
      email: email ?? this.email,
      fax: fax ?? this.fax,
      taxCode: taxCode ?? this.taxCode,
      cityCode: cityCode ?? this.cityCode,
      wardCode: wardCode ?? this.wardCode,
      isDefault: isDefault ?? this.isDefault,
      cityName: cityName ?? this.cityName,
      wardName: wardName ?? this.wardName,
      isAllowEdit: isAllowEdit ?? this.isAllowEdit,
    );
  }

  @override
  String toString() {
    return 'Address(name: $name, addressTitle: $addressTitle, addressLine1: $addressLine1, phone: $phone, isDefault: $isDefault, isAllowEdit: $isAllowEdit)';
  }
}
