<?php

class TakolaSDController extends BaseController
{
    public function index()
    {
        $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['provinsi'] = array_key_exists('provinsi', $params) ? $params['provinsi']: '';
        $params['kota_kabupaten'] = array_key_exists('kota_kabupaten', $params) ? $params['kota_kabupaten']: '';
        $params['nama'] = array_key_exists('nama', $params) ? $params['nama']: '';
        $params['npsn'] = array_key_exists('npsn', $params) ? $params['npsn']: '';

        $validatedRequest = $this->validate(
            $params,
            [
                'provinsi' => [ 'validators' => ['required'] ],
                'kota_kabupaten' => [ 'validators' => ['required'] ],
                'limit' => [ 'validators' => ['digit'] ],
                'offset' => [ 'validators' => ['digit'] ]
            ]
        );
        
        $arrParams = [
            "columns" => "count(1) as jumlah",
            "lower(nama) like :nama: and lower(npsn) like :npsn: and lower(provinsi_nama)=:provinsi_nama: and lower(kabkota_nama) = :kabkota_nama:",
            "bind" => [
                "nama" => "%".strtolower($params["nama"])."%",
                "npsn" => "%".strtolower($params["npsn"])."%",
                "provinsi_nama" => strtolower($params["provinsi"]),
                "kabkota_nama" => strtolower($params["kota_kabupaten"])
            ]
        ];

        $totalResult = TakolaSekolah::find($arrParams)[0]["jumlah"];

        unset($arrParams["columns"]);
        $arrParams["order"] = "bantuan_jumlah DESC, nama DESC";

        $result = TakolaSekolah::find($arrParams);
        return new PaginatedResponse($result, $totalResult, $params['limit'], $params['offset']);
    }

    public function summary_provinsi()
    {
        $client = new TakolaClient($this->config["takola_base_uri"]);
        try {
            $results = $client->summary_provinsi($this->config['takola_token']);
            if ($results["success"] == false) {
                $this->apiLog->log_error("Takola - summary_provinsi", "", $results["message"]);
            }
            return $this->transform_response($results, true);
        } catch (\Exception $ex) {
            $this->apiLog->log_error("Takola - summary_provinsi", "", $ex->getMessages());
            throw $ex;
        }
    }

    public function kota_kabupaten()
    {
        $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['provinsi'] = array_key_exists('provinsi', $params) ? $params['provinsi']: '';
        $params['kota_kabupaten'] = array_key_exists('kota_kabupaten', $params) ? $params['kota_kabupaten']: '';

        $validatedRequest = $this->validate(
            $params,
            [
                'provinsi' => [ 'validators' => ['required'] ],
                'limit' => [ 'validators' => ['digit'] ],
                'offset' => [ 'validators' => ['digit'] ]
            ]
        );

        $arrParams = [
            "columns" => "count(distinct kabkota_nama) as jumlah",
            "lower(provinsi_nama) = :provinsi_nama: and lower(kabkota_nama) like :kabkota_nama:",
            "bind" => [
                "provinsi_nama" => strtolower($params["provinsi"]),
                "kabkota_nama" => "%".strtolower($params["kota_kabupaten"])."%"
            ]
        ];

        $totalResult = TakolaSekolah::find($arrParams)[0]["jumlah"];

        $arrParams["columns"] = "distinct kabkota_nama";
        $arrParams["order"] = "kabkota_nama ASC";
        $arrParams["limit"] = $params["limit"];
        $arrParams["offset"] = $params["offset"];

        $result = array_map(
            function ($v) {
                return $v['kabkota_nama'];
            },
            TakolaSekolah::find($arrParams)
            ->toArray()
        );
        return new PaginatedResponse($result, $totalResult, $params["limit"], $params["offset"]);
    }

    public function detail_live()
    {
        $params = $this->request->get();
        $validatedRequest = $this->validate(
            $params,
            [
                'npsn' => [ 'validators' => ['required'] ]
            ]
        );

        $client = new TakolaClient($this->config["takola_base_uri"]);
        $api_params = http_build_query($params);
        $result = null;
        try {
            $result = $client->detail(
                $this->config['takola_token'],
                $params['npsn']
            );
        } catch (\Exception $ex) {
            $this->apiLog->log_error("Takola - detail_live", $api_params, $ex->getMessages());
            throw $ex;
        }

        if ($result['success'] && isset($result['data'])) {
            $sekolah = Sekolah::find(
                [
                    "npsn = :npsn:",
                    "bind" => [
                        "npsn" => $params["npsn"]
                    ]
                ]
            )
            ->toArray();

            if (!empty($sekolah)) {
                if (array_key_exists('id', $result['data'])) {
                    $result['data']['takola_id'] = $result['data']['id'];
                }

                $result['data']['produk_id'] = $sekolah[0]['produk_id'];
                $result['data']['id'] = $sekolah[0]['id'];
                $result['data'] = [$result['data']];
            }
        } elseif ($result["success"] == false) {
            $this->apiLog->log_error("Takola - detail_live", "", $results["message"]);
        }
        
        return $this->transform_response($result, true);
    }

    public function photos()
    {
        $params = $this->request->get();
        $params['limit'] = array_key_exists('limit', $params) ? $params['limit']: 10;
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset']: 0;

        $validatedRequest = $this->validate(
            $params,
            [
                'npsn' => [ 'validators' => ['required'] ],
                'type' => [ 'validators' => ['required'] ],
                'limit' => [ 'validators' => ['digit'] ],
                'offset' => [ 'validators' => ['digit'] ]
            ]
        );

        $client = new TakolaClient($this->config["takola_base_uri"]);
        $api_params = http_build_query($params);
        $results = null;
        try {
            $results = $client->photo_list(
                $this->config['takola_token'],
                $params['npsn'],
                $params['offset'],
                $params['limit'],
                $params['type']
            );
        } catch (\Exception $ex) {
            $this->apiLog->log_error("Takola - photos", $api_params, $ex->getMessages());
            throw $ex;
        }

        if ($results['success']) {
            foreach ($results['rows'] as &$photo) {
                $photo['image_path'] = $client->get_photo_path(
                    $this->config['takola_token'],
                    $photo['path']
                );
            }
        } else {
            $this->apiLog->log_error("Takola - photos", $api_params, $results["message"]);
        }

        return $this->transform_response($results, false);
    }


    private function transform_response($response, $is_single_collection_response)
    {
        $result = $is_single_collection_response
            ? $this->transform_single_response($response)
            : $this->transform_collection_response($response);

        return $result;
    }

    private function transform_collection_response($takola_response)
    {
        if ($takola_response['success']) {
            return new PaginatedResponse($takola_response['rows'], (int) $takola_response['results'], (int) $takola_response['limit'], (int) $takola_response['start']);
        } else {
            throw new CustomErrorException(404, $takola_response['message']);
        }

        return $result;
    }

    private function transform_single_response($takola_response)
    {
        if ($takola_response['success']) {
            $totalResult = count($takola_response['data']);
            return new PaginatedResponse($takola_response['data'], $totalResult, $totalResult, 0);
        } else {
            throw new CustomErrorException(404, $takola_response['message']);
        }
    }
}
