package allen.town.podcast.model.download;

import androidx.annotation.NonNull;

import java.util.Date;

import allen.town.podcast.model.feed.FeedFile;

/**
 * Contains status attributes for one download
 */
public class DownloadStatus {
    /**
     * Downloaders should use this constant for the size attribute if necessary
     * so that the listadapters etc. can react properly.
     */
    public static final int SIZE_UNKNOWN = -1;

    // ----------------------------------- ATTRIBUTES STORED IN DB
    /**
     * A human-readable string which is shown to the user so that he can
     * identify the download. Should be the title of the item/feed/media or the
     * URL if the download has no other title.
     */
    private final String title;
    private final long feedfileId;
    /**
     * Is used to determine the type of the feedfile even if the feedfile does
     * not exist anymore. The value should be FEEDFILETYPE_FEED,
     * FEEDFILETYPE_FEEDIMAGE or FEEDFILETYPE_FEEDMEDIA
     */
    private final int feedfileType;
    private final boolean initiatedByUser;
    /**
     * Unique id for storing the object in database.
     */
    private long id;
    private DownloadError reason;
    /**
     * A message which can be presented to the user to give more information.
     * Should be null if Download was successful.
     */
    private String reasonDetailed;
    private boolean successful;
    private final Date completionDate;
    // ------------------------------------ NOT STORED IN DB
    private boolean done;
    private boolean cancelled;

    /**
     * Constructor for creating new completed downloads.
     */
    public DownloadStatus(@NonNull FeedFile feedfile, String title, DownloadError reason, boolean successful,
                          String reasonDetailed, boolean initiatedByUser) {
        this(0, title, feedfile.getId(), feedfile.getTypeAsInt(), successful, false, true, reason, new Date(),
                reasonDetailed, initiatedByUser);
    }

    public DownloadStatus(long id, String title, long feedfileId, int feedfileType, boolean successful,
                          boolean cancelled, boolean done, DownloadError reason, Date completionDate,
                          String reasonDetailed, boolean initiatedByUser) {
        this.id = id;
        this.title = title;
        this.feedfileId = feedfileId;
        this.reason = reason;
        this.successful = successful;
        this.cancelled = cancelled;
        this.done = done;
        this.completionDate = (Date) completionDate.clone();
        this.reasonDetailed = reasonDetailed;
        this.feedfileType = feedfileType;
        this.initiatedByUser = initiatedByUser;
    }

    @Override
    @NonNull
    public String toString() {
        return "DownloadStatus [id=" + id + ", title=" + title + ", reason="
                + reason + ", reasonDetailed=" + reasonDetailed
                + ", successful=" + successful + ", completionDate="
                + completionDate + ", feedfileId=" + feedfileId
                + ", feedfileType=" + feedfileType + ", done=" + done
                + ", cancelled=" + cancelled + "]";
    }

    public long getId() {
        return id;
    }

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

    public String getTitle() {
        return title;
    }

    public DownloadError getReason() {
        return reason;
    }

    public String getReasonDetailed() {
        return reasonDetailed;
    }

    public boolean isSuccessful() {
        return successful;
    }

    public Date getCompletionDate() {
        return (Date) completionDate.clone();
    }

    public long getFeedfileId() {
        return feedfileId;
    }

    public int getFeedfileType() {
        return feedfileType;
    }

    public boolean isInitiatedByUser() {
        return initiatedByUser;
    }

    public boolean isDone() {
        return done;
    }

    public boolean isCancelled() {
        return cancelled;
    }

    public void setSuccessful() {
        this.successful = true;
        this.reason = DownloadError.SUCCESS;
        this.done = true;
    }

    public void setFailed(DownloadError reason, String reasonDetailed) {
        this.successful = false;
        this.reason = reason;
        this.reasonDetailed = reasonDetailed;
        this.done = true;
    }

    public void setCancelled() {
        this.successful = false;
        this.reason = DownloadError.ERROR_DOWNLOAD_CANCELLED;
        this.done = true;
        this.cancelled = true;
    }
}