/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.hantsylabs.example.ee7.jsf;

import com.hantsylabs.example.ee7.jpa.Post;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.logging.Logger;
import javax.ejb.Stateful;
import javax.faces.view.ViewScoped;
import javax.inject.Inject;
import javax.inject.Named;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaDelete;
import javax.persistence.criteria.CriteriaUpdate;
import javax.persistence.criteria.Root;

/**
 *
 * @author hantsy
 */
@Stateful
@ViewScoped
@Named
public class PostsBean {

    @Inject
    Logger log;

    @PersistenceContext
    EntityManager em;

    private Map<Long, Boolean> checked = new HashMap<>();

    private List<Post> posts = new ArrayList<>();

    public void init() {
        log.info("call init");
        load();
        initCheckedMap();
    }

    private void load() {
        this.posts = em.createQuery("select p from Post p order by p.created desc", Post.class).getResultList();
        log.info(this.posts.size() + " posts found");      
    }

    private void initCheckedMap() {
        for (Post p : posts) {
            if (!checked.containsKey(p.getId())) {
                checked.put(p.getId(), false);
            }
        }
        log.info("checked map size@"+checked.size());
    }

    public List<Long> getCheckedList() {
        List<Long> result = new ArrayList<Long>();
        for (Long id : checked.keySet()) {
            if (checked.get(id).booleanValue()) {
                result.add(id);
            }
        }
        log.info("checked list size @"+result.size());
        return result;
    }

    public void update() {
        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaUpdate<Post> q = cb.createCriteriaUpdate(Post.class);
        Root<Post> root = q.from(Post.class);
        q.set(root.get("approved"), true)
                .where(root.get("id").in(getCheckedList()));

        int result = em.createQuery(q).executeUpdate();
        log.info("update @" + result);
        load();
    }

    public void delete() {
        final List<Long> checkedList = getCheckedList();
        for (Long id : checkedList) {
            checked.remove(id);
        }

        CriteriaBuilder cb = em.getCriteriaBuilder();
        CriteriaDelete<Post> q = cb.createCriteriaDelete(Post.class);
        Root<Post> root = q.from(Post.class);
        q.where(root.get("id").in(checkedList));

        int result = em.createQuery(q).executeUpdate();
        log.info("delete @" + result);
        load();
    }

    public List<Post> getPosts() {
        return posts;
    }

    public void setPosts(List<Post> posts) {
        this.posts = posts;
    }

    public Map<Long, Boolean> getChecked() {
        return checked;
    }

    public void setChecked(Map<Long, Boolean> checked) {
        this.checked = checked;
    }

}