<?php
class PuskesmasController extends BaseController
{
    public function listProvinsi()
    {
        $listProv = array_map(
            function ($v) {
                return $v['provinsi'];
            },
            Puskesmas::find(
                [
                    "columns" => "distinct(provinsi) as provinsi",
                    "order" => "provinsi asc"
                ]
            )
                ->toArray()
        );
        $totalCount = count($listProv);
        return new PaginatedResponse($listProv, $totalCount, $totalCount, 0);
    }

    public function detail($id)
    {
        $params = $this->request->get();

        $result = Puskesmas::find(
            [
                "conditions" => "kode_puskesmas = :id:",
                "bind" => ["id" => $id],
                "columns" => "kode_puskesmas as kode, nama_puskesmas as nama, kab_kota, provinsi"
            ]
        );

        if ($this->shared) {
            $service = new ActivityService($this->shared, $this->logger);
            $service->createActivity(UserActivity::PRODUK_KESEHATAN, $id);
        }

        return new SingleResponse($result, "Puskesmas");
    }

    public function search()
    {
        $params = $this->request->get();

        $params['limit'] = $this->getDefaultLimit($params);
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $params['nama'] = array_key_exists('nama', $params) ? $params['nama'] : "";
        $params['provinsi'] = array_key_exists('provinsi', $params) ? $params['provinsi'] : "";
        $params['kota'] = array_key_exists('kota', $params) ? $params['kota'] : "";

        $validatedRequest = $this->validate(
            $params,
            [
                'limit' => ['validators' => ['digit']],
                'offset' => ['validators' => ['digit']]
            ]
        );

        $strWhere = "";
        $bind = [];
        if (strlen($params["provinsi"]) > 0) {
            $strWhere = "lower(provinsi) = :provinsi:";
            $bind["provinsi"] = strtolower($params["provinsi"]);
        }

        if (strlen($params["kota"]) > 0) {
            if (strlen($strWhere) > 0)
                $strWhere .= " and ";
            $strWhere .= "lower(kab_kota) like :kota:";
            $bind["kota"] = "%" . strtolower($params["kota"]) . "%";
        }

        if (strlen($params["nama"]) > 0) {
            if (strlen($strWhere) > 0)
                $strWhere .= " and ";
            $strWhere .= "lower(nama_puskesmas) like :nama:";
            $bind["nama"] = CommonTools::getDummyFuzzyKeyword($params["nama"]);
        }

        $totalCount = Puskesmas::count(
            [
                $strWhere,
                "bind" => $bind
            ]
        );

        $listRs = Puskesmas::find(
            [
                "columns" => "kode_puskesmas as kode, nama_puskesmas as nama, kab_kota, provinsi",
                $strWhere,
                "bind" => $bind,
                "limit" => $params["limit"],
                "offset" => $params["offset"]
            ]
        );

        return new PaginatedResponse($listRs, $totalCount, $params["limit"], $params["offset"]);
    }

    public function profile($kode_puskesmas)
    {
        $profile = Puskesmas::find(
            [
                "columns" => "nama_puskesmas as nama, kab_kota, provinsi, last_update,
                                    (jml_dokter_spesialis+jml_dokter_umum+jml_dokter_gigi) as jml_dokter,
                                    (jml_perawat+jml_perawat_gigi) as jml_perawat,
                                    jml_bidan, (jml_farmasi+jml_assisten_farmasi+jml_kes_masyarakat+jml_kes_ling) as jml_tenaga_medis,
                                    latitude, longitude, rawat_inap
                                    jml_tenaga_non_kes,
                                    jml_posyandu_pramata,
                                    jml_posyandu_madya,
                                    jml_posyandu_purnama,
                                    jml_posyandu_mandiri,
                                    jml_posyandu
                                ",
                "kode_puskesmas = :kode_puskesmas:",
                "bind" => [
                    "kode_puskesmas" => $kode_puskesmas
                ]
            ]
        )
            ->toArray();

        return new PaginatedResponse($profile, count($profile), 1, 0);
    }

    public function tahunKapitasi()
    {
        $years = array_map(
            function ($v) {
                return $v['tahun'];
            },
            PuskesmasKapitasi::find(["columns" => "distinct tahun"])
                ->toArray()
        );
        return new PaginatedResponse($years, count($years), count($years), 0);
    }

    public function danaKapitasi()
    {
        $params = $this->request->get();

        $validatedRequest = $this->validate(
            $params,
            [
                'tahun' => ['validators' => ['required', 'digit']],
                'kode_puskesmas' => ['validators' => ['required']]
            ]
        );

        $dana = PuskesmasKapitasi::find(
            [
                "columns" => "count(1) as jml_peserta, sum(kapitasi_yang_dibayarkan) as jml_biaya,
                                    tahun, bulan",
                "tahun = :tahun: and kode_puskesmas = :kode_puskesmas:",
                "bind" => [
                    "tahun" => $params["tahun"],
                    "kode_puskesmas" => $params["kode_puskesmas"]
                ],
                "group" => "tahun, bulan"
            ]
        )
            ->toArray();

        return new PaginatedResponse($dana, count($dana), 1, 0);
    }
}
