<?php

class BosMadrasahClient extends BackgroundBaseClient {
    protected $context;
    protected $version;
    protected $successKey;
    public function __construct($prop, $context)
    {
        parent::__construct($prop);
        $this->context = $context;
        $this->version = "v1";
        $this->successKey = "succes";
    }

    function getToken() {
        $nsm = $this->prop['nsm'];
        $password = $this->prop['password'];
        $params = [
            "form_params" => [
                "nsm" => $nsm,
                "password" => $password
            ],
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-login");
        $this->setLogParams([
            'nsm' => $nsm,
            'password' => $password
        ]);
        //endregion

        try {
            $response = $this->execute("POST", "$this->version/auth/login/", $params);
        } catch (\Exception $e) {
            throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Gagal melakukan login BOS Madrasah");
        }
        if ($response[$this->successKey] && array_key_exists('data', $response) && array_key_exists('token', $response['data'])) {
            return $response['data']['token'];
        } else {
            throw new CustomErrorException(BaseResponse::INVALID_AUTHENTICATION_AUTHORIZATION, "Gagal melakukan login BOS Madrasah");
        }
    }

    private function getExistingToken(): string
    {
        return ApiToken::findTokenOrCreateOne(ApiToken::KEY_BOS_MADRASAH, "4 hour", array($this, "getToken"));
    }

    private function handleResponse($method, $path, $params, $doCaching = false) {
        try {
            $response = $this->execute($method, $path, $params, false, $doCaching);
            if ($response[$this->successKey] && array_key_exists('data', $response)) {
                $result = $response['data'];
            } else if (array_key_exists('message', $response)){
                $result = [
                    "message" => $response["message"]
                ];
            } else {
                $result = [
                    "message" => "Data tidak ditemukan"
                ];
            }
        } catch (CustomErrorException $e) {
            $result = [
                "message" => "Gagal menghubungi server Kemenag. Mohon coba beberapa saat lagi."
            ];
        } catch (\Exception $e) {
            $result = [
                "message" => "Gagal menghubungi server Kemenag. Mohon coba beberapa saat lagi."
            ];
        }

        return $result;
    }

    public function listTahun()
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-listTahun");
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/tahun", $params, true);
    }

    public function listBantuan()
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-listBantuan");
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/bantuan", $params);
    }

    public function listTahapan()
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-listTahapan");
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/tahapan", $params);
    }

    public function historyAlokasi($nsm)
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ],
            "query" => [
                "nsm" => $nsm
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-historiAlokasi");
        $this->setLogParams($params["query"]);
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/history-alokasi", $params);
    }

    public function rekapNasional($tahun, $jenjang)
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ],
            "query" => [
                "tahun" => $tahun,
                "jenjang" => $jenjang
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-rekapNasional");
        $this->setLogParams([
            'tahun' => $tahun
        ]);
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/nasional", $params);
    }

    public function rekapPerJenjang($tahun)
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ],
            "query" => [
                "tahun" => $tahun
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-rekapPerJenjang");
        $this->setLogParams([
            'tahun' => $tahun
        ]);
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/nasional-per-jenjang", $params, true);
    }

    public function rekapPerProvinsi($tahun)
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ],
            "query" => [
                "tahun" => $tahun
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-rekapPerProvinsi");
        $this->setLogParams([
            'tahun' => $tahun
        ]);
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/nasional-per-provinsi", $params);
    }

    public function rekapPerKabupaten($tahun, $provinsiId)
    {
        $params = [
            "headers" => [
                "Authorization" => "Bearer " . $this->getExistingToken()
            ],
            "query" => [
                "tahun" => $tahun,
                "provinsi_id" => $provinsiId
            ]
        ];

        //region LOG Definition
        $this->setApiName("bosmadrasah-rekapPerKabupaten");
        $this->setLogParams($params["query"]);
        //endregion

        return $this->handleResponse("GET", "$this->version/rekap/nasional-per-kabupaten", $params);
    }
}

