<?php

namespace App\DAO;

use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\DAO\Pagination\Pagination;
use App\Entities\TipoExtorno\TipoExtorno;
use App\Mappers\TipoExtornoMapper;
use App\Models\TipoExtornoModel;
use App\Services\LogService;
use App\Utils\Collections\QueryFilterCollection;
use App\Utils\Collections\QueryOrderCollection;
use App\ViewModels\TipoExtorno\TipoExtornoRegistrationViewModel\TipoExtornoRegistrationViewModel;
use App\ViewModels\TipoExtorno\TipoExtornoUpdateViewModel\TipoExtornoUpdateViewModel;
use Exception;

class TipoExtornoDAO extends DAO {

	public function persistTipoExtornoRegistrationVM(TipoExtornoRegistrationViewModel $tipo_extorno_registration_vm): DAOResponse {

		try {
			$tipo_extorno = $this->persistTipoExtorno( $tipo_extorno_registration_vm );
			$error = $this->db->error();
			if ($error && $error ['code']) {
				$status_persistence = $error ['code'];
			} else {
				$status_persistence = !!$tipo_extorno->getId() ? DAOResponseInterface::SUCESS : DAOResponseInterface::DATABASE_CONNECTION_ERROR;
			}
		} catch ( Exception $exception ) {
			log_message( 'error', json_encode( $this->db->error() ) );
			$status_persistence = DAOResponseInterface::DATABASE_CONNECTION_ERROR;
			$tipo_extorno = null;
		}
		$this->db->close();
		$dao_response = DAOResponse::builder()->setStatus( $status_persistence )
			->build();
		if ($status_persistence === DAOResponseInterface::SUCESS) {
			$dao_response->setData( $tipo_extorno );
		}
		return $dao_response;

	}

	public function getTipoExtornoList(?Pagination $pagination, ?QueryFilterCollection $query_filter_collection,
			?QueryOrderCollection $query_order_collection = null): DAOResponse {

		$sql = '
            SELECT 
                id, descricao, criado_por, data_criacao, hora_criacao 
            FROM tipo_extorno
        ';
		return $this->getDAOResponseFromPaginatedSelect( [ ], $pagination, $query_filter_collection, $query_order_collection, $sql,
				function (array $result_array) {
					return TipoExtornoMapper::getTipoExtornoDetailsVMCollectionFromArray( $result_array );
				} );

	}

	public function deleteTipoExtorno(int $id_tipo_extorno): DAOResponse {

		$tipo_extorno_model = new TipoExtornoModel();
		$dao_response = $this->getDAOResponseForDeletion( $tipo_extorno_model, $id_tipo_extorno );
		return $dao_response;

	}

	private function persistTipoExtorno(TipoExtornoRegistrationViewModel $tipo_extorno_registration_vm): TipoExtorno {

		$tipo_extorno_model = new TipoExtornoModel();
		$tipo_extorno = TipoExtornoMapper::getTipoExtornoFromTipoExtornoRegistrationViewModel( $tipo_extorno_registration_vm );
		$tipo_extorno_model->registerTipoExtorno( $tipo_extorno );
		return $tipo_extorno;

	}

	public function getTipoExtorno(QueryFilterCollection $query_filter_collection): DAOResponse {

		$sql = '
            SELECT
                tipo_extorno.id AS id,
                tipo_extorno.descricao AS descricao
            FROM
                tipo_extorno
        ';
		$binds = [ ];
		return $this->getDAOResponseFromUniqueRowSelect( $binds, $query_filter_collection, $sql,
				function (array $result_array) {
					return TipoExtornoMapper::getTipoExtornoDetailsVMFromArray( $result_array [0] );
				} );

	}

	public function persistTipoExtonoUpdateVM(int $id_tipo_extorno, TipoExtornoUpdateViewModel $tipo_extorno_update_vm): DAOResponse {

		$status_persistence = $this->persistTipoExtornoFromTipoExtornoUpdateVM( $id_tipo_extorno, $tipo_extorno_update_vm );
		$error = $this->db->error();
		$this->db->close();
		$dao_response = new DAOResponse();
		if ($error && $error ['code']) {
			$status_response = $error ['code'];
			$dao_response_errors = [ ];
			$dao_response->setErrors( $dao_response_errors );
			(new LogService())->log_error( $status_response, "Ocorreu um erro durante a atualização do procedimento $id_tipo_extorno",
					$tipo_extorno_update_vm->toArray() );
		} else {
			$status_response = $status_persistence ? DAOResponseInterface::SUCESS : DAOResponseInterface::RECORD_NOT_FOUND;
		}
		$dao_response->setStatus( $status_response );
		return $dao_response;

	}

	private function persistTipoExtornoFromTipoExtornoUpdateVM(int $id_tipo_extorno, TipoExtornoUpdateViewModel $tipo_extorno_update_vm): bool {

		$tipo_extorno_model = new TipoExtornoModel();
		$tipo_extorno = TipoExtornoMapper::getTipoExtornoFromTipoExtornoUpdateVM( $tipo_extorno_update_vm );
		$sucess_update = $tipo_extorno_model->updateTipoExtornoByID( $id_tipo_extorno, $tipo_extorno );
		return $sucess_update;

	}

}