<?php

class ApbdController extends BaseController
{
    public function listApbd()
    {
        $getParams = $this->request->get();

        $getParams['limit'] = $this->getDefaultLimit($getParams);
        $getParams['offset'] = array_key_exists('offset', $getParams) ? $getParams['offset'] : 0;
        $getParams['keyword'] = array_key_exists('keyword', $getParams) ? $getParams['keyword'] : '';
        $getParams['type'] = array_key_exists('type', $getParams) ? $getParams['type'] : '';
        $getParams['tahun'] = array_key_exists('tahun', $getParams) ? $getParams['tahun'] : '2019';

        $params = $this->validate(
            $getParams,
            [
                'limit' => ['validators' => ['digit']],
                'offset' => ['validators' => ['digit']],
                'keyword' => ['validators' => []],
                'type' => ['validators' => []],
                'tahun' => ['validators' => []]
            ]
        );

        if (!empty($params['type'])) {
            if ($params['type'] == Apbd2019::KABKOT) {
                $apbd = Apbd2019::find([
                    'conditions' => '(uraian ilike :kab: OR uraian ilike :kota:) AND uraian ilike :keyword: AND th_anggaran = :tahun:',
                    'bind' => [
                        'keyword' => '%' . $params['keyword'] . '%',
                        'kab' => '%Kab.%',
                        'kota' => '%Kota%',
                        'tahun' => $params['tahun']
                    ],
                    'limit' => $params['limit'],
                    'offset' => $params['offset']
                ]);
                $total_record = Apbd2019::count([
                    'conditions' => '(uraian ilike :kab: OR uraian ilike :kota:) AND uraian ilike :keyword: AND th_anggaran = :tahun:',
                    'bind' => [
                        'keyword' => '%' . $params['keyword'] . '%',
                        'kab' => '%Kab.%',
                        'kota' => '%Kota%',
                        'tahun' => $params['tahun']
                    ]
                ]);
            } else {
                $apbd = Apbd2019::find([
                    'conditions' => 'uraian ilike :prov: AND uraian ilike :keyword: AND th_anggaran = :tahun:',
                    'bind' => [
                        'keyword' => '%' . $params['keyword'] . '%',
                        'prov' => '%Provinsi%',
                        'tahun' => $params['tahun']
                    ],
                    'limit' => $params['limit'],
                    'offset' => $params['offset']
                ]);
                $total_record = Apbd2019::count([
                    'conditions' => 'uraian ilike :prov: AND uraian ilike :keyword: AND th_anggaran = :tahun:',
                    'bind' => [
                        'keyword' => '%' . $params['keyword'] . '%',
                        'prov' => '%Provinsi%',
                        'tahun' => $params['tahun']
                    ]
                ]);
            }
        } else {
            $apbd = Apbd2019::find([
                'conditions' => 'uraian ilike :keyword:',
                'bind' => [
                    'keyword' => '%' . $params['keyword'] . '%'
                ],
                'limit' => $params['limit'],
                'offset' => $params['offset']
            ]);

            $total_record = Apbd2019::count();
        }


        return new PaginatedResponse($apbd, $total_record, $params['limit'], $params['offset']);
    }

    public function detailApbd($kode)
    {
        $getParams = $this->request->get();

        $getParams['tahun'] = array_key_exists('tahun', $getParams) ? $getParams['tahun'] : '2019';

        $params = $this->validate(
            $getParams,
            [
                'tahun' => ['validators' => []]
            ]
        );

        $getDetail = Apbd2019::findFirst([
            'th_anggaran =:tahun: AND kab_key = :kab_key:',
            'bind' => [
                'tahun' => $params['tahun'],
                'kab_key' => $kode
            ]
        ]);

        if (empty($getDetail)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Data tidak ditemukan');
        }

        return new CollectionPaginatedResponse([$getDetail]);
    }
    public function detailApbdFungsi($kode)
    {
        $getParams = $this->request->get();

        $getParams['tahun'] = array_key_exists('tahun', $getParams) ? $getParams['tahun'] : '2019';

        $params = $this->validate(
            $getParams,
            [
                'tahun' => ['validators' => []]
            ]
        );

        $getDetail = ApbdPerFungsi::findFirst([
            'th_anggaran =:tahun: AND kode_wilayah = :kode_wilayah:',
            'bind' => [
                'tahun' => $params['tahun'],
                'kode_wilayah' => $kode
            ]
        ]);

        if (empty($getDetail)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Data tidak ditemukan');
        }

        return new CollectionPaginatedResponse([$getDetail]);
    }
    public function listTahunApbd($kode)
    {
        $result = $this->rawQuery("
            SELECT DISTINCT (th_anggaran) as tahun FROM jaga.kemenkeu_apbd WHERE kab_key = :kab_key
        ", ['kab_key' => $kode]);

        return new CollectionPaginatedResponse($result);
    }
}
