package net.laoyeye.yyblog.service.impl;

import java.util.Arrays;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;

import net.laoyeye.yyblog.common.DataGridResult;
import net.laoyeye.yyblog.common.YYBlogResult;
import net.laoyeye.yyblog.common.utils.FilterHtml;
import net.laoyeye.yyblog.common.utils.IDUtils;
import net.laoyeye.yyblog.mapper.NoteMapper;
import net.laoyeye.yyblog.mapper.TagMapper;
import net.laoyeye.yyblog.mapper.TagReferMapper;
import net.laoyeye.yyblog.model.NoteDO;
import net.laoyeye.yyblog.model.TagDO;
import net.laoyeye.yyblog.model.TagReferDO;
import net.laoyeye.yyblog.model.query.NoteQuery;
import net.laoyeye.yyblog.model.vo.NoteVO;
import net.laoyeye.yyblog.service.NoteService;

@Service
public class NoteServiceImpl implements NoteService {
    @Autowired
    private NoteMapper noteMapper;
    @Autowired
    private TagMapper tagMapper;
    @Autowired
    private TagReferMapper tagReferMapper;

    @Override
    public int countAllNote() {

        return noteMapper.countAllNote();
    }

    @Override
    public NoteVO getLatestNote() {

        return noteMapper.getLatestNote();
    }

    @Transactional
    @Override
    public YYBlogResult saveNote(NoteDO note, String tagName) {

        //插入笔记
        note.setId(IDUtils.genId());
        note.setTop(false);
        note.setIsShow(true);
        getTextContentByContent(note);
        note.setCreateTime(new Date());

        noteMapper.saveNote(note);
        if (!StringUtils.isEmpty(tagName)) {
            //标签处理
            String[] tagNameArray = tagName.split(",");
            TagDO tag = new TagDO();
            TagReferDO tagRefer = new TagReferDO();
            for (String name : Arrays.asList(tagNameArray)) {
                if (tagMapper.countByName(name) == 0) {
                    tag.setId(IDUtils.genId());
                    tag.setName(name);
                    tagMapper.saveTag(tag);
                } else {
                    tag = tagMapper.getTagByName(name);
                }
                tagRefer.setId(IDUtils.genId());
                tagRefer.setReferId(note.getId());
                tagRefer.setTagId(tag.getId());
                tagRefer.setIsShow(true);
                tagRefer.setType("2");
                tagReferMapper.saveTagRefer(tagRefer);
            }
        }
        return YYBlogResult.ok();
    }


    @Override
    public DataGridResult listPageNote(NoteQuery query) {
        PageHelper.startPage(query.getPage(), query.getLimit()); 
        List<NoteDO> list = noteMapper.listNoteByTitle(query.getTitle());
        //取记录总条数
        PageInfo<NoteDO> pageInfo = new PageInfo<NoteDO>(list);
        long total = pageInfo.getTotal();
        //创建一个返回值对象
        DataGridResult result = new DataGridResult(); 
        result.setData(list);
        result.setCount(total);
        return result;
    }

    @Transactional
    @Override
    public YYBlogResult updateIsShowById(Long id, Boolean isShow) {
        NoteDO note = new NoteDO();
        note.setId(id);
        note.setIsShow(isShow);
        note.setUpdateTime(new Date());
        noteMapper.update(note);
        return YYBlogResult.ok();
    }

    @Transactional
    @Override
    public YYBlogResult updateTopById(Long id, Boolean top) {
        NoteDO note = new NoteDO();
        note.setId(id);
        note.setTop(top);
        note.setUpdateTime(new Date());
        noteMapper.update(note);
        return YYBlogResult.ok();
    }

    @Transactional
    @Override
    public YYBlogResult delete(Long id) {
        tagReferMapper.deleteByReferId(id);
        noteMapper.delete(id);
        return YYBlogResult.ok();
    }


    @Override
    public NoteDO getNoteById(Long id) {

        return noteMapper.getNoteById(id);
    }

    @Override
    public YYBlogResult updateNote(NoteDO note, String tagName) {
        note.setUpdateTime(new Date());
        getTextContentByContent(note);
        noteMapper.update(note);
        tagReferMapper.deleteByReferId(note.getId());
        String[] tagNameArray = tagName.split(",");
        TagDO tag = new TagDO();
        TagReferDO tagRefer = new TagReferDO();
        for (String name : Arrays.asList(tagNameArray)) {
            if (tagMapper.countByName(name) == 0) {
                tag.setId(IDUtils.genId());
                tag.setName(name);
                tagMapper.saveTag(tag);
            } else {
                tag = tagMapper.getTagByName(name);
            }
            tagRefer.setId(IDUtils.genId());
            tagRefer.setReferId(note.getId());
            tagRefer.setTagId(tag.getId());
            tagRefer.setIsShow(true);
            tagRefer.setType("2");
            tagReferMapper.saveTagRefer(tagRefer);
        }
        return YYBlogResult.ok();
    }

    private void getTextContentByContent(NoteDO note) {
        String textContent = FilterHtml.filterHtml(note.getContent().trim());
        textContent = StringUtils.trimAllWhitespace(textContent);
        note.setTextContent(textContent);
    }
}