package com.xloong.library.bluesocket.message;

import android.os.Environment;
import android.os.Parcel;

import com.xloong.library.bluesocket.utils.TypeUtils;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import static android.os.Environment.DIRECTORY_PICTURES;

/**
 * Created by xubingbing on 2017/8/10.
 */

public class ImageMessage implements IMessage<File> {

    private File mContent;
    private String mExtend;
    private long mLength;
    private byte mType = TYPE_BYTE;

    public ImageMessage() {

    }

    @Override
    public byte getType() {
        return mType;
    }

    @Override
    public void setType(byte type) {
        mType = type;
    }

    @Override
    public long getLength() {
        return mLength;
    }

    @Override
    public void setLength(long length) {
        mLength = length;
    }

    @Override
    public File getContent() {
        return mContent;
    }

    @Override
    public void setExtend(String extend) {
        mExtend = extend;
    }


    @Override
    public void setContent(File content, String extend) {
        mContent = content;
        mExtend = extend;
        try {
            FileInputStream fio = new FileInputStream(mContent);
            mLength = fio.available();
            fio.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    @Override
    public void parseContent(InputStream inputStream) throws IOException {
        mContent = new File(Environment.getExternalStoragePublicDirectory(DIRECTORY_PICTURES), mExtend);

        if (!mContent.getParentFile().exists()) {
            mContent.getParentFile().mkdirs();
        }
        if (mContent.exists()) {
            mContent.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(mContent);


        long tempLength = 0;
        byte[] buffer = null;
        while (tempLength < mLength) {
            if (mLength - tempLength < (1024 * 64)) {
                buffer = new byte[(int) (mLength - tempLength)];
            } else {
                if (buffer == null)
                    buffer = new byte[1024 * 64];
            }
            int readLength = inputStream.read(buffer, 0, buffer.length);
            fos.write(buffer, 0, readLength);
            tempLength += readLength;
        }

        fos.close();
    }


    @Override
    public void writeContent(OutputStream outputStream) throws IOException {
        outputStream.write(creatHeader());
        outputStream.write(0xA);
        outputStream.write(0xD);

        FileInputStream fio = new FileInputStream(mContent);


        byte[] buffer = new byte[64 * 1024];
        int length = 0;
        while ((length = fio.read(buffer)) >= 0) {
            outputStream.write(buffer, 0, length);
            outputStream.flush();
        }

    }

    @Override
    public byte[] creatHeader() {
        byte[] extend = mExtend.getBytes();
        byte[] length = TypeUtils.longToBytes(getLength());
        byte[] header = new byte[10 + extend.length];
        header[0] = HEADER;                                         //魔数
        header[1] = getType();                                     //类型
        System.arraycopy(length, 0, header, 2, length.length);     //长度
        System.arraycopy(extend, 0, header, 10, extend.length);     //扩展信息
        return header;
    }

    @Override
    public int describeContents() {
        return 0;
    }

    @Override
    public void writeToParcel(Parcel dest, int flags) {
        dest.writeString(this.mContent.getAbsolutePath());
        dest.writeString(this.mExtend);
        dest.writeLong(this.mLength);
        dest.writeByte(this.mType);
    }

    protected ImageMessage(Parcel in) {
        this.mContent = new File(in.readString());
        this.mExtend = in.readString();
        this.mLength = in.readLong();
        this.mType = in.readByte();
    }

    public static final Creator<ImageMessage> CREATOR = new Creator<ImageMessage>() {
        @Override
        public ImageMessage createFromParcel(Parcel source) {
            return new ImageMessage(source);
        }

        @Override
        public ImageMessage[] newArray(int size) {
            return new ImageMessage[size];
        }
    };

    @Override
    public String toString() {
        return "ImageMessage{" +
                "mContent=" + mContent +
                ", mExtend='" + mExtend + '\'' +
                ", mLength=" + mLength +
                ", mType=" + mType +
                '}';
    }
}