<?php

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

        $params['keyword'] = array_key_exists('keyword', $params) ? $params['keyword'] : '';
        $params['limit'] = array_key_exists('limit', $params) ? $params['limit'] : 100;
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $params['src'] = array_key_exists('src', $params) ? $params['src'] : null;

        $validatedParams = $this->validate(
            $params,
            [
                'keyword' => ['validators' => []],
                'limit' => ['validators' => ['digit']],
                'offset' => ['validators' => ['digit']],
                'src' => ['validators' => [
                    'required',
                    [
                        'name' => 'inclusion_in',
                        'params' => ['instansi','wilayah']
                    ]
                ]],
            ]
        );

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        $meta = [
            'total_result' => 0,
            'limit' => $validatedParams['limit'],
            'offset' => $validatedParams['offset']
        ];

        try {
            $sigClient->setLogger($this->logger);
            $response = $sigClient->instansiWilayah($validatedParams['keyword'], $validatedParams['src'], $validatedParams['limit'], $validatedParams['offset']);
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service SIG");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $data = $response['data'];
                if($validatedParams['src'] == 'instansi') {
                    $sigInstansiKeyVal = ArrayHelper::asKeyValue(SigInstansi::find()->toArray(), "id_instansi_gol");

                    foreach($data as $key => $value) {
                        if(array_key_exists($value['id_instansi'], $sigInstansiKeyVal)) {
                            $data[$key]['id_instansi_jaga'] = $sigInstansiKeyVal[$value['id_instansi']]['id_instansi_jaga'];
                        }
                        else {
                            $data[$key]['id_instansi_jaga'] = null;
                        }
                        $data[$key]['id_instansi_gol'] = $value['id_instansi'];
                        unset($data[$key]['id_instansi']);
                    }

                }

                $result = $data;
                $meta = $response['meta'];
            }
        }
        catch (Exception $e) {

        }

        return new PaginatedResponse($result, $meta['total_result'], $meta['limit'], $meta['offset']);
    }

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

        $params['id_instansi_jaga'] = array_key_exists('id_instansi_jaga', $params) ? $params['id_instansi_jaga'] : 0;
        $params['id_instansi_gol'] = array_key_exists('id_instansi_gol', $params) ? $params['id_instansi_gol'] : 0;
        $params['kode_provinsi'] = array_key_exists('kode_provinsi', $params) ? $params['kode_provinsi'] : 0;
        $params['kode_kota_kabupaten'] = array_key_exists('kode_kota_kabupaten', $params) ? $params['kode_kota_kabupaten'] : 0;
        $params['tahun'] = array_key_exists('tahun', $params) ? $params['tahun'] : null;

        $validatedParams = $this->validate(
            $params,
            [
                'id_instansi_jaga' => ['validators' => ['digit']],
                'id_instansi_gol' => ['validators' => ['digit']],
                'kode_provinsi' => ['validators' => ['digit']],
                'kode_kota_kabupaten' => ['validators' => []],
                'tahun' => ['validators' => ['required', 'digit']],
            ]
        );

        if (strpos($validatedParams['kode_kota_kabupaten'], '.') === false) {
            $validatedParams['kode_kota_kabupaten'] = substr_replace($validatedParams['kode_kota_kabupaten'], '.', 2, 0);
        }

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        try {
            $idIntansiGol = $validatedParams['id_instansi_gol'];
            if($idIntansiGol == 0 && $validatedParams['id_instansi_jaga'] > 0) {
                $sigInstansiKeyVal = ArrayHelper::asKeyValue(SigInstansi::find()->toArray(), "id_instansi_jaga");
                if(array_key_exists($validatedParams['id_instansi_jaga'], $sigInstansiKeyVal)) {
                    $idIntansiGol = $sigInstansiKeyVal[$validatedParams['id_instansi_jaga']]['id_instansi_gol'];
                }
            }

            $sigClient->setLogger($this->logger);
            $response = $sigClient->grafik($idIntansiGol, $validatedParams['kode_provinsi'], $validatedParams['kode_kota_kabupaten'], $validatedParams['tahun']);
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service SIG");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
            }
        }
        catch (Exception $e) {

        }

        return new SimpleResponse($result);
    }

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

        $params['id_instansi_jaga'] = array_key_exists('id_instansi_jaga', $params) ? $params['id_instansi_jaga'] : 0;
        $params['id_instansi_gol'] = array_key_exists('id_instansi_gol', $params) ? $params['id_instansi_gol'] : 0;
        $params['kode_provinsi'] = array_key_exists('kode_provinsi', $params) ? $params['kode_provinsi'] : 0;
        $params['kode_kota_kabupaten'] = array_key_exists('kode_kota_kabupaten', $params) ? $params['kode_kota_kabupaten'] : 0;
        $params['tahun'] = array_key_exists('tahun', $params) ? $params['tahun'] : null;
        $params['limit'] = array_key_exists('limit', $params) ? (intval($params['limit']) > 0 ? $params['limit'] : 99999) : 5;
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $params['order_by'] = array_key_exists('order_by', $params) ? $params['order_by'] : 'id';
        $params['order_direction'] = array_key_exists('order_direction', $params) ? $params['order_direction'] : 'asc';

        $validatedParams = $this->validate(
            $params,
            [
                'id_instansi_jaga' => ['validators' => ['digit']],
                'id_instansi_gol' => ['validators' => ['digit']],
                'kode_provinsi' => ['validators' => ['digit']],
                'kode_kota_kabupaten' => ['validators' => []],
                'tahun' => ['validators' => ['required', 'digit']],
                'limit' => ['validators' => ['required', 'digit']],
                'offset' => ['validators' => ['required', 'digit']],
                'order_by' => ['validators' => []],
                'order_direction' => ['validators' => [[
                    'name' => 'inclusion_in',
                    'params' => ['asc','desc']
                ]]],
            ]
        );

        if (strpos($validatedParams['kode_kota_kabupaten'], '.') === false) {
            $validatedParams['kode_kota_kabupaten'] = substr_replace($validatedParams['kode_kota_kabupaten'], '.', 2, 0);
        }

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        $meta = [
            'total_result' => 0,
            'limit' => $validatedParams['limit'],
            'offset' => $validatedParams['offset']
        ];

        try {
            $idIntansiGol = $validatedParams['id_instansi_gol'];
            if($idIntansiGol == 0 && $validatedParams['id_instansi_jaga'] > 0) {
                $sigInstansiKeyVal = ArrayHelper::asKeyValue(SigInstansi::find()->toArray(), "id_instansi_jaga");
                if(array_key_exists($validatedParams['id_instansi_jaga'], $sigInstansiKeyVal)) {
                    $idIntansiGol = $sigInstansiKeyVal[$validatedParams['id_instansi_jaga']]['id_instansi_gol'];
                }
            }

            $sigClient->setLogger($this->logger);
            $response = $sigClient->tabel($idIntansiGol, $validatedParams['kode_provinsi'], $validatedParams['kode_kota_kabupaten'], $validatedParams['tahun'], $validatedParams['limit'], $validatedParams['offset'], $validatedParams['order_by'], $validatedParams['order_direction']);
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service SIG");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
                $meta = $response['meta'];
            }
        }
        catch (Exception $e) {

        }

        return new PaginatedResponse($result, $meta['total_result'], $meta['limit'], $meta['offset']);
    }

    public function tahunMonev() {
        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        try {
            $sigClient->setLogger($this->logger);
            $response = $sigClient->tahunMonev();
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service SIG");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
            }
        }
        catch (Exception $e) {

        }

        return new SimpleResponse($result);
    }

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

        $params['limit'] = array_key_exists('limit', $params) ? $params['limit'] : 10;
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $params['status'] = array_key_exists('status', $params) ? $params['status'] : 'ALL';
        $params['id_instansi_jaga'] = array_key_exists('id_instansi_jaga', $params) ? $params['id_instansi_jaga'] : 0;
        $params['id_instansi_gol'] = array_key_exists('id_instansi_gol', $params) ? $params['id_instansi_gol'] : 0;
        $params['kode_provinsi'] = array_key_exists('kode_provinsi', $params) ? $params['kode_provinsi'] : 0;
        $params['kode_kota_kabupaten'] = array_key_exists('kode_kota_kabupaten', $params) ? $params['kode_kota_kabupaten'] : 0;

        $validatedParams = $this->validate(
            $params,
            [
                "limit" => ["validators" => ['digit']],
                "offset" => ["validators" => ['digit']],
                "src" => ["validators" => [[
                    'name' => 'inclusion_in',
                    'params' => ['DAERAH','KL']
                ]]],
                "tahun" => ["validators" => ['required', 'digit']],
                "status" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['ALL','MONEV']
                ]]],
                "id_instansi_jaga" => ["validators" => ['digit']],
                "id_instansi_gol" => ["validators" => ['digit']],
                "kode_provinsi" => ["validators" => ['digit']],
                "kode_kota_kabupaten" => ["validators" => ['digit']],
            ]
        );

        if (strpos($validatedParams['kode_kota_kabupaten'], '.') === false) {
            $validatedParams['kode_kota_kabupaten'] = substr_replace($validatedParams['kode_kota_kabupaten'], '.', 2, 0);
        }

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        $meta = [
            'total_result' => 0,
            'limit' => $validatedParams['limit'],
            'offset' => $validatedParams['offset']
        ];

        try {
            $idInstansiGol = $this->getIdInstansiGol($validatedParams["id_instansi_gol"], $validatedParams["id_instansi_jaga"]);
            $sigClient->setLogger($this->logger);
            $response = $sigClient->peringkatMonev(
                $validatedParams["limit"],
                $validatedParams["offset"],
                $validatedParams["src"],
                $validatedParams["tahun"],
                $validatedParams["status"],
                $idInstansiGol,
                $validatedParams["kode_provinsi"],
                $validatedParams["kode_kota_kabupaten"]
            );
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service GOL");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
                $meta = $response['meta'];
            }
        }
        catch (Exception $e) {

        }

        return new PaginatedResponse($result, $meta['total_result'], $meta['limit'], $meta['offset']);
    }

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

        $params['status'] = array_key_exists('status', $params) ? $params['status'] : 'ALL';
        $params['id_instansi_jaga'] = array_key_exists('id_instansi_jaga', $params) ? $params['id_instansi_jaga'] : 0;
        $params['id_instansi_gol'] = array_key_exists('id_instansi_gol', $params) ? $params['id_instansi_gol'] : 0;
        $params['kode_provinsi'] = array_key_exists('kode_provinsi', $params) ? $params['kode_provinsi'] : 0;
        $params['kode_kota_kabupaten'] = array_key_exists('kode_kota_kabupaten', $params) ? $params['kode_kota_kabupaten'] : 0;

        $validatedParams = $this->validate(
            $params,
            [
                "src" => ["validators" => [[
                    'name' => 'inclusion_in',
                    'params' => [null, 'DAERAH','KL']
                ]]],
                "tahun" => ["validators" => ['required', 'digit']],
                "status" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['ALL','MONEV']
                ]]],
                "id_instansi_jaga" => ["validators" => ['digit']],
                "id_instansi_gol" => ["validators" => ['digit']],
                "kode_provinsi" => ["validators" => ['digit']],
                "kode_kota_kabupaten" => ["validators" => ['digit']],
            ]
        );

        if (strpos($validatedParams['kode_kota_kabupaten'], '.') === false) {
            $validatedParams['kode_kota_kabupaten'] = substr_replace($validatedParams['kode_kota_kabupaten'], '.', 2, 0);
        }

        $sigClient = new SigClient($this->config["sig_prop"], $this);

        try {
            $idInstansiGol = $this->getIdInstansiGol($validatedParams["id_instansi_gol"], $validatedParams["id_instansi_jaga"]);
            $sigClient->setLogger($this->logger);
            $result = $sigClient->exportPeringkatMonev(
                $validatedParams["src"],
                $validatedParams["tahun"],
                $validatedParams["status"],
                $idInstansiGol,
                $validatedParams["kode_provinsi"],
                $validatedParams["kode_kota_kabupaten"]
            );
            $response = new Phalcon\Http\Response();
            $response
                ->setContent($result->getBody()->getContents())
                ->setContentType('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
                ->setHeader(
                    'Content-Disposition',
                    $result->getHeader('Content-Disposition')[0]
                );

            return $response;
        }
        catch (Exception $e) {
            throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service GOL");
        }
    }

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

        $params['status'] = array_key_exists('status', $params) ? $params['status'] : 'ALL';
        $params['kode_wilayah'] = array_key_exists('kode_wilayah', $params) ? $params['kode_wilayah'] : 0;

        $validatedParams = $this->validate(
            $params,
            [
                "tahun" => ["validators" => ['required', 'digit']],
                "status" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['ALL','MONEV']
                ]]],
                "level" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['NASIONAL', 'PROVINSI', 'KOTA_KABUPATEN']
                ]]],
                "kode_wilayah" => ["validators" => ['digit']],
            ]
        );

        if (strlen($validatedParams['kode_wilayah']) > 2 && strpos($validatedParams['kode_wilayah'], '.') === false) {
            $validatedParams['kode_wilayah'] = substr_replace($validatedParams['kode_wilayah'], '.', 2, 0);
        }

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        try {
            $sigClient->setLogger($this->logger);
            $response = $sigClient->mapAvgMonevDaerah(
                $validatedParams["tahun"],
                $validatedParams["status"],
                $validatedParams["level"],
                $validatedParams["kode_wilayah"]
            );
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service GOL");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
            }
        }
        catch (Exception $e) {

        }

        return new CollectionPaginatedResponse($result);
    }

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

        $params['status'] = array_key_exists('status', $params) ? $params['status'] : 'ALL';
        $params['kode_wilayah'] = array_key_exists('kode_wilayah', $params) ? $params['kode_wilayah'] : 0;

        $validatedParams = $this->validate(
            $params,
            [
                "tahun" => ["validators" => ['required', 'digit']],
                "status" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['ALL','MONEV']
                ]]],
                "level" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['NASIONAL', 'PROVINSI', 'KOTA_KABUPATEN']
                ]]],
                "kode_wilayah" => ["validators" => ['digit']],
            ]
        );

        if (strlen($validatedParams['kode_wilayah']) > 2 && strpos($validatedParams['kode_wilayah'], '.') === false) {
            $validatedParams['kode_wilayah'] = substr_replace($validatedParams['kode_wilayah'], '.', 2, 0);
        }

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        try {
            $sigClient->setLogger($this->logger);
            $response = $sigClient->avgMonevDaerah(
                $validatedParams["tahun"],
                $validatedParams["status"],
                $validatedParams["level"],
                $validatedParams["kode_wilayah"]
            );
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service GOL");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
            }
        }
        catch (Exception $e) {

        }

        return new SimpleResponse($result);
    }

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

        $params['status'] = array_key_exists('status', $params) ? $params['status'] : 'ALL';
        $params['id_instansi_jaga'] = array_key_exists('id_instansi_jaga', $params) ? $params['id_instansi_jaga'] : 0;
        $params['id_instansi_gol'] = array_key_exists('id_instansi_gol', $params) ? $params['id_instansi_gol'] : 0;

        $validatedParams = $this->validate(
            $params,
            [
                "tahun" => ["validators" => ['required', 'digit']],
                "status" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['ALL','MONEV']
                ]]],
                "id_instansi_jaga" => ["validators" => ['digit']],
                "id_instansi_gol" => ["validators" => ['digit']],
            ]
        );

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        try {
            $idInstansiGol = $this->getIdInstansiGol($validatedParams["id_instansi_gol"], $validatedParams["id_instansi_jaga"]);
            $sigClient->setLogger($this->logger);
            $response = $sigClient->avgMonevKL(
                $validatedParams["tahun"],
                $validatedParams["status"],
                $idInstansiGol

            );
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service GOL");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
            }
        }
        catch (Exception $e) {

        }

        return new SimpleResponse($result);
    }

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

        $params['status'] = array_key_exists('status', $params) ? $params['status'] : 'ALL';
        $params['id_instansi_jaga'] = array_key_exists('id_instansi_jaga', $params) ? $params['id_instansi_jaga'] : 0;
        $params['id_instansi_gol'] = array_key_exists('id_instansi_gol', $params) ? $params['id_instansi_gol'] : 0;
        $params['kode_provinsi'] = array_key_exists('kode_provinsi', $params) ? $params['kode_provinsi'] : 0;
        $params['kode_kota_kabupaten'] = array_key_exists('kode_kota_kabupaten', $params) ? $params['kode_kota_kabupaten'] : 0;

        $validatedParams = $this->validate(
            $params,
            [
                "src" => ["validators" => [[
                    'name' => 'inclusion_in',
                    'params' => ['DAERAH','KL']
                ]]],
                "tahun" => ["validators" => ['required', 'digit']],
                "status" => ["validators" => ['required', [
                    'name' => 'inclusion_in',
                    'params' => ['ALL','MONEV']
                ]]],
                "id_instansi_jaga" => ["validators" => ['digit']],
                "id_instansi_gol" => ["validators" => ['digit']],
                "kode_provinsi" => ["validators" => ['digit']],
                "kode_kota_kabupaten" => ["validators" => ['digit']],
            ]
        );

        if (strpos($validatedParams['kode_kota_kabupaten'], '.') === false) {
            $validatedParams['kode_kota_kabupaten'] = substr_replace($validatedParams['kode_kota_kabupaten'], '.', 2, 0);
        }

        $sigClient = new SigClient($this->config["sig_prop"], $this);
        $result = [];

        try {
            $idInstansiGol = $this->getIdInstansiGol($validatedParams["id_instansi_gol"], $validatedParams["id_instansi_jaga"]);
            $sigClient->setLogger($this->logger);
            $response = $sigClient->avgKomponenMonev(
                $validatedParams["src"],
                $validatedParams["tahun"],
                $validatedParams["status"],
                $idInstansiGol,
                $validatedParams["kode_provinsi"],
                $validatedParams["kode_kota_kabupaten"]
            );
            if (empty($response)) {
                throw new CustomErrorException(BaseResponse::UNEXPECTED_ERROR, "Gagal Menghubungi Service GOL");
            }

            if (array_key_exists('status_code', $response) && (int)$response['status_code'] == 0) {
                $result = $response['data'];
            }
        }
        catch (Exception $e) {

        }

        return new SimpleResponse($result);
    }

    private function getIdInstansiGol($idInstansiGol, $idInstansiJaga) {
        if($idInstansiGol == 0 && $idInstansiJaga > 0) {
            $sigInstansiKeyVal = ArrayHelper::asKeyValue(SigInstansi::find()->toArray(), "id_instansi_jaga");
            if(array_key_exists($idInstansiJaga, $sigInstansiKeyVal)) {
                $idInstansiGol = $sigInstansiKeyVal[$idInstansiJaga]['id_instansi_gol'];
            }
        }

        return $idInstansiGol;
    }
}
