<?php
class ProdukController extends BaseController
{
    public function list()
    {
        $getParams = $this->request->get();

        $getParams['limit'] = $this->getDefaultLimit($getParams);
        $getParams['offset'] = array_key_exists('offset', $getParams) ? $getParams['offset'] : 0;
        $getParams['keyword'] = array_key_exists('keyword', $getParams) ? $getParams['keyword'] : '';

        $params = $this->validate(
            $getParams,
            [
                'limit' => ['validators' => ['digit']],
                'offset' => ['validators' => ['digit']],
                'keyword' => ['validators' => []]
            ]
        );

        $produk_list = Produk::find([
            'conditions' => 'nama ilike :bunga:',
            'bind' => [
                'bunga' => '%' . $params['keyword'] . '%'
            ],
            'limit' => $params['limit'],
            'offset' => $params['offset'],
        ]);

        $total_record = Produk::count();

        return new PaginatedResponse($produk_list, $total_record, $params['limit'], $params['offset']);
    }

    // public function hide()
    // {
    //     $getHide = $this->request->get();
    //     $getHide = ['is_hide'] = array_key_exists('is_show', $getHide) ? $getHide['is_show'] : 0;
    // }

    public function create() {
        $this->checkScopes(['admin.view']);

        $params = $this->request->get();
        $validated = $this->validate(
            $params,
            [
                'nama' => ['validators' => ['required']],
                'icon' => ['validators' => ['required']]
            ]
        );

        $this->db->begin();
        try {
            $produk = new Produk();
            $produk->assign($validated);

            if (!$produk->save()) {
                throw new CustomErrorException(BaseResponse::INVALID_REQUEST, $this->getModelErrors($produk));
            }
            $produkId = $produk->getWriteConnection()->lastInsertId();

            $diskusiKategori = new KategoriDiskusi();
            $diskusiKategori->title = $produk->nama;
            $diskusiKategori->produk_id = $produkId;
            if (!$diskusiKategori->save()) {
                throw new CustomErrorException(BaseResponse::INVALID_REQUEST, $this->getModelErrors($diskusiKategori));
            }

            $this->db->commit();
            $newProduk = Produk::find($produkId);
            return new SimpleResponse($newProduk);
        } catch (\Exception $e) {
            $this->db->rollback();
            throw $e;
        }
    }

    public function update($id) {
        $this->checkScopes(['admin.view']);

        $params = $this->request->get();
        $validated = $this->validate(
            $params,
            [
                'nama' => ['validators' => ['required']],
                'icon' => ['validators' => ['required']],
                'sort_order' => ['validators' => ['required']],
                'is_active' => ['validators' => ['required']],
                'is_show' => ['validators' => ['required']]
            ]
        );

        $produk = Produk::findFirst($id);
        if (!$produk) {
            throw new CustomErrorException(BaseResponse::DATA_NOT_FOUND, "Produk tidak ditemukan");
        }

        $produk->assign($validated);

        if (!$produk->save()) {
            throw new CustomErrorException(BaseResponse::INVALID_REQUEST, $this->getModelErrors($produk));
        }

        return new SimpleResponse($produk);
    }

    private function getModelErrors($model) {
        $errors = $model->getMessages();
        $error_messages = [];

        foreach ($errors as $key => $error) {
            $error_messages[] = ["field" => $error->getField(), "message" => $error->getMessage()];
        }

        return $error_messages;
    }
}
