package org.wlf.filedownloader_demo2.advanced_use.model;

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

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.dao.Dao.CreateOrUpdateStatus;
import com.j256.ormlite.field.DatabaseField;
import com.j256.ormlite.stmt.DeleteBuilder;
import com.j256.ormlite.stmt.UpdateBuilder;
import com.j256.ormlite.table.DatabaseTable;

import org.wlf.filedownloader.DownloadFileInfo;
import org.wlf.filedownloader.FileDownloader;
import org.wlf.filedownloader.listener.OnDownloadFileChangeListener;
import org.wlf.filedownloader_demo2.advanced_use.db.CourseDbHelper;

import java.sql.SQLException;

/**
 * @author wlf(Andy)
 * @datetime 2015-12-11 22:04 GMT+8
 * @email [email protected]
 */
@DatabaseTable(tableName = "tb_course")
public class CoursePreviewInfo implements OnDownloadFileChangeListener {

    public static final String COLUMN_NAME_OF_FIELD_COURSE_URL = "course_url";

    @DatabaseField(generatedId = true, columnName = "_id")
    private Integer mId;//the id of the table

    @DatabaseField(columnName = "course_id", unique = true, canBeNull = false)
    private String mCourseId;//the id of the course

    @DatabaseField(columnName = COLUMN_NAME_OF_FIELD_COURSE_URL, unique = true, canBeNull = false)
    private String mCourseUrl;//the url of the course

    @DatabaseField(columnName = "course_cover_url")
    private String mCourseCoverUrl;//the cover_url of the course

    @DatabaseField(columnName = "course_name")
    private String mCourseName;//the name of the course

    private DownloadFileInfo mDownloadFileInfo;//DownloadFileInfo
    private CourseDbHelper mCourseDbHelper;//the DbOpenHelper

    private CoursePreviewInfo() {
        init();
    }

    public CoursePreviewInfo(String courseId, String courseUrl, String courseCoverUrl, String courseName,
                             CourseDbHelper courseDbHelper) {
        mCourseId = courseId;
        mCourseUrl = courseUrl;
        mCourseCoverUrl = courseCoverUrl;
        mCourseName = courseName;
        mCourseDbHelper = courseDbHelper;

        init();
    }

    /**
     * init resources
     */
    public void init() {
        // register DownloadFileChangeListener
        FileDownloader.registerDownloadFileChangeListener(this);
        // init DownloadFileInfo if has been downloaded
        if (!TextUtils.isEmpty(mCourseUrl)) {
            mDownloadFileInfo = FileDownloader.getDownloadFile(mCourseUrl);
        }
    }

    /**
     * release resources
     */
    public void release() {
        // unregister
        FileDownloader.unregisterDownloadFileChangeListener(this);
    }

    // getters
    public Integer getId() {
        return mId;
    }

    public String getCourseId() {
        return mCourseId;
    }

    public String getCourseUrl() {
        return mCourseUrl;
    }

    public String getCourseCoverUrl() {
        return mCourseCoverUrl;
    }

    public String getCourseName() {
        return mCourseName;
    }

    public DownloadFileInfo getDownloadFileInfo() {
        return mDownloadFileInfo;
    }

    @Override
    public void onDownloadFileCreated(DownloadFileInfo downloadFileInfo) {

        if (downloadFileInfo != null && downloadFileInfo.getUrl() != null && downloadFileInfo.getUrl().equals
                (mCourseUrl)) {

            // add this CoursePreviewInfo in database download record
            // 
            // the reason why to save this CoursePreviewInfo in course database is 
            // that when the user enter the CourseDownloadFragment,the fragment need to show the course title to the 
            // user,however the DownloadFileInfo in FileDownloader can not provide the course title,also the fragment 
            // need to know how many course items need to show,so it is depends on the size of the course database, 
            // because FileDownloader is just a tool to download, record and manage all the files which were 
            // downloaded from the internet
            try {
                if (mCourseDbHelper == null) {
                    return;
                }
                Dao<CoursePreviewInfo, Integer> dao = mCourseDbHelper.getDao(CoursePreviewInfo.class);
                CreateOrUpdateStatus status = dao.createOrUpdate(this);
                if (status.isCreated() || status.isUpdated()) {
                    this.mDownloadFileInfo = downloadFileInfo;
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    @Override
    public void onDownloadFileUpdated(DownloadFileInfo downloadFileInfo, Type type) {

        if (downloadFileInfo != null && downloadFileInfo.getUrl() != null && downloadFileInfo.getUrl().equals
                (mCourseUrl)) {
            if (this.mDownloadFileInfo == null) {
                try {
                    if (mCourseDbHelper == null) {
                        return;
                    }
                    UpdateBuilder builder = mCourseDbHelper.getDao(CoursePreviewInfo.class).updateBuilder();
                    builder.where().eq(CoursePreviewInfo.COLUMN_NAME_OF_FIELD_COURSE_URL, downloadFileInfo.getUrl());
                    int result = builder.update();
                    if (result == 1) {
                        this.mDownloadFileInfo = downloadFileInfo;
                    } else {
                        Dao<CoursePreviewInfo, Integer> dao = mCourseDbHelper.getDao(CoursePreviewInfo.class);
                        CreateOrUpdateStatus status = dao.createOrUpdate(this);
                        if (status.isCreated() || status.isUpdated()) {
                            this.mDownloadFileInfo = downloadFileInfo;
                        }
                    }
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

    }

    @Override
    public void onDownloadFileDeleted(DownloadFileInfo downloadFileInfo) {

        if (downloadFileInfo != null) {
            Log.e("wlf", "onDownloadFileDeleted,downloadFileInfo:" + downloadFileInfo.getUrl());
        } else {
            Log.e("wlf", "onDownloadFileDeleted,downloadFileInfo:" + downloadFileInfo);
        }

        if (downloadFileInfo != null && downloadFileInfo.getUrl() != null && downloadFileInfo.getUrl().equals
                (mCourseUrl)) {
            // delete this course preview in database download record
            try {
                if (mCourseDbHelper == null) {
                    return;
                }
                DeleteBuilder builder = mCourseDbHelper.getDao(CoursePreviewInfo.class).deleteBuilder();
                builder.where().eq(CoursePreviewInfo.COLUMN_NAME_OF_FIELD_COURSE_URL, mCourseUrl);
                int result = builder.delete();
                if (result == 1) {
                    this.mDownloadFileInfo = null;
                    Log.w("wlf", "onDownloadFileDeleted,downloadFileInfo,delete succeed:" + downloadFileInfo.getUrl());
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

        }
    }
}