package com.book.healthapp.repositories;

import java.util.List;

import javax.persistence.TypedQuery;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import com.book.healthapp.domain.Doctor;
import com.book.healthapp.domain.User;

@Repository
@Transactional
public class DoctorDAOImpl implements DoctorDAO {

	private SessionFactory sessionFactory;
    
	@Autowired 
	public DoctorDAOImpl(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	@Override
	public List<Doctor> findBySpecialityCode(String code) {
		Session session = this.sessionFactory.getCurrentSession();
        TypedQuery<Doctor> query = session.getNamedQuery("findBySpeciality");  
        query.setParameter("specialityCode", code);
        List<Doctor> doctors = query.getResultList();
        return doctors;
	}
	
	@Override
	public Doctor findByUserId(int userId) {
		Session session = this.sessionFactory.getCurrentSession();
        TypedQuery<Doctor> query = session.getNamedQuery("findById");  
        query.setParameter("id", userId);
        List<Doctor> doctors = query.getResultList();
        return doctors.get(0);
	}


	@Override
	public List<Doctor> findByLocation(String location) {
		return null;
	}

	@Override
	public List<Doctor> findByHospital(String hospitalName) {
//		Session session = this.sessionFactory.getCurrentSession();
//        TypedQuery<Doctor> query = session.getNamedQuery("findByHospital");  
		return null;
	}

	@Override
	public List<Doctor> findAll() {
		Session session = this.sessionFactory.getCurrentSession();
        TypedQuery<Doctor> query = session.getNamedQuery("findAll");  
        List<Doctor> doctors = query.getResultList();
        return doctors;
	}

	@Override
	public int findAllCount() {
		Session session = this.sessionFactory.getCurrentSession();
        TypedQuery<Number> query = session.getNamedQuery("findAllCount"); 
        int count = ((Number)query.getSingleResult()).intValue();
        return count;
	}

	@Override
	public Doctor save(Doctor doctor) {
		Session session = this.sessionFactory.openSession();
		session.save(doctor);
		session.close();
		return doctor;
	}

}