<?php
class KotaKabupatenController extends BaseController
{
    public function list()
    {
        $getParams = $this->request->get();

        $getParams['limit'] = array_key_exists('limit', $getParams) ? $getParams['limit'] : 30;
        $getParams['offset'] = array_key_exists('offset', $getParams) ? $getParams['offset'] : 0;
        $getParams['keyword'] = array_key_exists('keyword', $getParams) ? $getParams['keyword'] : '';
        $getParams['provinsi_code'] = array_key_exists('provinsi_code', $getParams) ? $getParams['provinsi_code'] : '';
        $getParams['trashed'] = array_key_exists('trashed', $getParams) ? $getParams['trashed'] : 0;

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

        $conditions = [
            //  conditions ngambil dari database berdasarkan table kota_kabupaten_name
            'conditions' => 'kota_kabupaten_name ilike :KotaKabupaten: AND provinsi_code LIKE :provinsi_code:' . ($getParams['trashed'] ? '' : ' AND deleted_at IS NULL'),
            'bind' => [
                'KotaKabupaten' => '%' . $params['keyword'] . '%',
                'provinsi_code' => '%' . $params['provinsi_code'] . '%'
            ]
        ];

        $KotaKabupaten_list = KotaKabupaten::find(array_merge($conditions, [
            'limit' => $params['limit'],
            'offset' => $params['offset'],
        ]));

        $total_record = KotaKabupaten::count($conditions);

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

    public function listDagri()
    {
        $this->checkScopes(['admin.view']);
        $getParams = $this->request->get();

        $getParams['parameter'] = array_key_exists('parameter', $getParams) ? $getParams['parameter'] : null;
        $getParams['value'] = array_key_exists('value', $getParams) ? $getParams['value'] : null;

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

        $client = new KemendagriClient($this->config["kemendagri_splp_prop"]);
        $provinsis = $client->listKabKota($params['parameter'], $params['value']);

        return new CollectionPaginatedResponse($provinsis);
    }

    public function compareDagri() {
        $this->checkScopes(['admin.view']);

        $client = new KemendagriClient($this->config["kemendagri_splp_prop"]);
        $dataLocal = MasterKotaKabupaten::find([
            'columns' => 'kota_kabupaten_code, kota_kabupaten_name',
            'conditions' => 'deleted_at IS NULL'
        ])->toArray();
        $dataDagri = $client->listKabKota();

        $diff = array_merge(
            WilayahService::compareKabKotaDagriWithDB($dataDagri, $dataLocal),
            WilayahService::compareKabKotaDBWithDagri($dataLocal, $dataDagri)
        );

        return new CollectionPaginatedResponse($diff);
    }

    public function bulkUpdateName() {
        $this->checkScopes(['admin.view']);

        $rawBody = $this->request->getJsonRawBody(true);
        $params = $this->validate(
            $rawBody,
            [
                'kota_kabupatens' => ['validators' => ['required']]
            ]
        );
        $kotaKabupatens = $params['kota_kabupatens'];
        if (!is_array($kotaKabupatens)) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Parameter kota_kabupatens tidak valid!");
        }

        try {
            $this->db->begin();
            $result = [];
            foreach ($kotaKabupatens as $kotaKabupaten) {
                $masterKotaKabupaten = MasterKotaKabupaten::findFirst([
                    'conditions' => 'kota_kabupaten_code = :code:',
                    'bind' => ['code' => WilayahService::sanitizeCode($kotaKabupaten['kode_kabkota'])]
                ]);
                $masterKotaKabupaten->updated_at = DateHelper::getNowTimezoned();
                $masterKotaKabupaten->kota_kabupaten_name = $kotaKabupaten['nama_kabkota'];
                if (!$masterKotaKabupaten->save()) {
                    throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Gagal melakukan perubahan data!");
                }
                $result[] = $masterKotaKabupaten;
            }

            $this->db->commit();
            return new CollectionPaginatedResponse($result);
        } catch (\Exception $e) {
            $this->db->rollback();
            throw $e;
        }
    }
}
