<?php

namespace Payment\Coinbase;

use Antimech\Coinbase\Facades\Coinbase;
use Illuminate\Support\Facades\Crypt;
use Payment\Transaction\BaseTxn;
use stdClass;

class CoinbaseTxn extends BaseTxn
{
    protected $account_id; // Coinbase Account ID

    protected $private_key; // Coinbase Private Key

    protected $api_key; // Coinbase API KEY

    protected $url;

    public function __construct($txnInfo)
    {
        parent::__construct($txnInfo);

        // Creating URL For Sending Request
        $coinbaseCredential = gateway_info('coinbase');
        $this->account_id = $coinbaseCredential->account_id; // Coinbase Account ID
        $this->private_key = $coinbaseCredential->private_key; // Coinbase Private Key
        $this->api_key = $coinbaseCredential->apiKey; // Coinbase API KEY
        $this->url = 'https://api.coinbase.com/v2/accounts/'.$this->account_id.'/transactions';

        $fieldData = json_decode($txnInfo->manual_field_data, true);
        $this->toEmail = $fieldData['email_address']['value'] ?? '';

        config()->set([
            'coinbase.api_key' => $coinbaseCredential->apiKey,
            'coinbase.webhook_secret' => $coinbaseCredential->webhookSecret,
            'coinbase.api_version' => $coinbaseCredential->apiVersion,
        ]);
    }

    public function deposit()
    {
        $charge = Coinbase::createCharge([
            'name' => 'Deposit no #'.$this->txn,
            'description' => 'Deposit',
            'cancel_url' => route('status.cancel'),

            'local_price' => [
                'amount' => $this->amount,
                'currency' => $this->currency,
            ],
            'pricing_type' => 'fixed_price',
            'redirect_url' => route('status.success', ['reftrn' => Crypt::encryptString($this->txn)]),
        ]);

        return redirect($charge['data']['hosted_url']);
    }

    public function withdraw()
    {
        $json = new stdClass;
        $json->method = 'POST';
        $json->path = '/v2/accounts/'.$this->account_id.'/transactions';
        $json->secretapikey = $this->private_key;
        $json->apikey = $this->api_key;

        $body = new stdClass;
        $body->type = 'send';
        $body->to = $this->toEmail;
        $body->amount = $this->amount;
        $body->currency = $this->currency;

        $result = json_encode($json);
        $body = json_encode($body);
        $time = time();
        $sign = $time.$json->method.$json->path.$body;
        $hmac = hash_hmac('SHA256', $sign, $json->secretapikey);

        $header = [
            'CB-ACCESS-KEY:'.$this->api_key,
            'CB-ACCESS-SIGN:'.$hmac,
            'CB-ACCESS-TIMESTAMP:'.time(),
            'CB-VERSION:2019-11-15',
            'Content-Type:application/json',
        ];

        $ch = curl_init($this->url);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $body);
        curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
        $result = curl_exec($ch);
        curl_close($ch);

        return $result;
    }
}
