// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

import 'package:flutter/foundation.dart';
import 'package:json_annotation/json_annotation.dart';

part 'sk_storefront_wrapper.g.dart';

/// Contains the location and unique identifier of an Apple App Store storefront.
///
/// Dart wrapper around StoreKit's
/// [SKStorefront](https://developer.apple.com/documentation/storekit/skstorefront?language=objc).
@JsonSerializable(createToJson: true)
@immutable
class SKStorefrontWrapper {
  /// Creates a new [SKStorefrontWrapper] with the provided information.
  // TODO(stuartmorgan): Temporarily ignore const warning in other parts of the
  // federated package, and remove this.
  // ignore: prefer_const_constructors_in_immutables
  SKStorefrontWrapper({
    required this.countryCode,
    required this.identifier,
  });

  /// Constructs an instance of the [SKStorefrontWrapper] from a key value map
  /// of data.
  ///
  /// The map needs to have named string keys with values matching the names and
  /// types of all of the members on this class. The `map` parameter must not be
  /// null.
  factory SKStorefrontWrapper.fromJson(Map<String, dynamic> map) {
    return _$SKStorefrontWrapperFromJson(map);
  }

  /// The three-letter code representing the country or region associated with
  /// the App Store storefront.
  final String countryCode;

  /// A value defined by Apple that uniquely identifies an App Store storefront.
  final String identifier;

  @override
  bool operator ==(Object other) {
    if (identical(other, this)) {
      return true;
    }
    if (other.runtimeType != runtimeType) {
      return false;
    }
    return other is SKStorefrontWrapper &&
        other.countryCode == countryCode &&
        other.identifier == identifier;
  }

  @override
  int get hashCode => Object.hash(
        countryCode,
        identifier,
      );

  @override
  String toString() => _$SKStorefrontWrapperToJson(this).toString();

  /// Converts the instance to a key value map which can be used to serialize
  /// to JSON format.
  Map<String, dynamic> toMap() => _$SKStorefrontWrapperToJson(this);
}
