<?php

namespace JNews\Paywall\Gateways\Stripe\Lib;

/**
 * Class Dispute
 *
 * @property string $id
 * @property string $object
 * @property int $amount
 * @property BalanceTransaction[] $balance_transactions
 * @property string $charge
 * @property int $created
 * @property string $currency
 * @property mixed $evidence
 * @property mixed $evidence_details
 * @property bool $is_charge_refundable
 * @property bool $livemode
 * @property \Stripe\StripeObject $metadata
 * @property string|null $network_reason_code
 * @property string|null $payment_intent
 * @property string $reason
 * @property string $status
 *
 * @package Stripe
 */
class Dispute extends Api_Resource {

	const OBJECT_NAME = 'dispute';

	use Api_Operations\All;
	use Api_Operations\Retrieve;
	use Api_Operations\Update;

	/**
	 * Possible string representations of dispute reasons.
	 *
	 * @link https://stripe.com/docs/api#dispute_object
	 */
	const REASON_BANK_CANNOT_PROCESS       = 'bank_cannot_process';
	const REASON_CHECK_RETURNED            = 'check_returned';
	const REASON_CREDIT_NOT_PROCESSED      = 'credit_not_processed';
	const REASON_CUSTOMER_INITIATED        = 'customer_initiated';
	const REASON_DEBIT_NOT_AUTHORIZED      = 'debit_not_authorized';
	const REASON_DUPLICATE                 = 'duplicate';
	const REASON_FRAUDULENT                = 'fraudulent';
	const REASON_GENERAL                   = 'general';
	const REASON_INCORRECT_ACCOUNT_DETAILS = 'incorrect_account_details';
	const REASON_INSUFFICIENT_FUNDS        = 'insufficient_funds';
	const REASON_PRODUCT_NOT_RECEIVED      = 'product_not_received';
	const REASON_PRODUCT_UNACCEPTABLE      = 'product_unacceptable';
	const REASON_SUBSCRIPTION_CANCELED     = 'subscription_canceled';
	const REASON_UNRECOGNIZED              = 'unrecognized';

	/**
	 * Possible string representations of dispute statuses.
	 *
	 * @link https://stripe.com/docs/api#dispute_object
	 */
	const STATUS_CHARGE_REFUNDED        = 'charge_refunded';
	const STATUS_LOST                   = 'lost';
	const STATUS_NEEDS_RESPONSE         = 'needs_response';
	const STATUS_UNDER_REVIEW           = 'under_review';
	const STATUS_WARNING_CLOSED         = 'warning_closed';
	const STATUS_WARNING_NEEDS_RESPONSE = 'warning_needs_response';
	const STATUS_WARNING_UNDER_REVIEW   = 'warning_under_review';
	const STATUS_WON                    = 'won';

	/**
	 * @param array|string|null $opts
	 *
	 * @throws \Stripe\Exception\ApiErrorException if the request fails
	 *
	 * @return Dispute The closed dispute.
	 */
	// TODO: add $params to standardize signature
	public function close( $opts = null ) {
		 $url                  = $this->instanceUrl() . '/close';
		list($response, $opts) = $this->_request( 'post', $url, null, $opts );
		$this->refreshFrom( $response, $opts );
		return $this;
	}
}
