<?php
/*
 +--------------------------------------------------------------------+
 | Copyright CiviCRM LLC. All rights reserved.                        |
 |                                                                    |
 | This work is published under the GNU AGPLv3 license with some      |
 | permitted exceptions and without any warranty. For full license    |
 | and copyright information, see https://civicrm.org/licensing       |
 +--------------------------------------------------------------------+
 */

use CRM_Stripe_ExtensionUtil as E;

/**
 * @param array $spec
 */
function _civicrm_api3_stripe_importsubscription_spec(&$spec) {
  $spec['subscription']['title'] = E::ts('Stripe Subscription ID');
  $spec['subscription']['type'] = CRM_Utils_Type::T_STRING;
  $spec['subscription']['api.required'] = TRUE;
  $spec['contact_id']['title'] = E::ts('Contact ID');
  $spec['contact_id']['description'] = E::ts('If not specified this will be determined from the "customer" on the subscription - a StripeCustomer record must exist in CiviCRM');
  $spec['contact_id']['type'] = CRM_Utils_Type::T_INT;
  $spec['ppid']['title'] = E::ts('Payment Processor ID');
  $spec['ppid']['type'] = CRM_Utils_Type::T_INT;
  $spec['ppid']['api.required'] = TRUE;

  $spec['recur_id']['title'] = E::ts('Contribution Recur ID');
  $spec['recur_id']['type'] = CRM_Utils_Type::T_INT;
  $spec['contribution_id']['title'] = E::ts('Contribution ID');
  $spec['contribution_id']['type'] = CRM_Utils_Type::T_INT;
  $spec['membership_id']['title'] = E::ts('Membership ID');
  $spec['membership_id']['type'] = CRM_Utils_Type::T_INT;
  $spec['membership_auto']['title'] = E::ts('Link to existing membership automatically');
  $spec['membership_auto']['type'] = CRM_Utils_Type::T_BOOLEAN;
  $spec['membership_auto']['api.default'] = TRUE;
  $spec['financial_type_id'] = [
    'title' => E::ts('Financial Type ID'),
    'type' => CRM_Utils_Type::T_STRING,
    'pseudoconstant' => [
      'table' => 'civicrm_financial_type',
      'keyColumn' => 'id',
      'labelColumn' => 'name',
    ],
    'api.default' => 1,
  ];
  $spec['payment_instrument_id'] = [
    'title' => E::ts('Payment Instrument ID'),
    'type' => CRM_Utils_Type::T_STRING,
    'api.default' => 1,
  ];
  $spec['contribution_source'] = [
    'title' => 'Contribution Source (optional description for contribution)',
    'type' => CRM_Utils_Type::T_STRING,
  ];
  $spec['is_email_receipt']['title'] = E::ts('Send Email Receipt (default: no)');
  $spec['is_email_receipt']['type'] = CRM_Utils_Type::T_BOOLEAN;
  $spec['is_email_receipt']['api.default'] = FALSE;
}

/**
 * API to import a stripe subscription, create a customer, recur, contribution and optionally link to membership
 * You run it once for each subscription and it creates/updates a recurring contribution in civicrm (and optionally links it to a membership).
 *
 * @param array $params
 *
 * @return array
 * @throws \API_Exception
 * @throws \CRM_Core_Exception
 * @throws \CiviCRM_API3_Exception
 * @throws \Stripe\Exception\ApiErrorException
 */
function civicrm_api3_stripe_importsubscription($params) {
  $importer = new \Civi\StripeImport\Subscription();
  $importer->setPaymentProcessorID($params['ppid']);
  $importer->setStripeSubscriptionID($params['subscription']);
  if (!empty($params['contact_id'])) {
    $importer->setContactID($params['contact_id']);
  }
  if (!empty($params['recur_id'])) {
    $importer->setContributionRecurID($params['recur_id']);
  }
  $importer->setEmailReceipt($params['is_email_receipt']);
  if (!empty($params['membership_id'])) {
    $importer->setMembershipID($params['membership_id']);
  }
  $importer->setMembershipAuto($params['membership_auto']);
  $importer->setFinancialTypeID($params['financial_type_id']);
  $importer->setPaymentInstrumentID($params['payment_instrument_id']);
  $return = $importer->importOne();

  return civicrm_api3_create_success($return, $params, 'StripeSubscription', 'import');
}