<?php

class PerizinanController extends BaseController
{
    public function index()
    {
        $params = $this->request->get();

        $params['limit'] = $this->getDefaultLimit($params);
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $params['type'] = array_key_exists('type', $params) ? $params['type'] : null;

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

        if (empty($validatedRequest['type'])) {
            $result = PerizinanKontak::find([
                'conditions' => 'nama_daerah ilike :prov:',
                'bind' => [
                    'prov' => '%Provinsi%'
                ],
                'limit' => $validatedRequest['limit'],
                'offset' => $validatedRequest['offset']
            ]);

            $total_count = PerizinanKontak::count([
                'conditions' => 'nama_daerah ilike :prov:',
                'bind' => [
                    'prov' => '%Provinsi%'
                ]
            ]);
        } else {
            $result = PerizinanKontak::find([
                'conditions' => 'nama_daerah ilike :kab: OR nama_daerah ilike :kota:',
                'bind' => [
                    'kab' => '%Kabupaten%',
                    'kota' => '%Kota%'
                ],
                'limit' => $validatedRequest['limit'],
                'offset' => $validatedRequest['offset']
            ]);
            $total_count = PerizinanKontak::count([
                'conditions' => 'nama_daerah ilike :kab: OR nama_daerah ilike :kota:',
                'bind' => [
                    'kab' => '%Kabupaten%',
                    'kota' => '%Kota%'
                ]
            ]);
        }

        return new PaginatedResponse($result, $total_count, $validatedRequest["limit"], $validatedRequest['offset']);
    }
    public function detail($id)
    {
        if($id == 'undefined')
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Parameter ID tidak boleh "undefined"!');

        $result = PerizinanKontak::findFirst($id);

        if (empty($result)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, 'Dinas tidak di temukan');
        }

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

        return new CollectionPaginatedResponse([$result->toDetail()]);
    }
    public function search()
    {
        $params = $this->request->get();

        $params['limit'] = $this->getDefaultLimit($params);
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $params['keyword'] = array_key_exists('keyword', $params) ? $params['keyword'] : "";
        $params['type'] = array_key_exists('type', $params) ? $params['type'] : null;

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

        if (empty($params['type'])) {
            $result = PerizinanKontak::find([
                'conditions' => 'nama_daerah ilike :prov:',
                'bind' => [
                    'prov' => 'Provinsi %' . $validatedRequest['keyword'] . '%'
                ],
                'limit' => $params['limit'],
                'offset' => $params['offset']
            ]);
            $totalCount = PerizinanKontak::count([
                'conditions' => 'nama_daerah ilike :prov:',
                'bind' => [
                    'prov' => 'Provinsi %' . $validatedRequest['keyword'] . '%'
                ]
            ]);
        } else {
            $result = PerizinanKontak::find([
                'conditions' => 'nama_daerah ilike :kabupaten: OR nama_daerah ilike :kota:',
                'bind' => [
                    'kabupaten' => 'Kabupaten %' . $validatedRequest['keyword'] . '%',
                    'kota' => 'Kota %' . $validatedRequest['keyword'] . '%'
                ],
                'limit' => $validatedRequest['limit'],
                'offset' => $validatedRequest['offset']
            ]);

            $totalCount = PerizinanKontak::count([
                'conditions' => 'nama_daerah ilike :kabupaten: OR nama_daerah ilike :kota:',
                'bind' => [
                    'kabupaten' => 'Kabupaten %' . $validatedRequest['keyword'] . '%',
                    'kota' => 'Kota %' . $validatedRequest['keyword'] . '%'
                ],
            ]);
        }

        return new PaginatedResponse($result, $totalCount, $validatedRequest["limit"], $validatedRequest['offset']);
    }

    public function listProvPerizinan()
    {
        $result = $this->rawQuery("
            SELECT DISTINCT (provinsi) FROM jaga.perizinan_kontak ORDER BY provinsi ASC;
        ");

        return new CollectionPaginatedResponse($result);
    }

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

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

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

        $builder = $this->modelsManager->createBuilder()->from('BkpmDaftarPerizinan')
            ->limit($params['limit'])
            ->offset($params['offset']);

        $countBuilder = $this->modelsManager->createBuilder()->from('BkpmDaftarPerizinan')
            ->columns(['total_record' => 'COUNT(*)'])
            ->limit(1);

        if (!empty($params['keyword'])) {
            $builder->andWhere(
                "BkpmDaftarPerizinan.NAMA_DOKUMEN ilike :keyword:",
                [
                    'keyword' => '%' . $params['keyword'] . '%',
                ]
            );
            $countBuilder->andWhere(
                "BkpmDaftarPerizinan.NAMA_DOKUMEN ilike :keyword:",
                [
                    'keyword' => '%' . $params['keyword'] . '%',
                ]
            );
        }

        $rows = $builder->getQuery()->execute();
        $total_record = (int)$countBuilder->getQuery()->execute()->getFirst()->total_record;

        return new PaginatedResponse($rows, $total_record, $validatedRequest["limit"], $validatedRequest['offset']);
    }

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

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

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

        $result = BkpmIzin::find([
            'conditions' => 'nama ilike :nama:',
            'bind' => [
                'nama' => '%' . $validatedRequest['keyword'] . '%'
            ],
            'limit' => $validatedRequest['limit'],
            'offset' => $validatedRequest['offset']
        ]);

        $total_count = BkpmIzin::count();

        return new PaginatedResponse($result, $total_count, $validatedRequest["limit"], $validatedRequest['offset']);
    }
}
