// Copyright 2019 The Chromium 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:in_app_purchase/store_kit_wrappers.dart';
import 'package:in_app_purchase/billing_client_wrappers.dart';
import 'in_app_purchase_connection.dart';

/// The class represents the information of a product.
///
/// This class unifies the BillingClient's [SkuDetailsWrapper] and StoreKit's [SKProductWrapper]. You can use the common attributes in
/// This class for simple operations. If you would like to see the detailed representation of the product, instead,  use [skuDetails] on Android and [skProduct] on iOS.
class ProductDetails {
  ProductDetails(
      {@required this.id,
      @required this.title,
      @required this.description,
      @required this.price,
      this.skProduct,
      this.skuDetail});

  /// The identifier of the product, specified in App Store Connect or Sku in Google Play console.
  final String id;

  /// The title of the product, specified in the App Store Connect or Sku in Google Play console based on the platform.
  final String title;

  /// The description of the product, specified in the App Store Connect or Sku in Google Play console based on the platform.
  final String description;

  /// The price of the product, specified in the App Store Connect or Sku in Google Play console based on the platform.
  /// Formatted with currency symbol ("$0.99").
  final String price;

  /// Points back to the `StoreKits`'s [SKProductWrapper] object that generated this [ProductDetails] object.
  ///
  /// This is null on Android.
  final SKProductWrapper skProduct;

  /// Points back to the `BillingClient1`'s [SkuDetailsWrapper] object that generated this [ProductDetails] object.
  ///
  /// This is null on iOS.
  final SkuDetailsWrapper skuDetail;

  /// Generate a [ProductDetails] object based on an iOS [SKProductWrapper] object.
  ProductDetails.fromSKProduct(SKProductWrapper product)
      : this.id = product.productIdentifier,
        this.title = product.localizedTitle,
        this.description = product.localizedDescription,
        this.price = product.priceLocale.currencySymbol + product.price,
        this.skProduct = product,
        this.skuDetail = null;

  /// Generate a [ProductDetails] object based on an Android [SkuDetailsWrapper] object.
  ProductDetails.fromSkuDetails(SkuDetailsWrapper skuDetails)
      : this.id = skuDetails.sku,
        this.title = skuDetails.title,
        this.description = skuDetails.description,
        this.price = skuDetails.price,
        this.skProduct = null,
        this.skuDetail = skuDetails;
}

/// The response returned by [InAppPurchaseConnection.queryProductDetails].
///
/// A list of [ProductDetails] can be obtained from the this response.
class ProductDetailsResponse {
  ProductDetailsResponse(
      {@required this.productDetails, @required this.notFoundIDs, this.error});

  /// Each [ProductDetails] uniquely matches one valid identifier in [identifiers] of [InAppPurchaseConnection.queryProductDetails].
  final List<ProductDetails> productDetails;

  /// The list of identifiers that are in the `identifiers` of [InAppPurchaseConnection.queryProductDetails] but failed to be fetched.
  ///
  /// There's multiple platform specific reasons that product information could fail to be fetched,
  /// ranging from products not being correctly configured in the storefront to the queried IDs not existing.
  final List<String> notFoundIDs;

  /// A caught platform exception thrown while querying the purchases.
  ///
  /// It's possible for this to be null but for there still to be notFoundIds in cases where the request itself was a success but the
  /// requested IDs could not be found.
  final IAPError error;
}
