<?php

namespace trader\exchange\bitget;

require_once __DIR__ . '/../../struct/ApiInfo.php';
require_once __DIR__ . '/../../../jiaoyin/func.php';
require_once __DIR__ . '/../../../jiaoyin/Curl.php';

use trader\struct\ApiInfo;
use Jiaoyin\Curl;
use function Jiaoyin\getMicrotime;

class Api
{
    private $host = 'https://api.bitget.com';
    private ?ApiInfo $apiInfo;

    public function __construct(?ApiInfo $apiInfo)
    {
        $this->apiInfo = $apiInfo;
    }

    public function setHost($host)
    {
        $this->host = $host;
    }

    //----------- public interface ------------
    // 获取交易对信息
    public function instruments($param)
    {
        $path = '/api/v2/mix/market/contracts';
        $method = 'GET';
        return $this->request($path, $method, $param);
    }

    // 获取K线数据
    public function klines($param)
    {
        $path = '/api/v2/mix/market/candles';
        $method = 'GET';
        return $this->request($path, $method, $param);
    }

    //----------- private interface ------------
    // 下单
    public function placeOrder($param)
    {
        $path = '/api/v2/mix/order/place-order';
        $method = 'POST';
        return $this->request($path, $method, $param, true);
    }

    // 查询持仓
    public function getPositions($param)
    {
        $path = '/api/v2/mix/position/positions';
        $method = 'GET';
        return $this->request($path, $method, $param, true);
    }

    // 设置杠杆
    public function setLeverage($param)
    {
        $path = '/api/v2/mix/account/set-leverage';
        $method = 'POST';
        return $this->request($path, $method, $param, true);
    }

    // 查询账户余额
    public function accountBalance($param)
    {
        $path = '/api/v2/mix/account/account';
        $method = 'GET';
        return $this->request($path, $method, $param, true);
    }

    //-------------------------------------
    private function createSign($timestamp, $method, $requestPath, $body = '')
    {
        $message = $timestamp . $method . $requestPath . $body;
        return base64_encode(hash_hmac('sha256', $message, $this->apiInfo->secret, true));
    }

    private function request($path, $method, $param, $auth = false)
    {
        $header = [];
        $body = '';
        $fullPath = $path;

        if ($method == 'GET' && !empty($param)) {
            $fullPath = $path . '?' . http_build_query($param);
        } else {
            $header[] = 'Content-Type: application/json';
            $body = json_encode($param);
        }

        if ($auth) {
            $timestamp = (string)getMicrotime();
            $header[] = 'ACCESS-KEY: ' . $this->apiInfo->key;
            $header[] = 'ACCESS-TIMESTAMP: ' . $timestamp;
            $header[] = 'ACCESS-PASSPHRASE: ' . $this->apiInfo->passphrase;
            $header[] = 'ACCESS-SIGN: ' . $this->createSign($timestamp, $method, $fullPath, $body);
        }

        $url = $this->host . $path;
        $result = "";
        if ($method == 'POST') {
            $result = Curl::httpPost($url, $param, $header);
        } else {
            $result = Curl::httpGet($url, $param, $header);
        }

        return json_decode($result, true);
    }
}