<?php
namespace App\Controllers\Kewilayahan;

use App\Libraries\AldLibrary;
use CodeIgniter\API\ResponseTrait;
use CodeIgniter\Controller;

class Peta extends Controller
{

    use ResponseTrait;

    public function index()
    {
        // $db   = \Config\Database::connect();
        // $data = [];
        // if (session('isLogin')) {
        //     echo view('inc/head');
        //     echo view('inc/navbar');
        //     echo view('inc/sidebar');
        //     echo view('kewilayahan/kytp/kpdl', $data);
        //     echo view('inc/footer');
        // } else {
        //     return redirect()->to('auth');
        // }

        return view('kewilayahan/peta/peta');
    }

    public function defaultCentroidOld()
    {
        $db   = \Config\Database::connect();
        $data = $db->table("KPDL_ZP_NAS_DIFF A")
            ->select(" SDO_UTIL.TO_GEOJSON(SDO_GEOM.SDO_CENTROID(SDO_AGGR_UNION(SDOAGGRTYPE(A.WKB_GEOMETRY, 0.05)),0.05)) GEOJSON")
            ->where('KD_KANWIL', session('kwladm'));
        $sql = $data->getCompiledSelect();

        $db2    = new \Config\Database();
        $db_def = $db2->default;
        $conn   = oci_connect($db_def['username'], $db_def['password'], $db_def['hostname']);
        $stmt   = oci_parse($conn, $sql);
        oci_execute($stmt)
        or die("Unable to execute query\n");

        while ($row = oci_fetch_assoc($stmt)) {
            if ($row['GEOJSON']) {

                print $row['GEOJSON']->load() . "\n";
            } else {
                print null;
            }
        }
    }

    public function defaultCentroid()
    {
        $db   = \Config\Database::connect();
        $geom = $db->table('KPDL_ZP_NAS_DIFF A')->select("A.WKB_GEOMETRY")->where('KD_KANWIL', session('kwladm'))->limit(1);

        $data = $db->newQuery()->fromSubquery($geom, "A")
            ->select("SDO_UTIL.TO_WKTGEOMETRY(SDO_GEOM.SDO_CENTROID(SDO_AGGR_UNION(SDOAGGRTYPE(A.WKB_GEOMETRY, 0.05)),0.05)) GEOJSON");

        $sql = $data->getCompiledSelect();
        // print_r($sql);
        // exit;
        $db2    = new \Config\Database();
        $db_def = $db2->default;
        $conn   = oci_connect($db_def['username'], $db_def['password'], $db_def['hostname']);
        $stmt   = oci_parse($conn, $sql);
        oci_execute($stmt)
        or die("Unable to execute query\n");

        while ($row = oci_fetch_assoc($stmt)) {
            if ($row['GEOJSON']) {

                print $row['GEOJSON']->load();
            } else {
                print null;
            }
        }
    }

    public function matoaLokasi()
    {
        if (!$this->validate([
            'uuid' => 'required',
        ])) {
            return $this->respond($this->validator->getErrors(), 422);
        }

        $uuid = $this->request->getPost('uuid');

        $db   = \Config\Database::connect();
        $data = $db->table('KPDL_MV_LOKASI_SUBJEK A')
            ->select("A.NPWP, ALAMAT, NM_KPP_ZONA, NM_KANTOR_PENGAMPU, NM_PEREKAM, NM_KPP_PEREKAM,NAMA_AR_MFWP,
                    JNS_WP_MFWP,STATUS_WP_MFWP, WARNA_PEMBAYARAN_THN_TERAKHIR,STATUS_SPT_TAHUNAN_TERAKHIR,
                    MERK_USAHA, NO_TELP, TO_CHAR(CREATION_DATE,'YYYY-MM-DD HH24:MI:SS') CREATION_DATE, B.NAMA NAMA_AR_ZONA")
            ->join('PEGAWAI B', 'A.NIP_AR_ZONA=B.NIP9', 'left')
            ->where('UUID', $uuid)->get()->getRowArray();
        if ($data) {
            return $this->respond(array_change_key_case($data), 200);
        } else {
            return $this->respond([], 200);
        }
    }

    public function poiGoogle()
    {
        if (!$this->validate([
            'id_data' => 'required',
        ])) {
            return $this->respond($this->validator->getErrors(), 422);
        }

        $id_data = $this->request->getPost('id_data');

        $db   = \Config\Database::connect();
        $data = $db->table('KPDL_MV_POI_GOOGLE A')
            ->select("ID_DATA, NAMA, ALAMAT,  CATEGORY, NM_AR_ZONA, B.NM_KANTOR,
                TOP_IMAGE_URL, ADM1_EN, ADM2_EN, ADM3_EN, ADM4_EN,
                (regexp_replace(RATING , ',' , '.')) RATING,
                to_number(regexp_replace(REVIEWS , '[^[:digit:]]', '')) REVIEW")
            ->join('REF_KPP B', 'A.KD_KPP_ZONA =B.KD_KPP', 'left')
            ->where('ID_DATA', $id_data);
           // print_r($data->getCompiledSelect());
            //exit;
            $data = $data->get()->getRowArray();
        return $this->respond(array_change_key_case($data), 200);
    }

    public function zonapoly()
    {
        if (!$this->validate([
            'id_poly_zona' => ['required'],
        ])) {
            return $this->respond($this->validator->getErrors(), 422);
        }

        $Ald      = new AldLibrary;
        $username = session('nip');

        $id_poly_zona = [];
        foreach ($this->request->getPost('id_poly_zona') ?? [1, 2, 3] as $key => $value) {
            $id_poly_zona[] = $Ald->decryptMe($value, $username);
        }
        $db   = \Config\Database::connect();
        $data = $db->table("KPDL_ZP_NAS_DIFF A")
            ->select("SDO_UTIL.TO_WKTGEOMETRY(SDO_AGGR_UNION(SDOAGGRTYPE(A.WKB_GEOMETRY,0.05))) GEOJSON")
            ->whereIn('OGC_FID', $id_poly_zona);
        $sql = $data->getCompiledSelect();
        // print_r($sql);
        // exit;
        $db2    = new \Config\Database();
        $db_def = $db2->default;
        $conn   = oci_connect($db_def['username'], $db_def['password'], $db_def['hostname']);
        $stmt   = oci_parse($conn, $sql);
        oci_execute($stmt)
        or die("Unable to execute query\n");

        while ($row = oci_fetch_assoc($stmt)) {
            print $row['GEOJSON']->load();
        }

    }

    public function kelurahanpoly_ori()
    {
        if (!$this->validate([
            'adm4_pcode' => ['required'],
        ])) {
            return $this->respond($this->validator->getErrors(), 422);
        }

        $Ald      = new AldLibrary;
        $username = session('nip');

        $opsiWilZona = $Ald->decryptMe($this->request->getPost('opsiWilZona'), $username);

        $adm4_pcode = [];
        foreach ($this->request->getPost('adm4_pcode') ?? [1, 2, 3] as $key => $value) {
            $adm4_pcode[] = $Ald->decryptKpdl($value, $username);
        }
        $db   = \Config\Database::connect();
        $data = $db->table("KPDL_V_BATAS_DESA A")
            ->select("SDO_UTIL.TO_WKTGEOMETRY(SDO_AGGR_UNION(SDOAGGRTYPE(A.WKB_GEOMETRY,0.05))) GEOJSON")
            ->whereIn('ADM4_PCODE', $adm4_pcode);
        $sql = $data->getCompiledSelect();
        // print_r($sql);
        // exit;
        $db2    = new \Config\Database();
        $db_def = $db2->default;
        $conn   = oci_connect($db_def['username'], $db_def['password'], $db_def['hostname']);
        $stmt   = oci_parse($conn, $sql);
        oci_execute($stmt)
        or die("Unable to execute query\n");

        while ($row = oci_fetch_assoc($stmt)) {
            // Call the load() method to get the contents of the LOB
            print $row['GEOJSON']->load() . "\n";
        }

    }

    public function kelurahanpoly()
    {
        if (!$this->validate([
            'adm4_pcode' => ['required'],
        ])) {
            return $this->respond($this->validator->getErrors(), 422);
        }

        $Ald      = new AldLibrary;
        $username = session('nip');

        // $opsiWilZona = $Ald->decryptMe($this->request->getPost('opsiWilZona'), $username);

        $adm4_pcode = [];
        foreach ($this->request->getPost('adm4_pcode') ?? [1, 2, 3] as $key => $value) {
            $adm4_pcode[] = $Ald->decryptKpdl($value, $username);
        }
        $db   = \Config\Database::connect();
        $data = $db->table("KPDL_V_BATAS_DESA A")
            ->select("SDO_UTIL.TO_WKTGEOMETRY(SDO_AGGR_UNION(SDOAGGRTYPE(A.WKB_GEOMETRY,0.05))) GEOJSON")
            ->whereIn('ADM4_PCODE', $adm4_pcode);
        $sql = $data->getCompiledSelect();
        // print_r($sql);
        // exit;
        // $sql = "SELECT SDO_UTIL.TO_WKTGEOMETRY(SDO_UTIL.EXTRACT(a.wkb_geometry, 1)) GEOJSON
        //         FROM KPDL_V_BATAS_DESA a
        //         WHERE ADM4_PCODE IN ('31.73.07.1004','31.73.07.1005','31.73.07.1006','31.73.07.1003','31.73.07.1001','31.73.07.1002')";
        $db2    = new \Config\Database();
        $db_def = $db2->default;
        $conn   = oci_connect($db_def['username'], $db_def['password'], $db_def['hostname']);
        $stmt   = oci_parse($conn, $sql);
        oci_execute($stmt)
        or die("Unable to execute query\n");
        // $polyArray = '';
        while ($row = oci_fetch_assoc($stmt)) {
            // Call the load() method to get the contents of the LOB
            // array_push($polyArray, str_replace(" 0.0", "", $row['GEOJSON']->load()));
            $polyArray = str_replace(" 0.0", "", $row['GEOJSON']->load());

            // $polyArray = $row['GEOJSON']->load();
            // print $row['GEOJSON']->load();
        }

        // $poly = null;
        // if (count($polyArray)) {
        //     $gE   = new GeometryEngine();
        //     $poly = Polygon::fromText($polyArray[0]);
        //     for ($i = 1; $i <= count($polyArray); $i++) {
        //         $poly = $gE->union($poly, Polygon::fromText($polyArray[$i]));
        //         // $poly->union(Polygon::fromText($polyArray[$i]));
        //     }

        //     echo $poly;
        // }
        // $poly->union()
        return $this->respond($polyArray, 200);
        // echo $polyArray;
    }
}