package fr.umlv.designpattern.account;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;

public class LoadFile {
	private final FileReader frAccount;
	private final FileReader frRecords;
	
	private BufferedReader buf;
	private BufferedReader bufRecord;
	private final HashMap<Long, AccountDetails> map = new HashMap<>();


	public LoadFile(String fileAccount, String fileRecord) throws FileNotFoundException{
		this.frAccount = new FileReader(fileAccount);
		this.buf = new BufferedReader(frAccount);
		
		this.frRecords = new FileReader(fileRecord);
		this.bufRecord = new BufferedReader(frRecords);
	}

	public void readFile() throws IOException {
		String line = null;
		int i = 0;
		while((line = buf.readLine()) != null){
			String[] lineSplit = line.split(" ");
			AccountDetails ad = new AccountDetails(Long.parseLong(lineSplit[0]), Long.parseLong(lineSplit[3]), lineSplit[1], lineSplit[2]);
			map.put(Long.parseLong(lineSplit[0]), ad);
		}
	}

	public void readRecord() throws IOException{
	  ArrayList<Record> rs = loadRecords();
		for(Record r: rs) {
			fixBalance(r);
			fixBalance2(r);
		}
	}
	
	public void fixBalance(Record r){
		AccountDetails ad;
		if(((ad = map.get(r.getAccountReceiver())) != null)){
			ad.setBalance(ad.getBalance() + r.getSumTransfer());
			ad.addRecord(r);
		}
	}
	
	public void fixBalance2(Record r){
    AccountDetails ad;
    if(((ad = map.get(r.getAccountSender())) != null)){
      ad.setBalance(ad.getBalance() - r.getSumTransfer());
      ad.addRecord(r);
    }
  }
	
	public ArrayList<Record> loadRecords() throws IOException {
	  ArrayList<Record> records = new ArrayList<>();
	  String s;
	  while((s = bufRecord.readLine()) != null) {
	    String[] split = s.split(" ");
      Record record = new Record(Long.parseLong(split[2]), Long.parseLong(split[0]), Long.parseLong(split[1]));
      records.add(record);
	  }
	  return records;
	}
	
	public void display() {
	  for(AccountDetails a: map.values()) {
	    System.out.println(a.getFirstName() + " " + a.getLastName() + " XXXX");
	    for(Record r: a.getListOfLastRecords()) {
	      AccountDetails as = map.get(r.getAccountSender());
	      AccountDetails ar = map.get(r.getAccountReceiver());
	      System.out.println(as.getFirstName() + " " + as.getLastName() +
	          " ---> " + r.getSumTransfer() +
	          " ---> " + ar.getFirstName() + " " + ar.getLastName());
	    }
	  }
	}
	
	public static void main(String[] args) {
		if(args.length < 1){
			System.out.println("Usage : <files>");
			return;
		}

		try {
			LoadFile l = new LoadFile(args[0], args[1]);
			l.readFile();
			l.readRecord();
			l.display();
		} catch (IOException e) {
		}
	}
}
