/*
* Copyright (C) 2013 Samsung System LSI
* 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.bluetooth.map;

import com.android.bluetooth.DeviceWorkArounds;
import com.android.bluetooth.map.BluetoothMapUtils.TYPE;

import org.xmlpull.v1.XmlSerializer;

import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class BluetoothMapMessageListingElement
        implements Comparable<BluetoothMapMessageListingElement> {

    private static final String TAG = "BluetoothMapMessageListingElement";
    private static final boolean D = false;
    private static final boolean V = false;

    private long mCpHandle = 0; /* The content provider handle - without type information */
    private String mSubject = null;
    private long mDateTime = 0;
    private String mSenderName = null;
    private String mSenderAddressing = null;
    private String mReplytoAddressing = null;
    private String mRecipientName = null;
    private String mRecipientAddressing = null;
    private TYPE mType = null;
    private boolean mMsgTypeAppParamSet = false;
    private int mSize = -1;
    private String mText = null;
    private String mReceptionStatus = null;
    private String mDeliveryStatus = null;
    private int mAttachmentSize = -1;
    private String mPriority = null;
    private boolean mRead = false;
    private String mSent = null;
    private String mProtect = null;
    private String mFolderType = null;
    private String mThreadId = null;
    private String mThreadName = null;
    private String mAttachmentMimeTypes = null;

    private boolean mReportRead = false;
    private int mCursorIndex = 0;

    public int getCursorIndex() {
        return mCursorIndex;
    }

    public void setCursorIndex(int cursorIndex) {
        this.mCursorIndex = cursorIndex;
    }

    public long getHandle() {
        return mCpHandle;
    }

    public void setHandle(long handle) {
        this.mCpHandle = handle;
    }

    public long getDateTime() {
        return mDateTime;
    }

    public String getDateTimeString() {
        /* TODO: if the feature bit mask of the client supports it, add the time-zone
         *       (as for MSETime) */
        SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd'T'HHmmss");
        Date date = new Date(mDateTime);
        return format.format(date); // Format to YYYYMMDDTHHMMSS local time
    }

    public void setDateTime(long dateTime) {
        this.mDateTime = dateTime;
    }

    public String getSubject() {
        return mSubject;
    }

    public void setSubject(String subject) {
        this.mSubject = subject;
    }

    public String getSenderName() {
        return mSenderName;
    }

    public void setSenderName(String senderName) {
        this.mSenderName = senderName;
    }

    public String getSenderAddressing() {
        return mSenderAddressing;
    }

    public void setSenderAddressing(String senderAddressing) {
        this.mSenderAddressing = senderAddressing;
    }

    public String getReplyToAddressing() {
        return mReplytoAddressing;
    }

    public void setReplytoAddressing(String replytoAddressing) {
        this.mReplytoAddressing = replytoAddressing;
    }

    public String getRecipientName() {
        return mRecipientName;
    }

    public void setRecipientName(String recipientName) {
        this.mRecipientName = recipientName;
    }

    public String getRecipientAddressing() {
        return mRecipientAddressing;
    }

    public void setRecipientAddressing(String recipientAddressing) {
        this.mRecipientAddressing = recipientAddressing;
    }

    public TYPE getType() {
        return mType;
    }

    public void setType(TYPE type, boolean appParamSet) {
        this.mMsgTypeAppParamSet = appParamSet;
        this.mType = type;
    }

    public int getSize() {
        return mSize;
    }

    public void setSize(int size) {
        this.mSize = size;
    }

    public String getText() {
        return mText;
    }

    public void setText(String text) {
        this.mText = text;
    }

    public String getReceptionStatus() {
        return mReceptionStatus;
    }

    public void setReceptionStatus(String receptionStatus) {
        this.mReceptionStatus = receptionStatus;
    }

    public String getDeliveryStatus() {
        return mDeliveryStatus;
    }

    public void setDeliveryStatus(String deliveryStatus) {
        this.mDeliveryStatus = deliveryStatus;
    }

    public int getAttachmentSize() {
        return mAttachmentSize;
    }

    public void setAttachmentSize(int attachmentSize) {
        this.mAttachmentSize = attachmentSize;
    }

    public String getAttachmentMimeTypes() {
        return mAttachmentMimeTypes;
    }

    public void setAttachmentMimeTypes(String attachmentMimeTypes) {
        this.mAttachmentMimeTypes = attachmentMimeTypes;
    }

    public String getPriority() {
        return mPriority;
    }

    public void setPriority(String priority) {
        this.mPriority = priority;
    }

    public String getRead() {
        return (mRead ? "yes" : "no");
    }

    public boolean getReadBool() {
        return mRead;
    }

    public void setRead(boolean read, boolean reportRead) {
        this.mRead = read;
        this.mReportRead = reportRead;
    }

    public String getSent() {
        return mSent;
    }

    public void setSent(String sent) {
        this.mSent = sent;
    }

    public String getProtect() {
        return mProtect;
    }

    public void setProtect(String protect) {
        this.mProtect = protect;
    }

    public void setThreadId(long threadId, TYPE type) {
        if (threadId != -1) {
            this.mThreadId = BluetoothMapUtils.getMapConvoHandle(threadId, type);
        }
    }

    public String getThreadName() {
        return mThreadName;
    }

    public void setThreadName(String name) {
        this.mThreadName = name;
    }

    public String getFolderType() {
        return mFolderType;
    }

    public void setFolderType(String folderType) {
        this.mFolderType = folderType;
    }

    @Override
    public int compareTo(BluetoothMapMessageListingElement e) {
        if (this.mDateTime < e.mDateTime) {
            return 1;
        } else if (this.mDateTime > e.mDateTime) {
            return -1;
        } else {
            return 0;
        }
    }

    /* Encode the MapMessageListingElement into the StringBuilder reference.
     * */
    public void encode(XmlSerializer xmlMsgElement, boolean includeThreadId)
            throws IllegalArgumentException, IllegalStateException, IOException {
        // contruct the XML tag for a single msg in the msglisting
        xmlMsgElement.startTag(null, "msg");
        xmlMsgElement.attribute(null, "handle", BluetoothMapUtils.getMapHandle(mCpHandle, mType));
        if (mSubject != null) {
            String stripped = BluetoothMapUtils.stripInvalidChars(mSubject);

            if (DeviceWorkArounds.addressStartsWith(BluetoothMapService
                    .getRemoteDevice().getAddress(), DeviceWorkArounds
                    .MERCEDES_BENZ_CARKIT)) {
                stripped = stripped.replaceAll("[\\P{ASCII}&\"><]", "");
                if (stripped.isEmpty()) {
                    stripped = "---";
                }
            }

            xmlMsgElement.attribute(null, "subject",
                    stripped.substring(0, stripped.length() < 256 ? stripped.length() : 256));
        }

        if (mDateTime != 0) {
            xmlMsgElement.attribute(null, "datetime", this.getDateTimeString());
        }
        if (mSenderName != null) {
            xmlMsgElement.attribute(null, "sender_name",
                    BluetoothMapUtils.stripInvalidChars(mSenderName));
        }
        if (mSenderAddressing != null) {
            xmlMsgElement.attribute(null, "sender_addressing", mSenderAddressing);
        }
        if (mReplytoAddressing != null) {
            xmlMsgElement.attribute(null, "replyto_addressing", mReplytoAddressing);
        }
        if (mRecipientName != null) {
            xmlMsgElement.attribute(null, "recipient_name",
                    BluetoothMapUtils.stripInvalidChars(mRecipientName));
        }
        if (mRecipientAddressing != null) {
            xmlMsgElement.attribute(null, "recipient_addressing", mRecipientAddressing);
        }
            /* Avoid NPE for possible "null" value of mType */
        if (mMsgTypeAppParamSet && mType != null) {
            xmlMsgElement.attribute(null, "type", mType.name());
        }
        if (mSize != -1) {
            xmlMsgElement.attribute(null, "size", Integer.toString(mSize));
        }
        if (mText != null) {
            xmlMsgElement.attribute(null, "text", mText);
        }
        if (mReceptionStatus != null) {
            xmlMsgElement.attribute(null, "reception_status", mReceptionStatus);
        }
        if (mDeliveryStatus != null) {
            xmlMsgElement.attribute(null, "delivery_status", mDeliveryStatus);
        }
        if (mAttachmentSize != -1) {
            xmlMsgElement.attribute(null, "attachment_size", Integer.toString(mAttachmentSize));
        }
        if (mAttachmentMimeTypes != null) {
            xmlMsgElement.attribute(null, "attachment_mime_types", mAttachmentMimeTypes);
        }
        if (mPriority != null) {
            xmlMsgElement.attribute(null, "priority", mPriority);
        }
        if (mReportRead) {
            xmlMsgElement.attribute(null, "read", getRead());
        }
        if (mSent != null) {
            xmlMsgElement.attribute(null, "sent", mSent);
        }
        if (mProtect != null) {
            xmlMsgElement.attribute(null, "protected", mProtect);
        }
        if (mThreadId != null && includeThreadId) {
            xmlMsgElement.attribute(null, "conversation_id", mThreadId);
        }
        if (mThreadName != null && includeThreadId) {
            xmlMsgElement.attribute(null, "conversation_name", mThreadName);
        }
        if (mFolderType != null) {
            xmlMsgElement.attribute(null, "folder_type", mFolderType);
        }
        xmlMsgElement.endTag(null, "msg");

    }
}


