/*
 * Copyright (C) 2014 Fairphone Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.fairphone.updater.data;

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

import java.util.HashMap;
import java.util.Map;

public abstract class DownloadableItem
{
    private static final String TAG = DownloadableItem.class.getSimpleName();

    public static final String DEFAULT_NOTES_LANG = "en";

    private String mId;

    protected String mName;

    private String mOTADownloadLink;

    private String mOTAMd5Sum;

    protected String mBuildNumber;
    
    private final Map<String, String> mReleaseNotesMap;

    private String mReleaseDate;

    private String mThumbnailImageLink;

    DownloadableItem()
    {
        mId = "";
        mName = "";
        mOTADownloadLink = "";
        mOTAMd5Sum = "";
        mBuildNumber = "";
        mReleaseDate = "";
        mThumbnailImageLink = "";

        mReleaseNotesMap = new HashMap<>();
    }

    DownloadableItem(DownloadableItem other)
    {
        mId = other.mId;
        mName = other.mName;
        mOTADownloadLink = other.mOTADownloadLink;
        mOTAMd5Sum = other.mOTAMd5Sum;
        mBuildNumber = other.mBuildNumber;
        mReleaseDate = other.mReleaseDate;
        mThumbnailImageLink = other.mThumbnailImageLink;

        mReleaseNotesMap = other.mReleaseNotesMap;
    }

    public String getId()
    {
        return mId;
    }

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

    public String getName()
    {
        return mName;
    }

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

    public String getDownloadLink()
    {
        return mOTADownloadLink;
    }

    public void setDownloadLink(String mDownloadLink)
    {
        this.mOTADownloadLink = mDownloadLink;
    }

    public String getMd5Sum()
    {
        return mOTAMd5Sum;
    }

    public void setMd5Sum(String mMd5Sum)
    {
        this.mOTAMd5Sum = mMd5Sum;
    }

    public boolean isNewerVersionThan(DownloadableItem item)
    {

        boolean result = false;

        if (item != null)
        {
            result = !this.mId.equals(item.mId);
        }
        else
        {
            Log.e(TAG, "Invalid Number for Version");
        }

        return result;
    }

    public void setBuildNumber(String buildNumber)
    {
        mBuildNumber = buildNumber;
    }

    public String getBuildNumber()
    {
        return mBuildNumber;
    }

    public void setReleaseDate(String releaseDate)
    {
        mReleaseDate = releaseDate;
    }

    public void setThumbnailLink(String thumbnailImageLink)
    {
        mThumbnailImageLink = thumbnailImageLink;
    }

    public String getThumbnailLink()
    {
        return mThumbnailImageLink;
    }

    public void setReleaseNotes(String language, String releaseNotes)
    {
        mReleaseNotesMap.put(language.toLowerCase(), releaseNotes);
    }

    public String getReleaseNotes(String language)
    {
        String releaseNotes = "";

        if (mReleaseNotesMap.containsKey(language))
        {
            releaseNotes = mReleaseNotesMap.get(language);
        }
        else if (mReleaseNotesMap.containsKey(DEFAULT_NOTES_LANG))
        {
            releaseNotes = mReleaseNotesMap.get(DEFAULT_NOTES_LANG);
        }
        return TextUtils.isEmpty(releaseNotes) ? "" : releaseNotes;
    }

// --Commented out by Inspection START (09/02/2015 19:48):
//    Map<String, String> getReleaseNotes()
//    {
//        return mReleaseNotesMap;
//    }
// --Commented out by Inspection STOP (09/02/2015 19:48)

// --Commented out by Inspection START (06/02/2015 12:36):
//    void resetReleaseNotes()
//    {
//        mReleaseNotesMap.clear();
//    }
// --Commented out by Inspection STOP (06/02/2015 12:36)
}
