<?php

use DusanKasan\Knapsack\Collection;

class WilayahController extends BaseController
{

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

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

        $version = !is_null($this->request->get('version')) ? $this->request->get('version') : getenv("MAP_VERSION");
        $query = strtolower($params['query']);
        $dir = $this->config['application']['publicDir'];

        if ($version == 1) {
            $geojson = json_decode(file_get_contents($dir . '/maps/kabupaten.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('A1KPKNAME', $e['properties']) && strpos(strtolower($e['properties']['A1KPKNAME']), $query) !== false)
                    || (array_key_exists('A2KPKNAME', $e['properties']) && strpos(strtolower($e['properties']['A2KPKNAME']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1KPKNAME' => $e['properties']['A1KPKNAME'],
                    'A2KPKNAME' => $e['properties']['A2KPKNAME'],
                    'A1CODE' => $e['properties']['A1CODE'],
                    'A2CODE' => $e['properties']['A2CODE']
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);
        } else if ($version == 2) {
            $geojson = json_decode(file_get_contents($dir . '/maps/kabupaten_2020.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('ADM1_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM1_EN']), $query) !== false)
                    || (array_key_exists('ADM2_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM2_EN']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1KPKNAME' => $e['properties']['ADM1_EN'],
                    'A2KPKNAME' => $e['properties']['ADM2_EN'],
                    'A1CODE' => intval(str_replace('ID', '', $e['properties']['ADM1_PCODE'])),
                    'A2CODE' => intval(str_replace('ID', '', $e['properties']['ADM2_PCODE']))
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);
        } else if ($version == 3) {
            $geojson = json_decode(file_get_contents($dir . '/maps/kabupaten_2023.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('ADM1_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM1_EN']), $query) !== false)
                    || (array_key_exists('ADM2_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM2_EN']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1KPKNAME' => $e['properties']['ADM1_EN'],
                    'A2KPKNAME' => $e['properties']['ADM2_EN'],
                    'A1CODE' => intval(str_replace('ID', '', $e['properties']['ADM1_PCODE'])),
                    'A2CODE' => intval(str_replace('ID', '', $e['properties']['ADM2_PCODE']))
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);
        }


        return new SimpleResponse($result);
    }

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

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

        $version = !is_null($this->request->get('version')) ? $this->request->get('version') : getenv("MAP_VERSION");
        $query = strtolower($params['query']);
        $dir = $this->config['application']['publicDir'];

        if ($version == 1) {
            $geojson = json_decode(file_get_contents($dir . '/maps/kabupaten.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('A1NAME', $e['properties']) && strpos(strtolower($e['properties']['A1NAME']), $query) !== false)
                    || (array_key_exists('A2NAME', $e['properties']) && strpos(strtolower($e['properties']['A2NAME']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1NAME' => $e['properties']['A1NAME'],
                    'A2NAME' => $e['properties']['A2NAME'],
                    'A1CODE' => $e['properties']['A1CODE'],
                    'A2CODE' => $e['properties']['A2CODE']
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);

            $wilayah_list = $this->rawQuery('select id, code from master_wilayah');
            $wilayah_dict = [];
            for ($i = 0; $i < count($wilayah_list); $i++) {
                $wilayah_dict[$wilayah_list[$i]['code']] = $wilayah_list[$i]['id'];
            }

            for ($i = 0; $i < count($result); $i++) {
                if (array_key_exists($result[$i]['A2CODE'],  $wilayah_dict)) {
                    $result[$i]['wilayah_id'] = $wilayah_dict[$result[$i]['A2CODE']];
                }
                if (array_key_exists($result[$i]['A1CODE'],  $wilayah_dict)) {
                    $result[$i]['parent_wilayah_id'] = $wilayah_dict[$result[$i]['A1CODE']];
                }
            }
        } else if ($version == 2) {
            $geojson = json_decode(file_get_contents($dir . '/maps/kabupaten_2020.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('ADM1_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM1_EN']), $query) !== false)
                    || (array_key_exists('ADM2_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM2_EN']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1NAME' => $e['properties']['ADM1_EN'],
                    'A2NAME' => $e['properties']['ADM2_EN'],
                    'A1CODE' => intval(str_replace('ID', '', $e['properties']['ADM1_PCODE'])),
                    'A2CODE' => intval(str_replace('ID', '', $e['properties']['ADM2_PCODE']))
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);

            $wilayah_list = $this->rawQuery('select id, code from master_wilayah');
            $wilayah_dict = [];
            for ($i = 0; $i < count($wilayah_list); $i++) {
                $wilayah_dict[$wilayah_list[$i]['code']] = $wilayah_list[$i]['id'];
            }

            for ($i = 0; $i < count($result); $i++) {
                if (array_key_exists($result[$i]['A2CODE'],  $wilayah_dict)) {
                    $result[$i]['wilayah_id'] = $wilayah_dict[$result[$i]['A2CODE']];
                }
                if (array_key_exists($result[$i]['A1CODE'],  $wilayah_dict)) {
                    $result[$i]['parent_wilayah_id'] = $wilayah_dict[$result[$i]['A1CODE']];
                }
            }
        }
        else if ($version == 3) {
            $geojson = json_decode(file_get_contents($dir . '/maps/kabupaten_2023.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('ADM1_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM1_EN']), $query) !== false)
                    || (array_key_exists('ADM2_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM2_EN']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1NAME' => $e['properties']['ADM1_EN'],
                    'A2NAME' => $e['properties']['ADM2_EN'],
                    'A1CODE' => intval(str_replace('ID', '', $e['properties']['ADM1_PCODE'])),
                    'A2CODE' => intval(str_replace('ID', '', $e['properties']['ADM2_PCODE']))
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);

            $wilayah_list = $this->rawQuery('select id, code from master_wilayah');
            $wilayah_dict = [];
            for ($i = 0; $i < count($wilayah_list); $i++) {
                $wilayah_dict[$wilayah_list[$i]['code']] = $wilayah_list[$i]['id'];
            }

            for ($i = 0; $i < count($result); $i++) {
                if (array_key_exists($result[$i]['A2CODE'],  $wilayah_dict)) {
                    $result[$i]['wilayah_id'] = $wilayah_dict[$result[$i]['A2CODE']];
                }
                if (array_key_exists($result[$i]['A1CODE'],  $wilayah_dict)) {
                    $result[$i]['parent_wilayah_id'] = $wilayah_dict[$result[$i]['A1CODE']];
                }
            }
        }


        return new SimpleResponse($result);
    }

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

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

        $query = strtolower($params['query']);
        $version = !is_null($this->request->get('version')) ? $this->request->get('version') : getenv("MAP_VERSION");
        $dir = $this->config['application']['publicDir'];
        if ($version == 1) {
            $geojson = json_decode(file_get_contents($dir . '/maps/provinsi.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('A1NAME', $e['properties']) && strpos(strtolower($e['properties']['A1NAME']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1NAME' => $e['properties']['A1NAME'],
                    'A1CODE' => $e['properties']['A1CODE']
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);

            $wilayah_list = $this->rawQuery("select id, code from master_wilayah where level='provinsi'");
            $wilayah_dict = [];
            for ($i = 0; $i < count($wilayah_list); $i++) {
                $wilayah_dict[$wilayah_list[$i]['code']] = $wilayah_list[$i]['id'];
            }

            for ($i = 0; $i < count($result); $i++) {
                if (array_key_exists($result[$i]['A1CODE'],  $wilayah_dict)) {
                    $result[$i]['wilayah_id'] = $wilayah_dict[$result[$i]['A1CODE']];
                }
            }
        } else if ($version == 2) {
            $geojson = json_decode(file_get_contents($dir . '/maps/provinsi_2020.json'), true);
            $filter = function ($e) use ($query) {
                return (array_key_exists('ADM1_EN', $e['properties']) && strpos(strtolower($e['properties']['ADM1_EN']), $query) !== false);
            };
            $mapper = function ($e) {
                return [
                    'A1NAME' => $e['properties']['ADM1_EN'],
                    'A1CODE' => intval(str_replace('ID', '', $e['properties']['ADM1_PCODE'])),
                ];
            };
            $geojson['features'] = array_values(array_filter($geojson['features'], $filter));
            $result = array_map($mapper, $geojson['features']);

            $wilayah_list = $this->rawQuery("select id, code from master_wilayah where level='provinsi'");
            $wilayah_dict = [];
            for ($i = 0; $i < count($wilayah_list); $i++) {
                $wilayah_dict[$wilayah_list[$i]['code']] = $wilayah_list[$i]['id'];
            }

            for ($i = 0; $i < count($result); $i++) {
                if (array_key_exists($result[$i]['A1CODE'],  $wilayah_dict)) {
                    $result[$i]['wilayah_id'] = $wilayah_dict[$result[$i]['A1CODE']];
                }
            }
        }

        return new SimpleResponse($result);
    }

    public function detailByCode($code) {
        $result = MasterWilayah::findFirst([
            'code = :code:',
            "bind" => [
                "code" => $code
            ],
        ]);
        return new SimpleResponse($result);
    }
}
