package androdns.android.leetdreams.ch.androdns;

import android.content.Context;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import org.xbill.DNS.InvalidTypeException;
import org.xbill.DNS.Type;

/**
 * Created by gryphius on 30.04.17.
 */

public class HistoryAdapter extends ArrayAdapter<Session> {

    private final Context context;
    private final Session[] values;

    public HistoryAdapter(Context context, Session[] values) {
        super(context, -1, values);
        this.context = context;
        this.values = values;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.sessiondisplay_history, parent, false);


        Session session = values[position];

        TextView dateView = (TextView) rowView.findViewById(R.id.history_entry_date);
        dateView.setText(getDate(session.answer.runtimestamp, "yyyy-MM-dd hh:mm:ss"));

        String qname = session.qname;
        if (!session.server.equals("")){
            qname = qname+"@"+session.server;
        }
        if(!session.isDefaultPort()){
            qname = qname+":"+session.port;
        }

        ((TextView) rowView.findViewById(R.id.history_qname)).setText(qname);

        String type = ""+session.qtype;
        try {
            String txtType = Type.string(session.qtype);
            if (!type.equals(txtType)) {
                type = type + "(" + txtType + ")";
            }
        } catch (InvalidTypeException e) {}
        ((TextView) rowView.findViewById(R.id.history_qtype)).setText(type);

        StringBuffer flagsBuffer = new StringBuffer();

        // add proto to flags view if not DNS
        if (!session.protocol.equalsIgnoreCase("DNS")){
            flagsBuffer.append(session.protocol);
            flagsBuffer.append(" ");
        }

        // add qclass to flags view if not IN
        if (!session.qclass.equalsIgnoreCase("IN")){
            flagsBuffer.append(session.qclass);
            flagsBuffer.append(" ");
        }

        if (session.flag_RD){
            flagsBuffer.append("RD ");
        }
        if (session.flag_CD){
            flagsBuffer.append("CD ");
        }
        if(session.flag_DO){
            flagsBuffer.append("DO ");
        }
        if(session.TCP && session.protocol.equalsIgnoreCase("DNS")){
            flagsBuffer.append("TCP ");
        }

        ((TextView) rowView.findViewById(R.id.history_flags)).setText(flagsBuffer.toString());
        return rowView;
    }

    /**
     * Return date in specified format.
     * @param milliSeconds Date in milliseconds
     * @param dateFormat Date format
     * @return String representing date in specified format
     */
    public static String getDate(long milliSeconds, String dateFormat)
    {
        // Create a DateFormatter object for displaying date in specified format.
        SimpleDateFormat formatter = new SimpleDateFormat(dateFormat);

        // Create a calendar object that will convert the date and time value in milliseconds to date.
        Calendar calendar = Calendar.getInstance();
        calendar.setTimeInMillis(milliSeconds);
        return formatter.format(calendar.getTime());
    }
}