package com.novelbook.android.db;


import android.text.TextUtils;
import android.util.Log;

import com.novelbook.android.utils.Constants;

import org.litepal.LitePal;
import org.litepal.annotation.Column;
import org.litepal.crud.LitePalSupport;
import org.w3c.dom.Text;

import java.io.Serializable;

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


public class Novel extends LitePalSupport implements Serializable{
    private int id;
    //@Column(unique = true, defaultValue = "0")
    private int novelId;
    private String name;
    private String infoUrl;
    private String domain;
    private String domainName;
    private String muluUrl;
    private String novelPath;
    private long lastReadPos;
    private int lastReadChapt=1;
    private String charset;
    private String novelType;
    private String smallNovelType;
    private String author;
    private String cover;
    private String chapterName;
    private String desc;
    private String progress;
    private long lastUpdateTime;
    private boolean isOnShelf;  //是否入书架
    private boolean isFinished; //是否完本
    private boolean isUpdated;
    private boolean isTop;//置顶
    private long readtime; //阅读时间
    private int chaptCnt; //总章数
    private long lastVisit;//最近浏览,如何设置默认时间?

    public int getChaptCnt() {
        return chaptCnt;
    }

    public void setChaptCnt(int chaptCnt) {
        this.chaptCnt = chaptCnt;
    }

    public long getReadtime() {
        return readtime;
    }

    public void setReadtime(long readtime) {
        this.readtime = readtime;
    }

    public String getDomainName() {
        return domainName;
    }

    public void setDomainName(String domainName) {
        this.domainName = domainName;
    }

    public long getLastVisit() {
        return lastVisit;
    }

    public void setLastVisit(long lastVisit) {
        this.lastVisit = lastVisit;
    }

    public boolean isTop() {
        return isTop;
    }

    public void setTop(boolean top) {
        isTop = top;
    }

    public boolean isUpdated() {
        return isUpdated;
    }

    public void setUpdated(boolean updated) {
        isUpdated = updated;
    }

    public String getInfoUrl() {
        return infoUrl;
    }

    public void setInfoUrl(String infoUrl) {
        this.infoUrl = infoUrl;
    }

    public String getSmallNovelType() {
        return smallNovelType;
    }

    public void setSmallNovelType(String smallNovelType) {
        this.smallNovelType = smallNovelType;
    }

    public String getChapterName() {
        return chapterName;
    }

    public void setChapterName(String chapterName) {
        this.chapterName = chapterName;
    }

    public String getDesc() {
        return desc;
    }

    public void setDesc(String desc) {
        this.desc = desc;
    }

    public String getProgress() {
        return progress;
    }

    public void setProgress(String progress) {
        this.progress = progress;
    }

     public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public int getNovelId() {
        return novelId;
    }

    public void setNovelId(int novelId) {
        this.novelId = novelId;
    }

    public String getName() {
        return name;
    }

    public void setName(String novelName) {
        this.name = novelName;
    }

    public String getDomain() {
        return domain;
    }

    public void setDomain(String domain) {
        this.domain = domain;
    }

    public String getMuluUrl() {
        return muluUrl;
    }

    public void setMuluUrl(String muluUrl) {
        this.muluUrl = muluUrl;
    }

    public String getNovelPath() {
        return novelPath;
    }

    public void setNovelPath(String novelPath) {
        this.novelPath = novelPath;
    }

    public long getLastReadPos() {
        return lastReadPos;
    }

    public void setLastReadPos(long lastReadPos) {
        this.lastReadPos = lastReadPos;
    }

    public int getLastReadChapt() {
       // if(lastReadChapt<=0){lastReadChapt=1;}
        return lastReadChapt;
    }

    public void setLastReadChapt(int lastReadChapt) {
      //  lastReadChapt = lastReadChapt >0 ? lastReadChapt :1;
        this.lastReadChapt = lastReadChapt;
    }

    public String getCharset() {
        return charset;
    }

    public void setCharset(String charset) {
        this.charset = charset;
    }

    public String getNovelType() {
        return novelType;
    }

    public void setNovelType(String novelType) {
        this.novelType = novelType;
    }



    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getCover() {
        return cover;
    }

    public void setCover(String cover) {
        this.cover = cover;
    }


    public long getLastUpdateTime() {
        return lastUpdateTime;
    }

    public void setLastUpdateTime(long lastUpateTime) {
        this.lastUpdateTime = lastUpateTime;
    }

    public boolean isOnShelf() {
        return isOnShelf;
    }

    public void setOnShelf(boolean onShelf) {
        isOnShelf = onShelf;
    }

    public boolean isFinished() {
        return isFinished;
    }

    public void setFinished(boolean finished) {
        isFinished = finished;
    }

    public boolean isLocalBook(){
        return novelId==0;
    }
    public static Novel getNovelBySvrId(int novelId){

        List<Novel> nvs =  LitePal.where("novelId=?",novelId+"").limit(1).find(Novel.class);
        if(nvs.size()>0){
            return nvs.get(0);
        }
        return null;
    }
    public static List<Novel> getNovelsOnShelf(){

     // return  LitePal.where("isOnShelf=?","1").order("isTop desc,isUpdated desc,lastVisit desc,lastUpdateTime desc" ).find(Novel.class);
      return  LitePal.where("isOnShelf=?","1").order("isTop desc,lastUpdateTime desc" ).find(Novel.class);


    }
    public static List<Novel> getLocalNovels(){

        return  LitePal.where("novelPath !=? ","").find(Novel.class);

    }

    public static List<Novel> getNovelsHistory(){

        return  LitePal.where("lastVisit>0").order("lastVisit desc").limit(50).find(Novel.class);

    }

    /**
     * 有没有新的更新
     * @return
     */
  /*  public boolean isUpdated(){
       return lastUpdateTime2 >0 && lastUpdateTime > lastUpdateTime2;
    }
*/
  private void setValues(){
      lastVisit = new Date().getTime();
  }
    @Override
    public boolean save(){
        setValues();
        return super.save();
    }
    @Override
    public int update(long id){
        setValues();
        checkAndUpdate();
        Log.d("checkshelf", String.format("checkshelf:novel %s going to update,isUpdated %s", getName() ,isUpdated));
       /* try {
            throw new Exception("check update");
        }catch (Exception e){
            Log.e("checkshelf", "checkshelf   ", e);
        }*/
        try {
            return super.update(id);
        }catch (Exception e){
            Log.e("NOVELDB", "update:error ", e);
        }
        return 0;
    }
public void testUpdate(){
      isUpdated=true;
      super.update(id);
}
    public int checkAndUpdate(){
        Novel nv =  getNovelBySvrId(novelId);
      /*  if(lastUpdateTime > nv.lastVisit && lastUpdateTime > nv.lastUpdateTime){
            isUpdated =true;
        }*/
        isUpdated =lastUpdateTime > nv.lastVisit || lastUpdateTime > nv.lastUpdateTime;
        Log.d("Novel", String.format("book %s  server lastUpdateTime %s, local lastupdatetime %s, local lastvist %s" +
                        "is updated %s,diff1 %s,diff2 %s"
               ,name ,lastUpdateTime,nv.lastUpdateTime,nv.lastVisit,isUpdated,
                lastUpdateTime - nv.lastVisit,
                lastUpdateTime - nv.lastUpdateTime) );

        if(!isUpdated){
            setToDefault("isUpdated");
        }

        return super.update(nv.id);
    }
    public int getMaxAge(){
        int maxAge = Constants.MAXAGE_MULU;
        if( isFinished){
            maxAge =Constants.MAXAGE_MAX;
        }else if(isUpdated){
            maxAge = 0;
        }
        return   maxAge; // return 0;// maxAge;
    }

}