<?php

namespace App\DAO;

use App\DAO\DAO;
use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\ViewModels\CreditoCliente\CreditoClienteRegistrationViewModel\CreditoClienteRegistrationViewModel;
use App\ViewModels\CreditoCliente\CreditoClienteUpdateViewModel\CreditoClienteUpdateViewModel;

class CreditoClienteDAO extends DAO {

	public function regiterFromExtorno(CreditoClienteRegistrationViewModel $creditoCliente_vm): DAOResponse {

		$dao_response = new DAOResponse();

		$sql = <<<SQL
			insert into credito_cliente
				(extorno_id,criado_por,data_criacao,hora_criacao, valor,saldo , cliente_id) values
				(:id_extorno:,:id_usuario:,:data_c:,:hora_c:,:valor:,:saldo:,:id_cliente:)
		SQL;

		$binds = [ 
				'id_extorno' => $creditoCliente_vm->getExtornoId(),
				'id_usuario' => $creditoCliente_vm->getCriadoPor(),
				'data_c' => $creditoCliente_vm->getDataCriacao(),
				'hora_c' => $creditoCliente_vm->getHoraCriacao(),
				'valor' => $creditoCliente_vm->getValor(),
				'saldo' => $creditoCliente_vm->getSaldo(),
				'id_cliente' => $creditoCliente_vm->getClienteId()
		];

		$conn = db_connect();
		$query = $conn->query($sql,$binds);
		$errors = $conn->error();
		
		if (intval( $errors ['code'] ) != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$dao_response->setData( [ ] );
		} else {
			$credito_id = $conn->insertID();
			$dao_response->setStatus( DAOResponseInterface::SUCESS );
			$dao_response->setData( ['id_credito' => $credito_id] );
		}
		
		return $dao_response;

	}

	public function regiterFromCredito(CreditoClienteRegistrationViewModel $creditoCliente_vm): DAOResponse {
		
		$dao_response = new DAOResponse();
		
		// recuperar o 
		$sql_extorno =<<<SQL
			select extorno_id from credito_cliente where id =:credito_id:
		SQL;
		
		$binds_extorno = [
				'id_credito' => $creditoCliente_vm->getCreditoId()
				];
		$conn_extorno = db_connect();
		$query_extorno = $conn_extorno->query($sql_extorno,$binds_extorno)->getResultArray();
		$errors_extorno = $conn_extorno->error();
		
		if (intval( $errors ['code'] ) != 0) {
			
		} else {
			$extorno_id = $query_extorno[0]['extorno_id'];
			$creditoCliente_vm->setExtornoId($extorno_id);
		}
		
		$sql = <<<SQL
			insert into credito_cliente
				(credito_id,criado_por,data_criacao,hora_criacao, valor,saldo , cliente_id) values
				(:id_credito:,:id_usuario:,:data_c:,:hora_c:,:valor:,:saldo:,:id_cliente:)
		SQL;
		
		$binds = [
				'id_extorno' => $creditoCliente_vm->getExtornoId(),
				'id_credito' => $creditoCliente_vm->getCreditoId(),
				'id_usuario' => $creditoCliente_vm->getCriadoPor(),
				'data_c' => $creditoCliente_vm->getDataCriacao(),
				'hora_c' => $creditoCliente_vm->getHoraCriacao(),
				'valor' => $creditoCliente_vm->getValor(),
				'saldo' => $creditoCliente_vm->getSaldo(),
				'id_cliente' => $creditoCliente_vm->getClienteId()
		];
		
		$conn = db_connect();
		$query = $conn->query($sql,$binds);
		$errors = $conn->error();
		
		if (intval( $errors ['code'] ) != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$dao_response->setData( [ ] );
		} else {
			$credito_id = $conn->insertID();
			$dao_response->setStatus( DAOResponseInterface::SUCESS );
			$dao_response->setData( ['id_credito' => $credito_id] );
		}
		
		return $dao_response;
		
	}
	
	public function updateCreditoCliente(CreditoClienteUpdateViewModel $creditoCliente_vm): DAOResponse {
		
		$dao_response = new DAOResponse();
		
		$sql = <<<SQL
			update credito_cliente
				set	atualizado_por = :atualizado_por:,
					saldo= :saldo: ,
					data_atualizaao = :data_atz: ,
					hora_atualizacao = :hora_atz: ,
					usado = 'S'
				where
					id = :credito_id:
		SQL;
		
		$binds = [
				
				'atulaizado_por' => $creditoCliente_vm->getAtualizadoPor(),
				'data_atz' => $creditoCliente_vm->getDataAtualizacao(),
				'hora_atz' => $creditoCliente_vm->getHoraAtualizacao(),				
				'saldo' => $creditoCliente_vm->getSaldo(),
				'credito_id' => $creditoCliente_vm->getId()
		];
		
		$conn = db_connect();
		$query = $conn->query($sql,$binds);
		$errors = $conn->error();
		
		if (intval( $errors ['code'] ) != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$dao_response->setData( [ ] );
		} else {
			$affectedrows = $conn->affectedRows();
			if(intval($affectedrows) > 0) {
				$dao_response->setStatus( DAOResponseInterface::SUCESS );
			} else {
				$dao_response->setStatus( DAOResponseInterface::RECORD_NOT_FOUND);
			}			
		}
		
		return $dao_response;
		
	}

	public function getCreditoByClienteIdByUnidadeId(int $clienteid, int $unidadeid): DAOResponse {

		$dao_response = new DAOResponse();

		$sql = <<<SQL
			select 
				cc.id , cc.cliente_id,cc.extorno_id , cc.valor , c.id_unidade , un.descricao as unidade
			from
				credito_cliente cc , extorno ex, comanda c , unidade un
			where
				cc.cliente_id = :id_cliente:
				and cc.usado ='N'
				and cc.extorno_id = ex.id
				and ex.id_comanda = c.id
				and c.id_unidade = :id_unidade:
				and c.id_unidade = un.id 
		SQL;

		$binds = [ 
				'id_cliente' => $clienteid,
				'id_unidade' => $unidadeid
		];

		$conn = db_connect();
		$query_array = $conn->query( $sql, $binds )
			->getResultArray();
		$errors = $conn->error();
		$conn->close();
		if (intval( $errors ['code'] ) != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$dao_response->setData( [ ] );
		} else {
			if (count( $query_array ) > 0) {
				$dao_response->setStatus( DAOResponseInterface::SUCESS );
				$dao_response->setData( $query_array );
			} else {
				$dao_response->setStatus( DAOResponseInterface::RECORD_NOT_FOUND );
				$dao_response->setData( [ ] );
			}
		}

		return $dao_response;

	}

	public function getSumCreditoByClienteIdByUnidadeId(int $clienteid, int $unidadeid): DAOResponse {

		$dao_response = new DAOResponse();

		$sql = <<<SQL
			select
				cc.cliente_id, sum(cc.valor) as valor
			from
				credito_cliente cc , extorno ex, comanda c , unidade un
			where
				cc.cliente_id = :id_cliente:
				and cc.usado ='N'
				and cc.extorno_id = ex.id
				and ex.id_comanda = c.id
				and c.id_unidade = :id_unidade:
				and c.id_unidade = un.id
			group by cc.cliente_id
		SQL;

		$binds = [ 
				'id_cliente' => $clienteid,
				'id_unidade' => $unidadeid
		];

		$conn = db_connect();
		$query_array = $conn->query( $sql, $binds )
			->getResultArray();
		$errors = $conn->error();
		$conn->close();
		if (intval( $errors ['code'] ) != 0) {
			$dao_response->setErrors( $errors );
			$dao_response->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$dao_response->setData( [ ] );
		} else {
			if (count( $query_array ) > 0) {
				$dao_response->setStatus( DAOResponseInterface::SUCESS );
				$dao_response->setData( $query_array );
			} else {
				$dao_response->setStatus( DAOResponseInterface::RECORD_NOT_FOUND );
				$dao_response->setData( [ ] );
			}
		}

		return $dao_response;

	}

	// public function update(): DAOResponse {

	// $dao_response = new DAOResponse();

	// $sql = <<<SQL
	// SQL;

	// $binds = [ ];

	// $conn = db_connect();

	// $conn->close();
	// return $dao_response;

	// }
}

