<?php

namespace App\Admin;

use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;

/**
 * Import de données.
 *
 * KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
 *
 * @author Julien Jorry <julien.jorry@gmail.com>
 */
class ImportAdmin extends AbstractAdmin
{
    protected $baseRoutePattern = 'importdata';
    protected $baseRouteName = 'importdata';
    protected $datagridValues = [
        // reverse order (default = 'ASC')
        '_sort_order' => 'DESC',
        // name of the ordered field (default = the model's id field, if any)
        '_sort_by' => 'createdAt',
        // '_page' => 1,
        // '_per_page' => 32
    ];

    /**
     * {@inheritdoc}
     */
    protected function configureRoutes(RouteCollection $collection)
    {
        $collection->clearExcept(['list', 'create', 'show']);
    }

    /**
     * {@inheritdoc}
     */
    public function createQuery($context = 'list')
    {
        $query = parent::createQuery($context);
        $query
            ->innerJoin($query->getRootAliases()[0] . '.user', 'u')
            ->addSelect('u')
        ;

        return $query;
    }

    public function configureActionButtons($action, $object = null)
    {
        $list = parent::configureActionButtons($action, $object);

        $list['create']['template'] = '@kohinos/bundles/SonataAdminBundle/CRUD/import_button.html.twig';
        // $list['show']['template'] = '@kohinos/bundles/SonataAdminBundle/CRUD/import_button.html.twig';

        return $list;
    }

    protected function configureListFields(ListMapper $listMapper): void
    {
        parent::configureListFields($listMapper);
        unset($this->listModes['mosaic']);
        $listMapper
            ->addIdentifier('createdAt', 'datetime', ['label' => 'Date'])
            ->add('user', null, ['label' => 'Utilisateur'])
            ->addIdentifier('type')
            ->add('nbentityadded', null, ['label' => 'Lignes correctes'])
            ->add('nbentityerror', null, ['label' => 'Lignes en erreurs'])
            ->add('media', null, ['label' => 'Fichier'])
            ->add('_action', null, [
                'actions' => [
                    'show' => [],
                ],
            ])
        ;
    }

    protected function configureShowFields(ShowMapper $showMapper): void
    {
        $object = $showMapper->getAdmin()->getSubject();
        $showMapper
            ->with('Import')
                ->add('createdAt')
                ->add('user')
                ->add('type')
                ->add('media')
                ->add('nbentityadded', null, ['label' => 'Lignes correctes'])
                ->add('nbentityerror', null, ['label' => 'Lignes en erreurs'])
            ->end();
        if (!empty(json_decode($object->getSuccess()))) {
            $showMapper
                ->with('Correct', [
                    'box_class' => 'box box-solid box-success',
                    // 'description' => 'Lorem ipsum',
                ])
                    ->add('success', 'json', ['label' => false])
                ->end()
            ;
        }
        if (!empty(json_decode($object->getWarnings()))) {
            $showMapper
                ->with('Warnings', [
                    'box_class' => 'box box-solid box-warning',
                    // 'description' => 'Lorem ipsum',
                ])
                ->add('warnings', 'json', ['label' => false])
                ->end()
                ;
        }
        if (!empty(json_decode($object->getErrors()))) {
            $showMapper
                ->with('Erreurs', [
                    'box_class' => 'box box-solid box-danger',
                    // 'description' => 'Lorem ipsum',
                ])
                    ->add('errors', 'json', ['label' => false])
                ->end()
            ;
        }
    }

    public function getBatchActions()
    {
        $actions = parent::getBatchActions();
        unset($actions['delete']);

        return $actions;
    }
}
