<?php

use Jaga\Models\PAK\PAKDiskusi;

class PAKDiskusiController extends BaseController {
    public function get($refTable, $refId) {
        $this->checkOneOfScopes(['pak.verify.implementasi', 'pak.verify.isiansekolah', 'pak.manage.implementasi', 'pak.manage.isiansekolah']);

        $params = $this->request->get();
        $params['limit'] = array_key_exists('limit', $params) ? $params['limit'] : 20;
        $params['offset'] = array_key_exists('offset', $params) ? $params['offset'] : 0;
        $list = PAKDiskusi::findWithDetail($refTable, $refId, $params['limit'], $params['offset']);
        $total = PAKDiskusi::count([
            'conditions' => 'ref_table = :ref_table: AND ref_id = :ref_id:',
            'bind' => [
                'ref_table' => $refTable,
                'ref_id' => $refId
            ]
        ]);

        return new PaginatedResponse($list, $total, $params['limit'], $params['offset']);
    }

    public function post() {
        $this->checkOneOfScopes(['pak.verify.implementasi', 'pak.verify.isiansekolah', 'pak.manage.implementasi', 'pak.manage.isiansekolah']);

        $post = $this->request->getJsonRawBody(true);
        $params = $this->validate($post, [
            'ref_table' => ['validators' => ['required']],
            'ref_id' => ['validators' => ['required', 'digit']],
            'content' => ['validators' => ['required', [
                'name' => 'max_string',
                'params' => 3000
            ]]]
        ]);

        $refTable = $params['ref_table'];
        $refId = $params['ref_id'];
        $pak = PAKDiskusi::findPakByRef($refTable, $refId);

        if (empty($pak)) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Data PAK tidak ditemukan");
        }

        $userAllowedToPost = $this->userIsAllowedToPost($pak, $refTable);
        if (!$userAllowedToPost) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "User tidak diizinkan untuk mengakses");
        }

        $success = PAKDiskusi::post($refTable, $refId, $params['content'], $this->userID);
        if (!$success) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, "Gagal menyimnpan data");
        }

        return new SimpleResponse(1);
    }

    private function userIsAllowedToPost($pak, $ref_table) {
        $this->checkOneOfScopes(['pak.verify.implementasi', 'pak.verify.isiansekolah', 'pak.manage.implementasi', 'pak.manage.isiansekolah']);
        $isAllowed = true;
        if ($this->hasOneOfScopes(['pak.manage.implementasi']) && !$this->hasOneOfScopes(['pak.verify.implementasi'])) {
            if ($ref_table != PAKDiskusi::REF_TABLE_IMPLEMENTASI) {
                $isAllowed = false;
            } else {
                $isAllowed = $this->userIsAllowedToPostImplementasi($pak);
            }
        } else if ($this->hasOneOfScopes(['pak.manage.isiansekolah']) && !$this->hasOneOfScopes(['pak.verify.isiansekolah'])) {
            if ($ref_table != PAKDiskusi::REF_TABLE_ISIAN) {
                $isAllowed = false;
            } else {
                $isAllowed = $this->userIsAllowedToPostIsian($pak);
            }
        }
        return $isAllowed;
    }

    private function userIsAllowedToPostImplementasi(\Jaga\Models\PAK\PAKImplementasi $pak) {
        /** @var $user UmUser */
        $user = $this->shared->user;
        return $user->id_instansi == $pak->instansi_id;
    }

    private function userIsAllowedToPostIsian(\Jaga\Models\PAK\PAKIsianSekolah $pak) {
        /** @var $user UmUser */
        $user = $this->shared->user;
        return $user->hasNpsn($pak->sekolah_npsn);
    }
}
