<?php
namespace App\Controllers\Kewilayahan\Sebaran;

use App\Libraries\AldLibrary;

class Identifikasi extends \App\Controllers\Kewilayahan\Kytp

{
    protected function data($request)
    {
        $Ald      = new AldLibrary;
        $username = session('nip');

        $opsiWilZona = $Ald->decryptMe($request->getPost('opsiWilZona'), $username);
        $adm4_pcode  = [];
        foreach ($request->getPost('adm4_pcode') ?? [] as $key => $value) {
            $adm4_pcode[] = $Ald->decryptKpdl($value, $username);
        }

        $id_poly_zona = [];
        foreach ($request->getPost('id_poly_zona') ?? [] as $key => $value) {
            $id_poly_zona[] = $Ald->decryptMe($value, $username);
        }

        $nip_ar_perekam = [];
        foreach ($request->getPost('nip_ar_perekam') ?? [] as $key => $value) {
            $nip_ar_perekam[] = $Ald->decryptMe($value, $username);
        }

        $nip_ar_pengampu = [];
        foreach ($request->getPost('nip_ar_pengampu') ?? [] as $key => $value) {
            $nip_ar_pengampu[] = $Ald->decryptMe($value, $username);
        }

        $db = \Config\Database::connect();

        $npwp = $db->table('KPDL_MV_LOKASI_SUBJEK')->select("CASE WHEN (NPWP IS NULL) THEN 'NON NPWP' ELSE 'BER NPWP' END AS IDENTIFIKASI, count(1) JML", false)
            ->groupBy("CASE WHEN (NPWP IS NULL) THEN 'NON NPWP' ELSE 'BER NPWP' END");

        if ($opsiWilZona == 'wilayah') {
            $npwp->whereIn('ADM4_PCODE', $adm4_pcode);
        }

        if ($opsiWilZona == 'zona') {
            $npwp->whereIn('ID_POLY_ZONA', $id_poly_zona);
        }

        if ($opsiWilZona == 'perekam') {
            $npwp->whereIn('CREATED_BY', $nip_ar_perekam);
        }

        if ($opsiWilZona == 'pengampu') {
            $npwp->whereIn('NIP_AR_PENGAMPU', $nip_ar_pengampu);
        }

        $data = $npwp->get()->getResult();

        $ret = [];

        foreach ($data as $b) {

            array_push($ret, [
                'key'   => $Ald->encryptKpdl($b->IDENTIFIKASI, $username),
                'name'  => $b->IDENTIFIKASI,
                'color' => $b->IDENTIFIKASI == 'NON NPWP' ? 'orange' : 'green',
                'y'     => floatval($b->JML),
            ]
            );
        }

        return $ret;
    }

    public function detail()
    {
        $dataRaw   = $this->dataRaw('raw')->getResultArray();
        $dataCount = $this->dataRaw('count')->getRow();
        $ret       = [
            'data' => $dataRaw,
            'meta' => ['totalRowCount' => $dataCount->JML],
        ];
        return $this->respond($ret, 200);
    }

    private function dataRaw($type)
    {
        $Ald      = new AldLibrary;
        $username = session('nip');
        $start    = $this->request->getGet('start');
        $size     = $this->request->getGet('size');
        $size     = ($size > 101) ? 101 : $size;
        $request  = json_decode(file_get_contents('php://input'));

        $query = $Ald->decryptKpdl($request->query, $username) ?? 'NON NPWP'; //NON NPWP || BER NPWP

        $opsiWilZona = $Ald->decryptMe($request->opsiWilZona ?? '', $username);
        $adm4_pcode  = [];
        foreach ($request->adm4_pcode ?? [] as $key => $value) {
            $adm4_pcode[] = $Ald->decryptKpdl($value, $username);
        }

        $id_poly_zona = [];
        foreach ($request->id_poly_zona ?? [] as $key => $value) {
            $id_poly_zona[] = $Ald->decryptMe($value, $username);
        }

        $nip_ar_perekam = [];
        foreach ($request->nip_ar_perekam ?? [] as $key => $value) {
            $nip_ar_perekam[] = $Ald->decryptMe($value, $username);
        }

        $nip_ar_pengampu = [];
        foreach ($request->nip_ar_pengampu ?? [] as $key => $value) {
            $nip_ar_pengampu[] = $Ald->decryptMe($value, $username);
        }

        $globalFilter = $this->request->getGet('globalFilter'); //string
        $filters      = json_decode($this->request->getGet('filters')); //     [{"id":"MERK_USAHA","value":"toko"},{"id":"ALAMAT","value":"graha"}]
        $sorting      = json_decode($this->request->getGet('sorting')); //    [{"id":"ALAMAT","desc":false}]

        $db   = \Config\Database::connect();
        $data = $db->table('KPDL_MV_LOKASI_SUBJEK A');
        $data->join('KPDL_REF_STATUS_SPT', 'ID_STATUS_SPT = STATUS_SPT_TAHUNAN_TERAKHIR', 'left');
        $data->join('PEGAWAI C', 'NIP_AR_ZONA = C.NIP9', 'left');
        $data->join('KPDL_MV_OBJEK_PERSUBJEK D', 'A.ID_KPDL_SUBJEK = D.ID_KPDL_SUBJEK', 'left');
        $data->join('PEGAWAI E', 'NIP_AR_PENGAMPU = E.NIP9', 'left');

        if ($opsiWilZona == 'wilayah') {
            $data->whereIn('ADM4_PCODE', $adm4_pcode);
        }

        if ($opsiWilZona == 'zona') {
            $data->whereIn('ID_POLY_ZONA', $id_poly_zona);
        }

        if ($opsiWilZona == 'perekam') {
            $data->whereIn('CREATED_BY', $nip_ar_perekam);
        }

        if ($opsiWilZona == 'pengampu') {
            $data->whereIn('NIP_AR_PENGAMPU', $nip_ar_pengampu);
        }

        if ($query == 'NON NPWP') {
            $data->where('A.NPWP IS NULL');
        }

        if ($query == 'BER NPWP') {
            $data->where('A.NPWP IS NOT NULL');
        }
        if ($globalFilter) {
            $columnFilter = ["NAMA", "ALAMAT", "MERK_USAHA"];
            $data->GroupStart();
            $data->orGroupStart();
            foreach ($columnFilter as $key => $value) {
                $data->orLike("UPPER(" . $value . ")", strtoupper($globalFilter), 'both');
            }
            $data->groupEnd();
            $data->groupEnd();
        }

        if (count($filters)) {
            $data->GroupStart();
            foreach ($filters as $key => $value) {
                if ($value->id == 'NM_AR_ZONA') {
                    $data->like("UPPER(C.NAMA)", strtoupper($value->value), 'both');
                } else if ($value->id == 'NM_AR_PENGAMPU') {
                    $data->like("UPPER(E.NAMA)", strtoupper($value->value), 'both');
                } else if ($value->id == 'NAMA') {
                    $data->like("UPPER(A.NAMA)", strtoupper($value->value), 'both');
                } else {

                    $data->like("UPPER(" . $value->id . ")", strtoupper($value->value), 'both');
                }
            }
            $data->groupEnd();
        }

        if (count($sorting)) {
            foreach ($sorting as $key => $value) {
                if ($value->id == 'NM_AR_ZONA') {
                    $data->orderBy("C.NAMA", $value->desc ? 'desc' : 'asc');
                } else if ($value->id == 'NAMA_AR_PENGAMPU') {
                    $data->orderBy("E.NAMA", $value->desc ? 'desc' : 'asc');
                } else if ($value->id == 'NAMA') {
                    $data->orderBy("A.NAMA", $value->desc ? 'desc' : 'asc');
                } else {

                    $data->orderBy($value->id, $value->desc ? 'desc' : 'asc');
                }
            }
        }

        if ($type == 'count') {
            $data->select('count(1) as JML');
            return $data->get();
        }
        if ($type == 'raw') {

            $data->select("UUID, A.NAMA,GEO_LOK_LAT, GEO_LOK_LING,ALAMAT, PROVINSI, KABUPATEN, KECAMATAN, KELURAHAN, RT, RW,
            A.NPWP, NO_IDENTITAS, MERK_USAHA, NM_KANTOR_PENGAMPU, JUMLAH_PEMBAYARAN_THN_TERAKHIR,STATUS_SPT_TAHUNAN_TERAKHIR,
            NM_KPP_ZONA ,NIP_AR_ZONA, NM_PEREKAM, KPP_ADM_PEREKAM, TO_CHAR(CREATION_DATE, 'YYYY-MM-DD HH24:II:SS')CREATION_DATE, KETERANGAN,
            C.NAMA NM_AR_ZONA, E.NAMA NM_AR_PENGAMPU, STATUS_WP_MFWP,JNS_WP_MFWP, COALESCE(D.SUM_NILAI,0) SUM_NILAI
            ");
            // print_r($data->getCompiledSelect());
            // exit;

            return $data->get($size - 1, $start);
        }

    }
}