<?php
namespace Incoviba\Repository\Proyecto;

use Incoviba\Common\Ideal;
use Incoviba\Common\Define;
use Incoviba\Common\Implement;
use Incoviba\Model;

class Tipologia extends Ideal\Repository
{
    public function __construct(
        Define\Connection $connection,
        protected ProyectoTipoUnidad $proyectoTipoUnidadRepository,
        protected TipoTipologia $tipoTipologiaRepository,
        protected Elemento $elementoRepository
    )
    {
        parent::__construct($connection);
        $this->setTable('tipo_tipologia');
    }

    public function create(?array $data = null): Define\Model
    {
        $map = (new Implement\Repository\MapperParser(['cantidad']))
            ->register('tipo', (new Implement\Repository\Mapper())
                ->setProperty('proyectoTipoUnidad')
                ->setFunction(function($data) {
                    return $this->proyectoTipoUnidadRepository->fetchById($data['tipo']);
                }))
            ->register('tipologia', (new Implement\Repository\Mapper())
                ->setProperty('tipoTipologia')
                ->setFunction(function($data) {
                    return $this->tipoTipologiaRepository->fetchById($data['tipologia']);
                }))
            ->register('elemento', (new Implement\Repository\Mapper())
                ->setFunction(function($data) {
                    return $this->elementoRepository->fetchById($data['elemento']);
                }));
        return $this->parseData(new Model\Proyecto\Tipologia(), $data, $map);
    }
    public function save(Define\Model $model): Define\Model
    {
        $model->id = $this->saveNew(
            ['tipo', 'tipologia', 'cantidad', 'elemento'],
            [$model->proyectoTipoUnidad->id, $model->tipoTipologia->id, $model->cantidad, $model->elemento->id]
        );
        return $model;
    }
    public function edit(Define\Model $model, array $new_data): Define\Model
    {
        return $this->update($model, ['tipo', 'tipologia', 'cantidad', 'elemento'], $new_data);
    }

    public function fetchByProyectoTipoUnidad(int $proyecto_tipo_unidad_id): array
    {
        $query = "SELECT * FROM `{$this->getTable()}` WHERE `tipo` = ?";
        return $this->fetchMany($query, [$proyecto_tipo_unidad_id]);
    }
}
