package ui;


import com.google.gson.internal.LinkedTreeMap;

import javax.swing.*;
import javax.xml.bind.DatatypeConverter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

/**
 * represents details view with respect to byte array parcel values
 */
public class ParcelByteArrDetails extends JPanel {

    public JScrollPane scrollable;
    public JTextArea byteArray = new JTextArea();
    public JTextField offset = new JTextField();
    public JLabel offsetLabel = new JLabel("offset");
    public JTextField length = new JTextField();
    public JLabel lengthLabel = new JLabel("length");
    public JButton updateButton = new JButton("Update");
    public JPanel inner;

    public ParcelByteArrDetails(LinkedTreeMap map) {
        setLayout(new GridBagLayout());

        setOffset(((Double) map.get("offset")).intValue());
        setLength(((Double) map.get("len")).intValue());
        setByteArray((ArrayList) map.get("array"));
        scrollable = new JScrollPane(byteArray);
        scrollable.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
        scrollable.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);

        byteArray.setLineWrap(true);
        byteArray.setWrapStyleWord(true);

        inner = new JPanel();
        inner.setLayout(new BorderLayout());
        inner.add(scrollable);

        updateButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.out.println(getByteArrayList().toString());
                map.put("offset", getOffset());
                map.put("len", getLength());
                map.put("array", getByteArrayList());
            }
        });

        //building GUI
        GridBagConstraints c = new GridBagConstraints();
        c.gridx = 0;
        c.gridy = 0;
        add(offsetLabel, c);
        c.gridx = 1;
        add(offset, c);
        c.gridx = 3;
        add(lengthLabel);
        c.gridx = 4;
        add(length, c);
        c.gridx = 6;
        c.anchor = GridBagConstraints.LINE_END;
        add(updateButton, c);
        c.anchor = GridBagConstraints.LINE_START;
        c.gridy = 1;
        c.gridx = 0;
        c.weightx = 1;
        c.weighty = 1;
        c.gridwidth = 7;
        c.gridheight = 3;
        c.fill = GridBagConstraints.BOTH;
        add(inner, c);
    }

    public void setOffset(int offset) {
        this.offset.setText(Integer.toString(offset));
    }

    public double getOffset(){
        return Double.parseDouble(this.offset.getText());
    }

    public void setLength(int length) {
        this.length.setText(Integer.toString(length));
    }

    public double getLength(){
        return Double.parseDouble(this.length.getText());
    }

    public void setByteArray(ArrayList byteArray) {
        StringBuilder builder = new StringBuilder();
        if (byteArray != null) {
            for (Object element : byteArray){
                builder.append(String.format("%02X ", ((Double) element).byteValue()));
                builder.append(" ");
            }
        }
        this.byteArray.setText(builder.toString());
    }

    public ArrayList getByteArrayList(){
        String hexStr = this.byteArray.getText().replace(" ", "");
        byte[] bytes = DatatypeConverter.parseHexBinary(hexStr);
        ArrayList doubleArrayList = new ArrayList();
        for (byte byteVal : bytes){
            doubleArrayList.add((double) byteVal);
        }
        return doubleArrayList;
    }
}