/*
 * Copyright (C) 2011 The Android Open Source 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.android.exchange.provider;

import com.android.emailcommon.provider.EmailContent;
import com.android.emailcommon.provider.EmailContent.Account;
import com.android.emailcommon.provider.EmailContent.Mailbox;
import com.android.emailcommon.provider.EmailContent.Message;

import android.content.Context;

/**
 * Simplified EmailContent class setup (condensed from ProviderTestUtils in com.android.email)
 */
public class EmailContentSetupUtils {

    /**
     * No constructor - statics only
     */
    private EmailContentSetupUtils() {
    }

    /**
     * Create an account for test purposes
     */
    public static Account setupAccount(String name, boolean saveIt, Context context) {
        Account account = new Account();

        account.mDisplayName = name;
        account.mEmailAddress = name + "@android.com";
        account.mProtocolVersion = "2.5" + name;
        if (saveIt) {
            account.save(context);
        }
        return account;
    }

    /**
     * Create a mailbox for test purposes
     */
    public static Mailbox setupMailbox(String name, long accountId, boolean saveIt,
            Context context) {
        return setupMailbox(name, accountId, saveIt, context, Mailbox.TYPE_MAIL, null);
    }

    public static Mailbox setupMailbox(String name, long accountId, boolean saveIt,
            Context context, int type) {
        return setupMailbox(name, accountId, saveIt, context, type, null);
    }

    public static Mailbox setupMailbox(String name, long accountId, boolean saveIt,
            Context context, int type, Mailbox parentBox) {
        Mailbox box = new Mailbox();

        box.mDisplayName = name;
        box.mAccountKey = accountId;
        box.mSyncKey = "sync-key-" + name;
        box.mSyncLookback = 2;
        box.mSyncInterval = EmailContent.Account.CHECK_INTERVAL_NEVER;
        box.mType = type;
        box.mServerId = "serverid-" + name;
        box.mParentServerId = parentBox != null ? parentBox.mServerId : "parent-serverid-" + name;

        if (saveIt) {
            box.save(context);
        }
        return box;
    }

    /**
     * Create a message for test purposes
     */
    public static Message setupMessage(String name, long accountId, long mailboxId,
            boolean addBody, boolean saveIt, Context context) {
        // Default starred, read,  (backword compatibility)
        return setupMessage(name, accountId, mailboxId, addBody, saveIt, context, true, true);
    }

    /**
     * Create a message for test purposes
     */
    public static Message setupMessage(String name, long accountId, long mailboxId,
            boolean addBody, boolean saveIt, Context context, boolean starred, boolean read) {
        Message message = new Message();

        message.mDisplayName = name;
        message.mMailboxKey = mailboxId;
        message.mAccountKey = accountId;
        message.mFlagRead = read;
        message.mFlagLoaded = Message.FLAG_LOADED_UNLOADED;
        message.mFlagFavorite = starred;
        message.mServerId = "serverid " + name;

        if (addBody) {
            message.mText = "body text " + name;
            message.mHtml = "body html " + name;
        }

        if (saveIt) {
            message.save(context);
        }
        return message;
    }
}
