<?php

class BosMadrasahController extends BaseController {
    /** @var $client BosMadrasahClient */
    protected $client;

    public function onConstruct(): bool
    {
        $this->client = new BosMadrasahClient($this->config["bos_madrasah_prop"], $this);
        return parent::onConstruct();
    }
    public function listTahun() {
        return new SimpleResponse($this->client->listTahun());
    }

    public function listBantuan() {
        return new SimpleResponse($this->client->listBantuan());
    }

    public function listTahapan() {
        return new SimpleResponse($this->client->listTahapan());
    }

    public function historyAlokasi($nsm) {
        $this->checkIsAuthenticated();
        $this->validate(
            ['nsm' => $nsm],
            ['nsm' => ['validators' => ['required', 'digit']]]
        );

        return new SimpleResponse($this->client->historyAlokasi($nsm));
    }

    public function rekapNasional() {
        $this->checkIsAuthenticated();
        $params = $this->request->get();
        $validatedParams = $this->validate($params, [
            'tahun' => ['validators' => ['digit']],
            'jenjang' => ['validators' => []]
        ]);
        $tahun = $validatedParams['tahun'];
        $jenjang = $validatedParams['jenjang'];
        if (!empty($jenjang) && !is_array($jenjang)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Format jenjang tidak valid!");
        }

        return new SimpleResponse($this->client->rekapNasional($tahun, $jenjang));
    }

    public function rekapPerJenjang($tahun) {
        $this->validate(
            ['tahun' => $tahun],
            ['tahun' => ['validators' => ['digit']]]
        );
        return new SimpleResponse($this->client->rekapPerJenjang($tahun));
    }

    public function rekapPerProvinsi($tahun) {
        $this->checkIsAuthenticated();
        $this->validate(
            ['tahun' => $tahun],
            ['tahun' => ['validators' => ['digit']]]
        );
        return new SimpleResponse($this->client->rekapPerProvinsi($tahun));
    }

    public function rekapPerKabupaten($tahun) {
        $this->checkIsAuthenticated();
        $params = $this->request->get();
        $validated = $this->validate(
            ['tahun' => $tahun, 'provinsi_id' => $params['provinsi_id'] ?? null],
            [
                'tahun' => ['validators' => ['digit']],
                'provinsi_id' => ['validators' => ['digit']],
            ]
        );
        $provinsiId = $validated['provinsi_id'];
        return new SimpleResponse($this->client->rekapPerKabupaten($tahun, $provinsiId));
    }

    public function rekapTahunPerJenjang() {
        $params = $this->request->get();
        $params = $this->validate(
            $params,
            ['tahun' => ['validators' => ['digit']]]
        );
        $result = [];
        if (empty($params['tahun'])) {
            $years = $this->client->listTahun();
            if (count($years) > 0 && !array_key_exists('message', $years)) {
                $result['years'] = $years;
                $year = $years[count($years) - 1];
            } else {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal menghubungi service Kemenag: " . $years['message']);
            }
        } else {
            $year = $params['tahun'];
        }
        $result['data'] = $this->client->rekapPerJenjang($year);

        return new SimpleResponse($result);
    }
}
