<?php

namespace App\DAO;

use App\DAO\DAO;
use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\ViewModels\Loja\LojaProdutoRegistartionViewModel\LojaProdutoRegistrationViewModel;
use App\ViewModels\Loja\LojaProdutoChangeStatusViewModel\LojaProdutoChangeStatusViewModel;

class LojaProdutoDAO extends DAO {

	public function addProduto(LojaProdutoRegistrationViewModel $lojaProduto_vm): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			insert into loja_produto
				(id_loja,id_produto,id_status,criado_por,data_criacao,hora_criacao) values
				(:loja_id:, :produto_id:, :status_id:, :usuario_id:, :data_c:, :hora_c:)
		SQL;

		$binds = [ 
			'loja_id' => $lojaProduto_vm->getIdLoja(),
			'produto_id' => $lojaProduto_vm->getIdProduto(),
			'status_id' => $lojaProduto_vm->getIdStatus(),
			'usuario_id' => $lojaProduto_vm->getCriadoPor(),
			'data_c' => $lojaProduto_vm->getDataCriacao(),
			'hora_c' => $lojaProduto_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_produto' => $newid
				] );
			}
		}

		return $daoResponse;

	}

	public function changeStatusLojaProduto(LojaProdutoChangeStatusViewModel $lojaProduto_vm): DAOResponse {

		$daoResponse = new DAOResponse();

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

		$binds = [ 
			'id_loja_produto' => $lojaProduto_vm->getId(),
			'status_id' => $lojaProduto_vm->getIdStatus(),
			'usuario_id' => $lojaProduto_vm->getAlteradoPor(),
			'data_a' => $lojaProduto_vm->getDataAlteracao(),
			'hora_a' => $lojaProduto_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 isExitsProdutoToLojaId(LojaProdutoRegistrationViewModel $lojaProduto_vm): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			select count(*) total 
			from loja_produto 
			where id_produto = :produto_id: and id_loja = :loja_id:
		SQL;

		$binds = [ 
			'produto_id' => $lojaProduto_vm->getIdProduto(),
			'loja_id' => $lojaProduto_vm->getIdLoja()
		];

		$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 getLojaProduto(int $id_loja, int $id_status): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = '';
		$binds = [ ];

		if ($id_status == 0) {
			$sql = <<<SQL
				SELECT DISTINCT
					lp.id , lp.id_loja , l.id_status as id_loja_status , ls.descricao as loja_status,
					lp.id_produto ,	lp.id_status as id_loja_produto_status, lps.descricao as loja_produto_status,
					ps.nome , ps.valor , ps.id_status as produto_status, u.descricao as unidade
				FROM
					loja_produto lp , loja_produto_status lps , loja l , loja_status ls ,
					produto_servico ps, unidade u , produto_servico_status pss
				WHERE
					lp.id_loja = :loja_id:				
					and lp.id_status = lps.id
					and lp.id_loja = l.id
					and l.id_status = 1
					and l.id_status = ls.id
					and l.id_unidade = u.id
					and lp.id_produto = ps.id
					and ps.id_status = pss.id
					and ps.id_tipo_voucher not in (3)
				ORDER BY ps.nome ASC
			SQL;
			$binds = [ 
				'loja_id' => $id_loja
			];
		} else {
			$sql = <<<SQL
				SELECT DISTINCT
					lp.id , lp.id_loja , l.id_status as id_loja_status , ls.descricao as loja_status,
					lp.id_produto ,	lp.id_status as id_loja_produto_status, lps.descricao as loja_produto_status,
					ps.nome , ps.valor , ps.id_status as produto_status, u.descricao as unidade
				FROM
					loja_produto lp , loja_produto_status lps , loja l , loja_status ls ,
					produto_servico ps, unidade u , produto_servico_status pss
				WHERE
					lp.id_loja = :loja_id:
					and lp.id_status = :status_id:
					and lp.id_status = lps.id
					and lp.id_loja = l.id
					and l.id_status = 1
					and l.id_status = ls.id
					and l.id_unidade = u.id
					and lp.id_produto = ps.id
					and ps.id_status = pss.id
					and ps.id_tipo_voucher not in (3)
				ORDER BY ps.nome ASC
			SQL;
			$binds = [ 
				'status_id' => $id_status,
				'loja_id' => $id_loja
			];
		}

		$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( [ 
					'produtos' => $result
				] );
			}
		}

		return $daoResponse;

	}
	
	public function getNomeProdutoByLojaProdutoId(int $id_loja_produto):DAOResponse {
		$daoResponse = new DAOResponse();
		
		$sql = <<<SQL
			SELECT DISTINCT 
				lp.id , ps.nome
			FROM
				loja_produto lp , produto_servico ps
			WHERE
				lp.id = :produto_loja_id:
				and lp.id_produto = ps.id 
		SQL;
		
		$binds = [
				'produto_loja_id' => $id_loja_produto
				
		];
		
		$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( $result[0] );
			}
		}
		
		return $daoResponse;
		
	}

}

