<?php

namespace App\DAO;

use App\DAO\DAO;
use App\DAO\DAOResponse\DAOResponse;
use App\DAO\DAOResponse\DAOResponseInterface;
use App\ViewModels\LojaCompra\LojaCompraCartaoCreditoRegistrationViewModel\LojaCompraCartaoCreditoRegistrationViewModel;
use App\ViewModels\LojaCompra\LojaCompraMedicinaCarinhoRegistrationViewModel\LojaCompraMedicinaCarinhoRegistrationViewModel;
use App\Utils\DateUtils;

class LojaCompraDAO extends DAO {

	public function registerCompra(LojaCompraCartaoCreditoRegistrationViewModel $compra): DAOResponse {

		$sql = <<<SQL
			insert into loja_compra
				(id_loja, id_usuario, valor, id_loja_tipo_compra, data_requisicao, hora_requisicao,	id_status)
			values
				(:loja_id:, :usuario_id:, :valor:, :loja_tipo_compra_id:, :data_r:, :hora_r:, :status_id:)	
		SQL;

		$binds = [ 
			'loja_id' => $compra->getIdLoja(),
			'usuario_id' => $compra->getIdUsuario(),
			'valor' => $compra->getValor(),
			'loja_tipo_compra_id' => $compra->getIdLojaTipoCompra(),
			'data_r' => $compra->getDataRequisicao(),
			'hora_r' => $compra->getHoraRequisicao(),
			'status_id' => $compra->getIdStatus()
		];

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

		$daoResponse = new DAOResponse();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
		} 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_compra' => $newid
				] );
			}
		}

		return $daoResponse;

	}

	public function registerCompraMedicinaCarinho(LojaCompraMedicinaCarinhoRegistrationViewModel $compra): DAOResponse {

		$sql = <<<SQL
			insert into loja_compra
				(id_loja, id_usuario, valor, id_loja_tipo_compra, data_requisicao, hora_requisicao,	id_status)
			values
				(:loja_id:, :usuario_id:, :valor:, :loja_tipo_compra_id:, :data_r:, :hora_r:, :status_id:)	
		SQL;

		$binds = [ 
			'loja_id' => $compra->getIdLoja(),
			'usuario_id' => $compra->getIdUsuario(),
			'valor' => $compra->getValor(),
			'loja_tipo_compra_id' => $compra->getIdLojaTipoCompra(),
			'data_r' => $compra->getDataRequisicao(),
			'hora_r' => $compra->getHoraRequisicao(),
			'status_id' => $compra->getIdStatus()
		];

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

		$daoResponse = new DAOResponse();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
		} 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_compra' => $newid
				] );
			}
		}

		return $daoResponse;

	}

	public function getComprasByLojaId(int $id_loja, int $id_status_compra): DAOResponse {

		$daoResponse = new DAOResponse();

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

		if ($id_status_compra == 0) {
			$sql = <<<SQL
				SELECT DISTINCT
					lc.id , lc.id_status as id_status_compra, lcs.resposta_loja_texto ,
					lc.id_loja , l.id_unidade , u.descricao as unidade ,
					lc.id_loja_tipo_compra , ltc.tipo_comra,  c.id as id_tutor,
					us.id as id_usuario , pf.nome ,lc.valor , lc.data_requisicao
				FROM
					loja_compra lc , loja l , loja_tipo_compra ltc , loja_compra_status lcs,
					unidade u , usuario us , pessoa_fisica pf, cliente c
				WHERE
					lc.id_loja = :loja_id:
					and lc.id_loja_tipo_compra = ltc.id
					and lc.id_status = lcs.id
					and lc.id_loja = l.id
					and lc.id_usuario = us.id
					and l.id_unidade = u.id
					and us.id_pessoa = pf.id_pessoa
					and us.id_pessoa = c.id_pessoa
				ORDER BY
					lc.data_requisicao DESC, pf.nome ASC
			SQL;
			$binds = [ 
				'loja_id' => $id_loja
			];
		} else {
			$sql = <<<SQL
				SELECT DISTINCT
					lc.id , lc.id_status as id_status_compra, lcs.resposta_loja_texto ,
					lc.id_loja , l.id_unidade , u.descricao as unidade ,
					lc.id_loja_tipo_compra , ltc.tipo_comra,  c.id as id_tutor,
					us.id as id_usuario , pf.nome ,lc.valor , lc.data_requisicao
				FROM
					loja_compra lc , loja l , loja_tipo_compra ltc , loja_compra_status lcs,
					unidade u , usuario us , pessoa_fisica pf, cliente c
				WHERE
					lc.id_loja = :loja_id:
					and lc.id_loja_tipo_compra = ltc.id
					and lc.id_status = lcs.id
					and lcs.id_respota_loja = :status_id:
					and lc.id_loja = l.id
					and lc.id_usuario = us.id
					and l.id_unidade = u.id
					and us.id_pessoa = pf.id_pessoa
					and us.id_pessoa = c.id_pessoa
				ORDER BY
					lc.data_requisicao DESC, pf.nome ASC
			SQL;
			$binds = [ 
				'status_id' => $id_status_compra,
				'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 getPetsByComprasId(array $compras_id): DAOResponse {

		$daoResponse = new DAOResponse();
		$ids = "";

		for($i = 0; $i < count( $compras_id ); $i++) {
			if ($i == 0) {
				$ids .= "(" . $compras_id [$i];
			} else {
				$ids .= "," . $compras_id [$i];
			}
		}
		$ids .= ")";

		$sql = <<<SQL
			SELECT DISTINCT
				v.id_compra , v.id_pet , p.nome
			FROM
				voucher v , pet p
			WHERE
				v.id_compra in $ids
				and v.id_pet = p.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( [ 
					'pets' => $result
				] );
			}
		}

		return $daoResponse;

	}

	public function getComprasItensById(int $id_loja_compra): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			SELECT
				lci.id , lci.id_loja_compra , 
				lci.id_loja_produto , ps.nome ,lci.quantidade ,
				lci.valor_unidade , lci.valor
			FROM
				loja_compra_item lci , loja_produto lp,
				produto_servico ps
			WHERE
				lci.id_loja_compra = :loja_compra_id:
				and lci.id_loja_produto = lp.id_produto
				and lp.id_produto = ps.id
		SQL;
		$binds = [ 
			'loja_compra_id' => $id_loja_compra
		];

		$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 excluirCompraById(int $idcompra): DAOResponse {

		$sql = <<<SQL
			delete from loja_compra
			where  id  = :compra_id:
		SQL;

		$binds = [ 
			'compra_id' => $idcompra
		];

		$daoResponse = new DAOResponse();
		$conn = db_connect();
		$result = $conn->query( $sql, $binds )->numRows;
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
		} 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 changeStatusCompra(int $idcompra, int $idstatus): DAOResponse {

		$sql = <<<SQL
			update loja_compra
			set id_status = :status_id: , data_alteracao = :data_alt:, hora_alteracao = :hora_alt:
			where  id  = :compra_id:
		SQL;

		$binds = [ 
			'status_id' => $idstatus,
			'compra_id' => $idcompra,
				'data_alt' => DateUtils::today(),
				'hora_alt' => DateUtils::now_time()
		];

		$daoResponse = new DAOResponse();
		$conn = db_connect();
		$result = $conn->query( $sql, $binds )->numRows;
		$errors = $conn->error();

		if ($errors ['code'] != 0) {
			$daoResponse->setStatus( DAOResponseInterface::DATABASE_CONNECTION_ERROR );
			$daoResponse->setErrors( $errors );
			$daoResponse->setData( [ ] );
		} 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 getComprasByUsuarioId(int $idusuario, int $idstatus): DAOResponse {

		$daoResponse = new DAOResponse();

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

		if ($idstatus == 0) {
			$sql = <<<SQL
				SELECT DISTINCT
					lc.id, lc.id_loja, u.descricao as unidade,
					id_loja_tipo_compra , ltc.tipo_comra as tipo_compra,
					lc.data_requisicao, lc.hora_requisicao , lc.id_status, lcs.id_respota_loja ,
					lcs.resposta_loja_texto , lc.valor
				FROM
					loja_compra lc , loja l, unidade u ,
					loja_tipo_compra ltc, loja_compra_status lcs
				WHERE
					lc.id_usuario = :usuario_id:
					and lc.id_loja = l.id
					and l.id_unidade = u.id
					and lc.id_loja_tipo_compra = ltc.id
					and lc.id_status  = lcs.id
				ORDER BY lc.data_requisicao DESC, lc.hora_requisicao DESC
			SQL;
			$binds = [ 
				'usuario_id' => $idusuario
			];
		} else {
			$sql = <<<SQL
				SELECT DISTINCT
					lc.id, lc.id_loja, u.descricao as unidade,
					id_loja_tipo_compra , ltc.tipo_comra as tipo_compra,
					lc.data_requisicao, lc.hora_requisicao, lc.id_status, lcs.id_respota_loja ,
					lcs.resposta_loja_texto , lc.valor
				FROM
					loja_compra lc , loja l, unidade u ,
					loja_tipo_compra ltc, loja_compra_status lcs
				WHERE
					lc.id_usuario = :usuario_id:
					and lc.id_status = :status_id:
					and lc.id_loja = l.id
					and l.id_unidade = u.id
					and lc.id_loja_tipo_compra = ltc.id
					and lc.id_status  = lcs.id
				ORDER BY lc.data_requisicao DESC, lc.hora_requisicao DESC
			SQL;
			$binds = [ 
				'usuario_id' => $idusuario,
				'status_id' => $idstatus
			];
		}

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

		return $daoResponse;

	}

	public function getProdutoLojaId(): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
		    select lp.id as id_loja_produto from produto_servico ps 
		        inner join loja_produto lp on lp.id_produto = ps.id 
		                 where ps.id_tipo_voucher = 3
		SQL;

		$conn = db_connect();
		$result = $conn->query( $sql )
			->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( [ 
					'id_tipo_produto' => $result [0]
				] );
			}
		}

		return $daoResponse;

	}

	public function getCompraIdByReferenceId(string $referenceid): DAOResponse {

		$daoResponse = new DAOResponse();

		$sql = <<<SQL
			select 
				lc.id ,lc.id_loja , lc.id_usuario , lc.valor , lc.id_loja_tipo_compra , 
				lc.data_requisicao , lc.hora_requisicao , lc.id_status , lc.data_alteracao , lc.hora_alteracao
			from
				pagseguro_request pr, loja_compra lc
			where
				pr.reference_id =:reference_id:
				and pr.id_loja_compra = lc.id
		SQL;

		$binds = [ 
			'reference_id' => $referenceid
		];

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

		return $daoResponse;

	}

}





