<?php

/**
 * @package KantPHP
 * @author  Zhenqiang Zhang <zhenqiang.zhang@hotmail.com>
 * @copyright (c) KantPHP Studio, All rights reserved.
 * @license http://www.opensource.org/licenses/BSD-3-Clause  The BSD 3-Clause License
 */
namespace Kant\Rest;

use Kant\Kant;
use Kant\Data\ActiveDataProvider;

/**
 * IndexAction implements the API endpoint for listing multiple models.
 *
 * For more details and usage information on IndexAction, see the [guide article on rest controllers](guide:rest-controllers).
 *
 * @author Qiang Xue <qiang.xue@gmail.com>
 * @since 2.0
 */
class IndexAction extends Action
{

    /**
     *
     * @var callable a PHP callable that will be called to prepare a data provider that
     *      should return a collection of the models. If not set, [[prepareDataProvider()]] will be used instead.
     *      The signature of the callable should be:
     *     
     *      ```php
     *      function ($action) {
     *      // $action is the action object currently running
     *      }
     *      ```
     *     
     *      The callable should return an instance of [[ActiveDataProvider]].
     */
    public $prepareDataProvider;

    /**
     *
     * @return ActiveDataProvider
     */
    public function run()
    {
        if ($this->checkAccess) {
            call_user_func($this->checkAccess, $this->id);
        }
        
        return $this->prepareDataProvider();
    }

    /**
     * Prepares the data provider that should return the requested collection of the models.
     * 
     * @return ActiveDataProvider
     */
    protected function prepareDataProvider()
    {
        if ($this->prepareDataProvider !== null) {
            return call_user_func($this->prepareDataProvider, $this);
        }
        
        /* @var $modelClass \Kant\Database\BaseActiveRecord */
        $modelClass = $this->modelClass;
        
        return Kant::createObject([
            'class' => ActiveDataProvider::className(),
            'query' => $modelClass::find()
        ]);
    }
}
