<?php
class KemenkeuClient extends BackgroundBaseClient
{
    private $tokenPemda;
    private $tokenTkdd;
    private $tokenApbd;

    public function filterResponse($body, $result)
    {
        parent::filterResponse($body, $result);
        if ($this->logger != null) {
            if($result != null) {
                if(!is_array($result)) {
                    $this->logger->addItem("api_result_code", -1);
                    $this->logger->addItem("api_result_message", $result);
                }
                else if(array_key_exists('error', $result)) {
                    $this->logger->addItem("api_result_code", -1);
                    $this->logger->addItem("api_result_message", "[" . $result['error'] . "]: " . $result['error_description']);
                }
            }
        }
    }

    //region connect to API
    public function requestTokenReferensiPemda()
    {
        $method = "POST";
        $path = "/apidjpk/srv_ref_pemda/oauth2/token";
        $params = [
            "headers" => [
                "Content-Type" => "application/x-www-form-urlencoded"
            ],
            "form_params" => [
                "grant_type" => AppConfig::getValueByKode("KEMENKEU_GRANT_TYPE"),
                "scope" => AppConfig::getValueByKode("KEMENKEU_SCOPE"),
                "client_id" => AppConfig::getValueByKode("KEMENKEU_CLIENT_ID"),
                "client_secret" => AppConfig::getValueByKode("KEMENKEU_CLIENT_SECRET"),
                "provision_key" => AppConfig::getValueByKode("KEMENKEU_PROVISION_KEY")
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-request_token_referensi_pemda");
        $this->setLogParams($params['form_params']);
        //endregion

        $res = $this->execute($method, $path, $params);
        $this->tokenPemda = $res["access_token"];
    }

    public function requestTokenTkdd()
    {
        $method = "POST";
        $path = "/apidjpk/srv_trn_kpk_tkd/oauth2/token";
        $params = [
            "headers" => [
                "Content-Type" => "application/x-www-form-urlencoded"
            ],
            "form_params" => [
                "grant_type" => AppConfig::getValueByKode("KEMENKEU_GRANT_TYPE"),
                "scope" => AppConfig::getValueByKode("KEMENKEU_SCOPE"),
                "client_id" => AppConfig::getValueByKode("KEMENKEU_CLIENT_ID"),
                "client_secret" => AppConfig::getValueByKode("KEMENKEU_CLIENT_SECRET"),
                "provision_key" => AppConfig::getValueByKode("KEMENKEU_PROVISION_KEY")
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-request_token_tkdd");
        $this->setLogParams($params['form_params']);
        //endregion

        $res = $this->execute($method, $path, $params);
        $this->tokenTkdd = $res["access_token"];
    }

    public function requestTokenRealisasiApbd()
    {
        $method = "POST";
        $path = "/apidjpk/srv_trn_kpk_apbd/oauth2/token";
        $params = [
            "headers" => [
                "Content-Type" => "application/x-www-form-urlencoded"
            ],
            "form_params" => [
                "grant_type" => AppConfig::getValueByKode("KEMENKEU_GRANT_TYPE"),
                "scope" => AppConfig::getValueByKode("KEMENKEU_SCOPE"),
                "client_id" => AppConfig::getValueByKode("KEMENKEU_CLIENT_ID"),
                "client_secret" => AppConfig::getValueByKode("KEMENKEU_CLIENT_SECRET"),
                "provision_key" => AppConfig::getValueByKode("KEMENKEU_PROVISION_KEY")
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-request_token_realisasi_apbd");
        $this->setLogParams($params['form_params']);
        //endregion

        $res = $this->execute($method, $path, $params);
        $this->tokenApbd = $res["access_token"];
    }

    public function getReferensiPemda()
    {
        $method = "GET";
        $path = "/apidjpk/srv_ref_pemda";
        $params = [
            "headers" => [
                'headerauth' => 'Bearer ' . $this->tokenPemda
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-get_referensi_pemda");
        //endregion

        return $this->execute($method, $path, $params);
    }

    public function getTransaksiTkddHeaders()
    {
        $method = "GET";
        $path = "/apidjpk/srv_trn_kpk_tkd";
        $params = [
            "headers" => [
                'headerauth' => 'Bearer ' . $this->tokenTkdd,
                'Range-Unit' => 'items',
                'Range' => '0-9',
                'Prefer' => 'count=exact',
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-get_transaksi_tkdd");
        $this->setLogParams([
            'Range-Unit' => 'items',
            'Range' => '0-9',
            'Prefer' => 'count=exact',
        ]);
        //endregion

        return $this->executeGetHeader($method, $path, $params);
    }

    public function getTransaksiTkdd($range)
    {
        $method = "GET";
        $path = "/apidjpk/srv_trn_kpk_tkd";
        $params = [
            "headers" => [
                'headerauth' => 'Bearer ' . $this->tokenTkdd,
                'Range-Unit' => 'items',
                'Range' => $range,
                'Prefer' => 'count=exact',
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-get_transaksi_tkdd");
        $this->setLogParams([
            'Range-Unit' => 'items',
            'Range' => $range,
            'Prefer' => 'count=exact',
        ]);
        //endregion

        return $this->execute($method, $path, $params);
    }

    public function getRealisasiApbdHeaders()
    {
        $method = "GET";
        $path = "/apidjpk/srv_trn_kpk_apbd";
        $params = [
            "headers" => [
                'headerauth' => 'Bearer ' . $this->tokenApbd,
                'Range-Unit' => 'items',
                'Range' => '0-9',
                'Prefer' => 'count=exact',
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-get_realisasi_apbd");
        $this->setLogParams([
            'Range-Unit' => 'items',
            'Range' => '0-9',
            'Prefer' => 'count=exact',
        ]);
        //endregion

        return $this->executeGetHeader($method, $path, $params);
    }

    public function getRealisasiApbd($range)
    {
        $method = "GET";
        $path = "/apidjpk/srv_trn_kpk_apbd";
        $params = [
            "headers" => [
                'headerauth' => 'Bearer ' . $this->tokenApbd,
                'Range-Unit' => 'items',
                'Range' => $range,
                'Prefer' => 'count=exact',
            ]
        ];

        //region LOG Definition
        $this->setApiName("Kemenkeu-get_realisasi_apbd");
        $this->setLogParams([
            'Range-Unit' => 'items',
            'Range' => $range,
            'Prefer' => 'count=exact',
        ]);
        //endregion

        return $this->execute($method, $path, $params);
    }
    //endregion

    //region Not Connected to API
    public function saveDataPemda($itemPemda) {
        $savePemda = KemenkeuMasterPemda::findFirst([
            'conditions' => 'kodepemda = :kodepemda:',
            'bind' => [
                'kodepemda' => $itemPemda['kodepemda']
            ]
        ]);
        if (!$savePemda)
            $savePemda = new KemenkeuMasterPemda();
        $savePemda->kodepemda = $itemPemda['kodepemda'];
        $savePemda->kodesatker = $itemPemda['kodesatker'];
        $savePemda->namapemda = $itemPemda['namapemda'];
        $savePemda->save();
    }

    public function saveDataTkdd($itemTkdd) {
        $saveTkdd = KemenkeuTkdd::findFirst([
            'conditions' => 'kodepemda = :kodepemda: AND tahun = :tahun: AND urmap1 = :urmap1: AND urakun = :urakun:',
            'bind' => [
                'kodepemda' => $itemTkdd['kodepemda'],
                'tahun' => $itemTkdd['tahun'],
                'urmap1' => $itemTkdd['urmap1'],
                'urakun' => $itemTkdd['urakun']
            ]
        ]);
        if (!$saveTkdd)
            $saveTkdd = new KemenkeuTkdd();
        $saveTkdd->tahun = $itemTkdd['tahun'];
        $saveTkdd->namaprovinsi = $itemTkdd['namaprovinsi'];
        $saveTkdd->namapemda = $itemTkdd['namapemda'];
        $saveTkdd->urmap1 = $itemTkdd['urmap1'];
        $saveTkdd->urakun = $itemTkdd['urakun'];
        $saveTkdd->pagu = $itemTkdd['pagu'];
        $saveTkdd->realisasi = $itemTkdd['realisasi'];
        $saveTkdd->prosen = $itemTkdd['prosen'];
        $saveTkdd->kodepemda = $itemTkdd['kodepemda'];
        $saveTkdd->save();
    }

    public function saveDataApbd($itemApbd) {
        $conditions = "tahun = :tahun: AND kodesatker = :kodesatker: AND kodepemda = :kodepemda:  AND level1coa90 = :level1coa90: AND level2coa90 = :level2coa90: AND level3coa90 = :level3coa90:";
        $binds = [
            'tahun' => $itemApbd['tahun'],
            'kodesatker' => $itemApbd['kodesatker'],
            'kodepemda' => $itemApbd['kodepemda'],
            'level1coa90' => $itemApbd['level1coa90'],
            'level2coa90' => $itemApbd['level2coa90'],
            'level3coa90' => $itemApbd['level3coa90'],
        ];
        $saveApbd = KemenkeuRealisasiApbd::findFirst([
            'conditions' => $conditions,
            'bind' => $binds
        ]);
        if (!$saveApbd)
            $saveApbd = new KemenkeuRealisasiApbd();
        $saveApbd->tahun = $itemApbd['tahun'];
        $saveApbd->kodesatker = $itemApbd['kodesatker'];
        $saveApbd->kodepemda = $itemApbd['kodepemda'];
        $saveApbd->namapemda = $itemApbd['namapemda'];
        $saveApbd->namaprovinsi = $itemApbd['namaprovinsi'];
        $saveApbd->level1coa90 = $itemApbd['level1coa90'];
        $saveApbd->level2coa90 = $itemApbd['level2coa90'];
        $saveApbd->level3coa90 = $itemApbd['level3coa90'];
        $saveApbd->nilaianggaran = $itemApbd['nilaianggaran'];
        $saveApbd->nilairealisasi = $itemApbd['nilairealisasi'];
        $saveApbd->persentase = $itemApbd['persentase'];
        $saveApbd->updatedate = $itemApbd['updatedate'];
        $saveApbd->save();
    }
    //endregion
}
