package your.project.demo.service;

import your.project.demo.common.BasicService;
import your.project.demo.common.DateTimeUtil;
import your.project.demo.dao.BookDao;
import your.project.demo.dao.BookEditorDao;
import your.project.demo.dao.EditorDao;
import your.project.demo.vo.Book;
import your.project.demo.vo.BookEditor;
import your.project.demo.vo.Editor;
import com.github.walker.mybatis.paginator.OffsetLimitInterceptor;
import com.github.walker.mybatis.paginator.Order;
import com.github.walker.mybatis.paginator.PageBounds;
import com.github.walker.mybatis.paginator.PageList;
import org.apache.ibatis.session.SqlSession;

import java.util.*;

/**
 * @author HuQingmiao
 */
public class DemoService extends BasicService {

    /**
     * 清空测试数据,以备测试
     */
    public void clearTestData() {
        log.info("clearTestData() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            int cnt = bookDao.deleteAll();
            log.info(">>cnt: " + cnt);

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    public void deleteBooks() {
        log.info("deleteBooks() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            List<Long> idSets = new ArrayList<Long>();
            idSets.add(new Long(101));
            idSets.add(new Long(103));

            int cnt = bookDao.deleteByIds(idSets);
            log.info(">>cnt: " + cnt);

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }

    public void findBooks() {
        log.info("findBooks() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            HashMap<String, Object> paramMap = new HashMap<String, Object>();
            paramMap.put("minCost", new Float(0));
            paramMap.put("maxCost", new Float(100));
            List<Book> bookList = bookDao.find(paramMap, new PageBounds(1, 6));

            for (Book book : bookList) {
                log.info(book.getBookId() + " " + book.getTitle() + " " + book.getPrice());
            }
            log.info("");

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    public void findABook()  {
        log.info("findABook() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            Book book = (Book) bookDao.findByPK(new Long(10002));
            if (book != null) {
                log.info(book.getBookId() + " " + book.getTitle() + " " + book.getPrice());
            } else {
                log.info("Not found!");
            }

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }

    /**
     * 增加一本书;
     */
    public void addOneBook() {
        log.info("addOneBook() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            Book book = new Book();
            book.setBookId(new Long(10002));
            book.setTitle(new String("三国演义"));
            book.setPrice(new Double(30.0));
            book.setPublishTime(DateTimeUtil.toSqlTimestamp(new Date()));

            // 开放此代码, 试图把一个不存在的文件写入数据库, 将抛出异常
            // book.setTextContent(new ETxtFile("d:\\三国.txt"));

            // 开放此代码, 试图向不存在与此属性对应的列写数据, EasyDB会对其忽略
            // book.setANotExistCol(new EString("asdff"));

            int cnt = bookDao.save(book);
            log.info(">>cnt: " + cnt);

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    /**
     * 批量增加多本书;
     */
    public void addMultiBooks()  {
        log.info("addMultiBooks() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            int size = 3;
            Book[] BookArray = new Book[size];

            BookArray[0] = new Book();
            BookArray[0].setBookId(new Long(101));
            BookArray[0].setTitle(new String("UNIX-上册"));
            BookArray[0].setPrice(new Double(100.0f));

            BookArray[1] = new Book();
            BookArray[1].setBookId(new Long(105));
            BookArray[1].setTitle(new String("UNIX-中册"));
            BookArray[1].setPrice(new Double(52.0f));

            BookArray[2] = new Book();
            BookArray[2].setBookId(new Long(103));
            BookArray[2].setTitle(new String("UNIX-下册"));
            BookArray[2].setPrice(new Double(35.0f));
            BookArray[2].setPublishTime(DateTimeUtil.toSqlTimestamp(new Date()));

            int cnt = bookDao.saveBatch(Arrays.asList(BookArray));
            log.info(">>cnt: " + cnt);

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    /**
     * 根据主键更新某本书
     */
    public void updateOneBook() {
        log.info("updateOneBook() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            Book book = new Book();
            book.setTitle(new String("八国演义(第二版)"));
            book.setBookId(new Long(10002));
            book.setPrice(new Double(60));

            int cnt = bookDao.update(book);
            log.info(">>cnt: " + cnt);

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    /**
     * 对部分图书设定折扣价
     */
    public void updateMultiBooks()  {
        log.info("updateMultiBooks() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            //找出50元以上的书,然后打6折
            HashMap<String, Object> paramMap = new HashMap<String, Object>();
            paramMap.put("minCost", new Float(50));
            List<Book> bookList = bookDao.find(paramMap, new PageBounds());

            for (Book book : bookList) {
                book.setPrice(new Double(33.0));
            }
            bookDao.updateBatch(bookList);
            sqlSession.commit();

            for (Book book : bookList) {
                log.info(book.getBookId() + " " + book.getTitle() + " " + book.getPrice());
            }
            log.info("");

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    public void deleteOneBook() {
        log.info("deleteOneBook() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            int cnt = bookDao.deleteByPK(new Long(101));
            log.info(">>cnt: " + cnt);

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }

    /**
     * 批量删除某部分书
     */
    public void deleteMultiBooks()  {
        log.info("deleteMultiBooks() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            //找出100元以下的书,然后打6折
            HashMap<String, Object> paramMap = new HashMap<String, Object>();
            paramMap.put("maxCost", new Float(100));
            List<Book> bookList = bookDao.find(paramMap, new PageBounds());

            int cnt = bookDao.deleteBatch(bookList);
            log.info("cnt: "+cnt);

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    public void addEditors() {
        log.info("addEditors() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            EditorDao editorDao = sqlSession.getMapper(EditorDao.class);
            BookEditorDao bookEditorDao = sqlSession.getMapper(BookEditorDao.class);

            int cnt = editorDao.deleteAll();
            log.info(">>cnt: " + cnt);

            cnt = bookEditorDao.deleteAll();
            log.info(">>cnt: " + cnt);

            List<Editor> editorList = new ArrayList<Editor>();
            Editor editor1 = new Editor();
            editor1.setEditorId(new Long(22));
            editor1.setName("徐静蕾");
            editor1.setSex("F");
            editorList.add(editor1);

            Editor editor2 = new Editor();
            editor2.setEditorId(new Long(33));
            editor2.setName("张德芬");
            editor2.setSex("F");
            editorList.add(editor2);

            editorDao.saveBatch(editorList);


            List<BookEditor> bookEditorList = new ArrayList<BookEditor>();
            BookEditor be1 = new BookEditor();
            be1.setBookId(new Long(101));
            be1.setEditorId(new Long(22));
            bookEditorList.add(be1);

            BookEditor be2 = new BookEditor();
            be2.setBookId(new Long(103));
            be2.setEditorId(new Long(22));
            bookEditorList.add(be2);

            BookEditor be3 = new BookEditor();
            be3.setBookId(new Long(10002));
            be3.setEditorId(new Long(33));
            bookEditorList.add(be3);

            bookEditorDao.saveBatch(bookEditorList);
            log.info("");

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }

    /*
     * 关联表分页查询
     */
    public void findEditorAndBook(){
        log.info("findEditorAndBook() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            HashMap<String, Object> paramMap = new HashMap<String, Object>();
            paramMap.put("editorName", "徐静蕾");

            PageBounds pageBounds = new PageBounds(0, 2);
            List<Book> bookList = bookDao.findEditorAndBooks(paramMap, pageBounds);

            for (Book book : bookList) {
                log.info(book.getEditorName() + "(" + book.getEditorSex() + "): " + book.getBookId() + " " + book.getTitle() + " " + book.getPrice());
            }
            log.info("");

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }


    public void findBooksForPager() {
        log.info("findBooksForPager() >>");

        SqlSession sqlSession = sessionFactory.openSession(false);
        try {
            BookDao bookDao = sqlSession.getMapper(BookDao.class);

            HashMap<String, Object> paramMap = new HashMap<String, Object>();
          //  paramMap.put("title", "%UNIX%");


//		new PageBounds();				//默认构造函数不提供分页,返回ArrayList
//		new PageBounds(int limit);		//取TOP N条记录,返回ArrayList
//		new PageBounds(Order... order);	//只排序不分页,返回ArrayList
//
//		new PageBounds(int page, int limit);//默认分页,返回PageList
//		new PageBounds(int page, int limit, Order... order);//分页加排序,返回PageList

            int offset = 0; //起始行号
            int count = 2;  //获取条数
            String sortString = "title.asc, price.desc";//如果想排序的话,以逗号分隔多项排 序列
            PageBounds pageBounds = new PageBounds(offset, count, Order.formString(sortString));
            List<Book> bookList = bookDao.find(paramMap, pageBounds);


            PageList<Book> pageList = (PageList<Book>) bookList;//获得结果集条总数
            log.info("totalCount: " + pageList.getTotalCount());

            for (Book book : bookList) {
                log.info(book.getBookId() + " " + book.getTitle() + " " + book.getPrice());
            }
            log.info("");

            sqlSession.commit(true);
        } finally {
            sqlSession.close();
        }
    }

}