package org.flashtool.parsers.simpleusblogger;

import java.io.File;
import java.util.Iterator;
import java.util.Vector;

import org.flashtool.gui.models.TableLine;
import org.flashtool.libusb.LibUsbException;
import org.flashtool.parsers.sin.SinFile;
import org.flashtool.parsers.ta.TAUnit;
import org.flashtool.system.DeviceEntry;
import org.flashtool.system.Devices;
import org.flashtool.system.OS;
import org.flashtool.system.TextFile;
import org.flashtool.util.BytesUtil;
import org.flashtool.util.HexDump;

import lombok.extern.slf4j.Slf4j;

@Slf4j
public class Session {

	private Vector<S1Packet> packets = new Vector<S1Packet>();
	private Vector<FlashCommand> commands = new Vector<FlashCommand>();
	private String readUnit="";
	private String model="";
	private String version="";

	public void addCommand(FlashCommand c) {
		commands.add(c);
		if (c.getCommand().startsWith("Read-TA")) {
			if (c.getUnit()==2210) model=new String(c.getReply());
			if (c.getUnit()==2202) {
				try {
				version = new String(c.getReply()).split("_")[1];
				} catch (ArrayIndexOutOfBoundsException npe1 ) {
					version = new String(c.getReply());	
				}
			}
		}
	}

	public void addPacket(S1Packet p) {
		if (p.getCommandName().equals("readTA")) {
			if (p.getDirection().equals("WRITE"))
				readUnit = Integer.toString(BytesUtil.getInt(p.data));
			else {
				if (readUnit.equals("2210")) {
					model = new String(p.data);
				}
				if (readUnit.equals("2206")) {
					version = new String(p.data).split("_")[1];
				}
				}
		}
		if (p.getCommandName().equals("closeTA") && packets.get(packets.size()-1).getCommandName().equals("openTA")) {
			packets.remove(packets.size()-1);
		}
		else if (!p.getCommandName().equals("readTA") && !p.getCommandName().equals("Get Error"))
			packets.add(p);
	}

	public String getModel() {
		return model;
	}

	public String getVersion() {
		return version;
	}

	public Iterator<S1Packet> getPackets() {
		return packets.iterator();
	}

	public String saveScript() {
		try {
			DeviceEntry ent = Devices.getDeviceFromVariant(model);
			
			String folder = "";
			
			if (ent!=null)
				folder = ent.getMyDeviceDir();
			else
				folder = OS.getFolderFirmwaresScript();
			
			String filename = folder+File.separator+model+(version.length()>0?"_"+version:"")+".fsc";
			TextFile tf = new TextFile(filename,"ISO8859-1");
			
			tf.open(false);
			Iterator<TableLine> i = getScript().iterator();
			while (i.hasNext()) {
				TableLine tl = i.next();
				tf.writeln(tl.getValueOf(0)+(tl.getValueOf(1).length()>0?":":"")+tl.getValueOf(1));
			}
			tf.close();
			return filename;
		} catch (Exception e) {
			e.printStackTrace();
			return "";
		}
	}

	public Vector<TableLine> getScript() {
		Vector<TableLine> v = new Vector<TableLine>();
		if (!packets.isEmpty()) {
			Iterator<S1Packet> i = packets.iterator();
			int count=0;
			boolean start = false;
			while (i.hasNext()) {
				S1Packet p = i.next();
					TableLine tl = new TableLine();
	/*				if (p.getDirection().equals("READ REPLY")) {
						if (p.getCommand()==1) {
							tl.add("readLoaderInfos");
							tl.add("");
							v.add(tl);
						}
					}*/
					if (p.getDirection().equals("WRITE")) {
						if (p.getCommand()==0x0D) {
							if (p.getTA().getUnitNumber()==10100) {
								tl.add("setFlashState");
								tl.add(Integer.toString(BytesUtil.getInt(p.getTA().getUnitData())));
							}
							else if (p.getTA().getUnitNumber()==10021) {
								tl.add("setFlashTimestamp");
								tl.add("");
							}
							else {
								tl.add("writeTA");
								tl.add(Long.toString(p.getTA().getUnitNumber()));
							}
							v.add(tl);
						}
						else {
							tl.add(p.getCommandName());
							if (p.getCommand()==0x05) {
								tl.add(SinFile.getShortName(p.sinname));
							}
							else if (p.getCommand()==0x09)
								tl.add(Integer.toString(BytesUtil.getInt(p.getData())));
							else if (p.getCommand()==0x0C)
								tl.add(HexDump.toHex(p.getData()));
							else if (p.getCommand()==0x19)
								tl.add(HexDump.toHex(p.getData()));
							else tl.add("");
							v.add(tl);
						}
					}
				count++;
			}
		}
		if (!commands.isEmpty()) {
			Iterator<FlashCommand> ic = commands.iterator();
			while (ic.hasNext()) {
				FlashCommand c = ic.next();
				TableLine t1 = new TableLine();
				t1.add(c.getFinalCommand());
				t1.add(c.getParameters());
				v.add(t1);
			}
			
		}
		return v;
	}

}
