<?php

class KemendesClient extends BackgroundBaseClient
{
    const BUMDES_TYPE_PROVINSI  = "provinsi";
    const BUMDES_TYPE_KABUPATEN = "kabupaten";
    const BUMDES_TYPE_DESA      = "desa";

    const IDM_STATUS = ['MANDIRI', 'MAJU', 'BERKEMBANG', 'TERTINGGAL', 'SANGAT TERTINGGAL'];

    const ERROR_MESSAGE = "Gagal menghubungi server Kemendesa. Silakan coba beberapa saat lagi";

    private $bumdesToken;

    #region IDM
    public function idmDatatablesProvinsi()
    {
        $method = "POST";
        $path = "/open/api/provinsi/datatables";

        //region LOG Definition
        $this->setApiName("idm-kemendes-provinsi-datatables");
        //endregion

        return $this->execute($method, $path, [], false);
    }

    public function idmDatatablesKabupaten()
    {
        $method = "POST";
        $path = "/open/api/kabupaten/datatables";

        //region LOG Definition
        $this->setApiName("idm-kemendes-kabupaten-datatables");
        //endregion

        return $this->execute($method, $path, [], false);
    }

    public function idmDatatablesDesa($start = null, $length = null, $namaProv = null, $namaKab = null, $idDesa = null)
    {
        $method = "POST";
        $path = "/open/api/desa/datatables";
        $formParams = [
            'form_params' => [
                'search[regex]' => false,
                'columnsDef[0]' => 'NAMA_PROV',
                'columns[0][search][value]' => $namaProv,
                'columnsDef[1]' => 'NAMA_KAB',
                'columns[1][search][value]' => $namaKab,
                'columnsDef[2]' => 'ID_DESA',
                'columns[2][search][value]' => $idDesa
            ]
        ];
        if (!is_null($start)) {
            $formParams['form_params']['start'] = $start;
        }
        if (!is_null($length)) {
            $formParams['form_params']['length'] = $length;
        }
        $columns = [];
        if (!is_null($namaProv)) {
            array_push($columns, ['NAMA_PROV' => $namaProv]);
        }
        if (!is_null($namaKab)) {
            array_push($columns, ['NAMA_KAB' => $namaKab]);
        }
        if (!is_null($idDesa)) {
            array_push($columns, ['ID_DESA' => $idDesa]);
        }
        $index = 0;
        foreach ($columns as $key => $value) {
            $formParams['form_params']["columnsDef[$index]"] = $key;
            $formParams['form_params']["columns[$index][search][value]"] = $value;
        }

        // jika semua param kosong, override limit di set 10 agar data tidak terlalu besar
        if (is_null($length) && is_null($namaProv) && is_null($namaKab) && is_null($idDesa)) {
            $formParams['form_params']['length'] = 10;
        }

        //region LOG Definition
        $this->setApiName("idm-kemendes-desa-datatables");
        $this->setLogParams([
            'start' => $start,
            'length' => $length,
            'namaProv' => $namaProv,
            'namaKab' => $namaKab,
            'idDesa' => $idDesa
        ]);
        //endregion

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

    public function idmRumusanDesa($idDesa, $tahun)
    {
        $method = "GET";
        $path = "/open/api/desa/rumusan/$idDesa/$tahun";

        //region LOG Definition
        $this->setApiName("idm-kemendes-desa-rumusan");
        $this->setLogParams([
            'kode_desa' => $idDesa,
            'tahun' => $tahun
        ]);
        //endregion

        try {
            $response = $this->execute($method, $path, [], false);
        } catch(\Exception $e) {
            if ($e->getCode() == 400) {
                $response = [
                    "status" => 200,
                    "error" => false,
                    "mapData" => [
                        "SUMMARIES" => [
                            "SKOR_SAAT_INI" => null,
                            "STATUS" => "-",
                            "TARGET_STATUS" => "-",
                            "SKOR_MINIMAL" => "-",
                            "PENAMBAHAN" => null,
                            "TAHUN" => $tahun
                        ],
                        "ROW" => []
                    ]
                ];
            } else {
                $response = [
                    "error" => true,
                    "message" => "Gagal menghubungi server Kemendesa. Silakan coba beberapa saat lagi."
                ];
            }
        }

        return $response;
    }
    #endregion

    #region BumDes
    private function bumdesLogin()
    {
        $method = "POST";
        $path = "/api/login";

        $params = [
            "json" => [
                "username" => $this->prop["username"],
                "password" => $this->prop["password"]
            ]
        ];

        //region LOG Definition
        $this->setApiName("bumdes-kemendes-login");
        //endregion

        $response = $this->execute($method, $path, $params, false);
        if (array_key_exists('status', $response) && $response['status'] === 'success' && array_key_exists('token', $response)) {
            $this->bumdesToken = $response['token'];
        }
    }

    /**
     * @param $id
     * @param string $type
     * @return mixed
     * @throws CustomErrorException
     * Response Example:
     * {
     *"status": "success",
     *"message": "Successfully get data",
     *"data": [{},{}]
     * }
     */
    private function bumdesGet($id, $type = self::BUMDES_TYPE_DESA) {
        if (empty($this->bumdesToken)) {
            $this->bumdesLogin();
        }
        $method = "POST";
        switch ($type) {
            case self::BUMDES_TYPE_PROVINSI:
                $path = "/api/v2/bumdes-app/by-id-prov";
                $apiName = "bumdes-kemendes-by-prov";
                break;
            case self::BUMDES_TYPE_KABUPATEN:
                $path = "/api/v2/bumdes-app/by-id-kab";
                $apiName = "bumdes-kemendes-by-kab";
                break;
            default:
                $path = "/api/v2/bumdes-app/by-id-desa";
                $apiName = "bumdes-kemendes-by-desa";
                break;
        }
        $params = [
            "headers" => [
                "Authorization" => "Bearer $this->bumdesToken",
            ],
            "json" => ["id" => $id, "limit" => 9999]
        ];

        //region LOG Definition
        $this->setApiName($apiName);
        $this->setLogParams([
            'id' => $id
        ]);
        //endregion

        $response = $this->execute($method, $path, $params, false);
        $result = [];
        if (array_key_exists("status", $response) && $response["status"] === 'success') {
            if (array_key_exists("message", $response) && $response["message"] == "Data not found") {
                $result = [];
            } else {
                $result = $response["data"];
            }
        }

        return $result;
    }

    /**
     * @param $id
     * @param string $type
     * @return array|mixed
     * @throws CustomErrorException
     * Response Example:
     * {
     *"status": "success",
     *"message": "Successfully get data count status by Desa",
     *"data": [{"bumdes": {}},{"bumdesma": {}}]
     * }
     */
    private function bumdesCount($id, $type = self::BUMDES_TYPE_DESA) {
        if (empty($this->bumdesToken)) {
            $this->bumdesLogin();
        }
        $method = "POST";
        switch ($type) {
            case self::BUMDES_TYPE_PROVINSI:
                $path = "/api/v2/bumdes-app/count-by-prov";
                $apiName = "bumdes-kemendes-count-by-prov";
                break;
            case self::BUMDES_TYPE_KABUPATEN:
                $path = "/api/v2/bumdes-app/count-by-kab";
                $apiName = "bumdes-kemendes-count-by-kab";
                break;
            default:
                $path = "/api/v2/bumdes-app/count-by-desa";
                $apiName = "bumdes-kemendes-count-by-desa";
                break;
        }
        $params = [
            "headers" => [
                "Authorization" => "Bearer $this->bumdesToken",
            ],
            "json" => ["id" => $id]
        ];

        //region LOG Definition
        $this->setApiName($apiName);
        $this->setLogParams([
            'id' => $id
        ]);
        //endregion

        $response = $this->execute($method, $path, $params, false);
        $result = [];
        if (array_key_exists("status", $response) && $response["status"] === 'success') {
            $result = $response["data"];
        }

        return $result;
    }

    public function bumdesByProv($id) {
        return $this->bumdesGet($id, self::BUMDES_TYPE_PROVINSI);
    }

    public function bumdesCountProv($id) {
        return $this->bumdesCount($id, self::BUMDES_TYPE_PROVINSI);
    }

    public function bumdesByKab($id) {
        return $this->bumdesGet($id, self::BUMDES_TYPE_KABUPATEN);
    }

    public function bumdesCountKab($id) {
        return $this->bumdesCount($id, self::BUMDES_TYPE_KABUPATEN);
    }

    public function bumdesByDesa($id) {
        return $this->bumdesGet($id);
    }

    public function bumdesCountDesa($id) {
        return $this->bumdesCount($id);
    }
    #endregion
}
