<?php

namespace App\DAO;

use App\DAO\DAO;
use App\DAO\DAOResponse\DAOResponse;
use App\Entities\Loja\Loja;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\ViewModels\Loja\LojaRegistrationViewModel\LojaRegistrationViewModel;
use App\ViewModels\Loja\LojaChangeStatusViewModel\LojaChangeStatusViewModel;

class LojaDAO extends DAO {

	public function registerLoja(LojaRegistrationViewModel $lojaRegistration_vm): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			insert into loja 
				(id_unidade,id_status,criado_por,data_criacao,hora_criacao) values
				(:unidade_id:, :status_id:, :usuario_id:, :data_c:, :hora_c:)
		SQL;

		$binds = [ 
			'unidade_id' => $lojaRegistration_vm->getIdUnidade(),
			'status_id' => $lojaRegistration_vm->getIdStatus(),
			'usuario_id' => $lojaRegistration_vm->getCriadoPor(),
			'data_c' => $lojaRegistration_vm->getDataCriacao(),
			'hora_c' => $lojaRegistration_vm->getHoraCriacao()
		];

		$conn = db_connect();
		$numrows = $conn->query( $sql, $binds )->numRows;
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
			log_message( "ERROR", json_encode( $errors ) );
		} else {
			$affectrows = $conn->affectedRows();
			if ($affectrows == 0) {
				$daoResponse->setStatus( DAOResponseInterface::INSUFFICIENT_DATA );
				$daoResponse->setData( [ ] );
			} else {
				$newid = $conn->insertID();
				$daoResponse->setStatus( DAOResponseInterface::SUCESS );
				$daoResponse->setData( [ 
					'id_loja' => $newid
				] );
			}
		}

		return $daoResponse;

	}

	public function isExitsLojaToUnidadeId(LojaRegistrationViewModel $lojaRegistration_vm): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			select count(*) total from loja where id_unidade = :unidade_id:
		SQL;
		$binds = [ 
			'unidade_id' => $lojaRegistration_vm->getIdUnidade()
		];

		$conn = db_connect();
		$result = $conn->query( $sql, $binds )
			->getResultArray();
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
		} else {
			$resultado = $result [0];
			if (intval( $resultado ['total'] ) == 0) {
				$daoResponse->setStatus( DAOResponseInterface::RECORD_NOT_FOUND );
				$daoResponse->setData( [ ] );
			} else {
				$daoResponse->setStatus( DAOResponseInterface::SUCESS );
				$daoResponse->setData( $resultado );
			}
		}

		return $daoResponse;

	}

	public function changeStatusLoja(LojaChangeStatusViewModel $lojaChangeStatus_vm): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			update loja
				set id_status = :status_id: , alterado_por = :usuario_id:,
					data_alteracao = :data_a:, hora_alteracao = :hora_a:
				where id = :id_loja:
		SQL;

		$binds = [ 
			'id_loja' => $lojaChangeStatus_vm->getId(),
			'status_id' => $lojaChangeStatus_vm->getIdStatus(),
			'usuario_id' => $lojaChangeStatus_vm->getAlteradoPor(),
			'data_a' => $lojaChangeStatus_vm->getDataAlteracao(),
			'hora_a' => $lojaChangeStatus_vm->getHoraAlteracao()
		];

		$conn = db_connect();
		$numrows = $conn->query( $sql, $binds )->numRows;
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
			log_message( "ERROR", json_encode( $errors ) );
		} else {
			$affectrows = $conn->affectedRows();
			if ($affectrows == 0) {
				$daoResponse->setStatus( DAOResponseInterface::INSUFFICIENT_DATA );
				$daoResponse->setData( [ ] );
			} else {
				$daoResponse->setStatus( DAOResponseInterface::SUCESS );
				$daoResponse->setData( [ ] );
			}
		}

		return $daoResponse;

	}

	public function getLojas(): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			SELECT distinct
				l.id , l.id_unidade , l.id_status, ls.descricao status_loja ,
				l.criado_por , pf.nome as criado_por, l.data_criacao , l.hora_criacao ,
				l.alterado_por , l.data_alteracao , l.hora_alteracao ,
				u.descricao as unidade, pj.nome_fantasia
			FROM 
				loja l , loja_status ls , unidade u, usuario us ,
				pessoa_fisica pf , pessoa_juridica pj
			WHERE
				l.id_status = ls.id
				and l.id_unidade = u.id
				and l.criado_por = us.id
				and us.id_pessoa = pf.id_pessoa
				and u.id_pessoa_juridica = pj.id 
		SQL;
		$binds = [ ];

		$conn = db_connect();
		$result = $conn->query( $sql, $binds )
			->getResultArray();
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
		} else {			
			if (count( $result ) == 0) {
				$daoResponse->setStatus( DAOResponseInterface::RECORD_NOT_FOUND );
				$daoResponse->setData( [ ] );
			} else {
				$daoResponse->setStatus( DAOResponseInterface::SUCESS );
				$daoResponse->setData( ['lojas' => $result] );
			}
		}

		return $daoResponse;

	}

}

