package etienned.lecteuropus;

import android.content.Context;
import android.content.res.XmlResourceParser;
import android.util.Log;

import org.xmlpull.v1.XmlPullParser;

import java.io.Serializable;
import java.util.Arrays;
import java.util.Calendar;

/**
 * Created by etienned on 12/28/16.
 */
public class Contract implements Serializable {
    private boolean m_Subscription;
    private boolean m_Valid;
    private int m_nbTicket;
    private int m_operatorId;
    private String m_operatorName;
    private int m_logoId;
    private Calendar m_ValidityDate;

    public Contract(byte[] subscriptionData, byte[] ticketData){ // OPUS
        m_operatorId = Utils.bytesToInt(subscriptionData, 9, 8);
        if(Utils.bytesToInt(subscriptionData, 40, 16) == 0){
            // Ticket
            m_Subscription = false;
            m_nbTicket = Utils.bytesToInt(ticketData, 16, 8);
            m_Valid = (m_nbTicket > 0);
        }
        else{
            // Subscription
            m_Subscription = true;
            Calendar today = Calendar.getInstance();
            int days = Utils.bytesToInt(subscriptionData, 47, 14);
            m_ValidityDate = Utils.intToDateTime(days, 0);
            m_Valid = (m_ValidityDate.compareTo(today) > 0);
        }
    }

    public Contract(byte[] page3, byte[] page4, byte[] page5, byte[] page10) { // Mifare
        m_nbTicket = 0;
        m_Subscription = false;
        m_operatorId = Utils.bytesToInt(page5, 18, 8);
        if (Arrays.equals(page3, Utils.HexStringToByteArray("00000000"))) {
            // Carte neuve
            m_nbTicket = page10[2] & 0x80 >> 7 |
                    (page10[1] & 0x0F) << 1;
            if ((Arrays.equals(page4, Utils.HexStringToByteArray("00010001")))
                    &&  m_nbTicket != 0) {
                m_nbTicket -= 1;
            }
            m_Valid = true;
        }
        else if (Arrays.equals(page3, Utils.HexStringToByteArray("80000000"))){
            // Subscription
            m_Subscription = true; // TODO : Find validity Date in Mifare
            m_Valid = false;

        }
        else{
            // Card used
            m_Valid = true;
            while(Utils.bytesToInt(page3,31 - m_nbTicket, 1) == 0){
                m_nbTicket += 1;
            }
        }
    }

    public boolean isValid() {
        return m_Valid;
    }

    public void setLogoFromXml(Context ctx){
        String node = "";
        String logo = "";
        m_operatorName = "";
        XmlResourceParser operatorXml = ctx.getResources().getXml(R.xml.operators);
        try {
            int event = operatorXml.getEventType();
            outerloop:
            while (event != XmlPullParser.END_DOCUMENT){
                switch (event) {
                    case XmlPullParser.START_TAG:
                        node = operatorXml.getName();
                        if(node.equals("operator")) {
                            if (operatorXml.getAttributeValue(null, "id").equals("" + m_operatorId)) {
                                logo = operatorXml.getAttributeValue(null, "logo");
                                m_operatorName = operatorXml.getAttributeValue(null, "name");
                                break outerloop;
                            }
                        }
                        break;
                }
                event = operatorXml.next();
            }
        } catch (Exception e) {
            Log.e("CardActivity", "Error parsing stations XML file: " + e.getMessage());
        }

        m_logoId = 0;
        if (!logo.equals("")){
            m_logoId = ctx.getResources().getIdentifier(logo, "drawable", ctx.getPackageName());
        }
    }

    public int getNbTicket() {
        return m_nbTicket;
    }

    public int getOperatorId(){
        return m_operatorId;
    }

    public boolean isSubscription() {
        return m_Subscription;
    }

    public Calendar getValidityDate() {
        return m_ValidityDate;
    }

    public int getLogoId() {
        return m_logoId;
    }

    public String getOperatorName() {
        return m_operatorName;
    }
}