package ar.rulosoft.mimanganu.services;
import android.util.Log;
import ar.rulosoft.mimanganu.componentes.Chapter;
import ar.rulosoft.mimanganu.componentes.Database;
import ar.rulosoft.mimanganu.services.SingleDownload.Status;
public class ChapterDownload implements StateChangeListener {
public static int MAX_ERRORS = 5;
public DownloadStatus status;
public Chapter chapter;
private OnErrorListener errorListener = null;
private StateChangeListener changeListener = null;
private Status[] pagesStatus;
private int progress = 0;
public ChapterDownload(Chapter chapter) {
this.chapter = chapter;
reset();
}
public void reset() {
pagesStatus = new Status[chapter.getPages()];
for (int i = 0; i < pagesStatus.length; i++) {
pagesStatus[i] = Status.QUEUED;
}
changeStatus(DownloadStatus.QUEUED);
}
private void changeStatus(DownloadStatus newStatus) {
this.status = newStatus;
if (changeListener != null) {
changeListener.onStatusChanged(this);
}
}
int getNext() {
int j = -2;
if (status.ordinal() < DownloadStatus.DOWNLOADED.ordinal()) {
if (status == DownloadStatus.QUEUED)
changeStatus(DownloadStatus.DOWNLOADING);
if(chapter.getPages() == 0){
changeStatus(DownloadStatus.ERROR);
}
if (areErrors()) {
j = -11;
} else if (progress < chapter.getPages()) {
for (int i = 0; i < chapter.getPages(); i++) {
if (pagesStatus.length > i) {
if (pagesStatus[i] == Status.QUEUED || pagesStatus[i] == Status.POSTPONED) {
pagesStatus[i] = Status.INIT;
j = i;
break;
}
} else {
Log.e("ChapterDownload", "i is too large! pagesStatus.length: " + pagesStatus.length + " i: " + i);
break;
}
}
}
}
return (j + 1);
}
private boolean areErrors() {
int errors = 0;
for (Status e : pagesStatus) {
if (e.ordinal() > Status.DOWNLOAD_OK.ordinal()) {
errors++;
DownloadPoolService.errors++;
if (errors > MAX_ERRORS) {
changeStatus(DownloadStatus.ERROR);
if (errorListener != null) {
errorListener.onError(chapter);
}
if(DownloadPoolService.mDownloadsChangesListener != null){
DownloadPoolService.mDownloadsChangesListener.onStatusChanged(DownloadPoolService.chapterDownloads.indexOf(this),this);
}
break;
}
}
}
return errors > MAX_ERRORS;
}
public boolean isDownloading() {
boolean ret = false;
for (Status e : pagesStatus) {
if (e.ordinal() < Status.POSTPONED.ordinal()) {
ret = true;
break;
}
}
if (!ret)
changeStatus(DownloadStatus.DOWNLOADED);
return ret;
}
public int getProgress() {
return progress;
}
public void setProgress(int progress) {
this.progress = progress;
}
public Chapter getChapter() {
return chapter;
}
public void setChapter(Chapter chapter) {
this.chapter = chapter;
}
void setChangeListener(StateChangeListener changeListener) {
this.changeListener = changeListener;
}
void setErrorIdx(int idx) {
pagesStatus[idx] = Status.ERROR_ON_UPLOAD;
progress++;
areErrors();
checkProgreso();
}
private void checkProgreso() {
if (progress == chapter.getPages()) {
Database.updateChapterDownloaded(DownloadPoolService.actual, chapter.getId(), 1);
changeStatus(DownloadStatus.DOWNLOADED);
}
}
@Override
public void onStatusChanged(ChapterDownload chapterDownload) {
//nothing to do here
}
@Override
public void onChange(SingleDownload singleDownload) {
pagesStatus[singleDownload.index] = singleDownload.status;
progress++;
checkProgreso();
if (changeListener != null)
changeListener.onChange(singleDownload);
}
void setErrorListener(OnErrorListener errorListener) {
this.errorListener = errorListener;
if (this.status == DownloadStatus.ERROR && errorListener != null) {
errorListener.onError(chapter);
}
}
public int getPagesStatusLength() {
return pagesStatus.length;
}
public enum DownloadStatus {
QUEUED, DOWNLOADING, DOWNLOADED, PAUSED, ERROR
}
public interface OnErrorListener {
void onError(Chapter chapter);
}
}