package org.gcube.dataanalysis.dataminer.poolmanager.ansible;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
***REMOVED***
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
***REMOVED***
import java.util.Scanner;
***REMOVED***

import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Inventory;
import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Playbook;
import org.gcube.dataanalysis.dataminer.poolmanager.ansible.model.Role;
import org.gcube.dataanalysis.dataminer.poolmanager.ansiblebridge.AnsibleSerializeHelper;
***REMOVED***
import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.AlgorithmSet;
import org.gcube.dataanalysis.dataminer.poolmanager.datamodel.Dependency;
***REMOVED***
***REMOVED***
import org.tmatesoft.svn.core.SVNURL;
import org.tmatesoft.svn.core.auth.ISVNAuthenticationManager;
import org.tmatesoft.svn.core.internal.wc.SVNFileUtil;
import org.tmatesoft.svn.core.internal.wc.admin.SVNChecksumInputStream;
import org.tmatesoft.svn.core.io.ISVNEditor;
import org.tmatesoft.svn.core.io.SVNRepository;
import org.tmatesoft.svn.core.io.SVNRepositoryFactory;
import org.tmatesoft.svn.core.io.diff.SVNDeltaGenerator;
import org.tmatesoft.svn.core.wc.SVNWCUtil;

/**
 * This class is responsible for the interface with ansible, retrieving log,
 * etc. etc. It's not supposed to access templates and static stuff files. It
 * does not know the service datamodel.
 * 
 * @author paolo
 * 
 */
public class AnsibleWorker ***REMOVED***
  
  /**
   * The name of the inventory 
   */
  private static String INVENTORY_NAME = "inventory.yaml";
  
  /**
   * The directory containing roles
   */
  private static String ROLES_DIR = "roles";

  /**
   * The name of the playbook
   */
  private static String PLAYBOOK_NAME = "playbook.yaml";

  /**
   * The root of the worker. This corresponds to a standard ansible working dir.
   */
  private File workerRoot;

  public AnsibleWorker(File root) ***REMOVED***
    this.workerRoot = root;
    this.ensureWorkStructure();
  ***REMOVED***

  public File getWorkdir() ***REMOVED***
    return this.workerRoot;
  ***REMOVED***

  public File getRolesDir() ***REMOVED***
    return new File(this.getWorkdir(), ROLES_DIR);
  ***REMOVED***

  public String getWorkerId() ***REMOVED***
    return this.workerRoot.getName();
  ***REMOVED***

  public void ensureWorkStructure() ***REMOVED***
    ***REMOVED*** generate root
    this.getWorkdir().mkdirs();
  ***REMOVED***

  public void removeWorkStructure() ***REMOVED***
    ***REMOVED*** remove the working dir
    this.getWorkdir().delete();
  ***REMOVED***

  public File getPlaybookFile() ***REMOVED***
    return new File(this.getWorkdir(), PLAYBOOK_NAME);
  ***REMOVED***

  public File getInventoryFile() ***REMOVED***
    return new File(this.getWorkdir(), INVENTORY_NAME);
  ***REMOVED***


  public void setInventory(Inventory inventory) throws IOException ***REMOVED***
    ***REMOVED*** serialize the string to the 'inventory' file
    AnsibleSerializeHelper.serialize(inventory, this.getInventoryFile());
  ***REMOVED***

  public void setPlaybook(Playbook playbook) throws IOException ***REMOVED***
    ***REMOVED*** serialize the string to the 'playbook' file
    AnsibleSerializeHelper.serialize(playbook, this.getPlaybookFile());
  ***REMOVED***

  public void addRole(Role r) throws IOException ***REMOVED***
    ***REMOVED*** Serialize role in the workdir
    AnsibleSerializeHelper.serializeRole(r, this.getRolesDir());
  ***REMOVED***


	public int execute(PrintStream ps)
			throws IOException, InterruptedException, SVNException ***REMOVED***

		System.out.println(this.getWorkdir());
		try ***REMOVED***
			Process p = Runtime.getRuntime().exec("ansible-playbook -v -i " + this.getInventoryFile().getAbsolutePath()
					+ " " + this.getPlaybookFile().getAbsolutePath());

			inheritIO(p.getInputStream(), ps);
			inheritIO(p.getErrorStream(), ps);

***REMOVED***			writer.println(this.getStatus(p.waitFor()));
***REMOVED***			writer.close();

			return p.waitFor();

	***REMOVED*** catch (IOException e) ***REMOVED***
			e.printStackTrace();
	***REMOVED***

		return -1;
***REMOVED***

  private static void inheritIO(final InputStream src, final PrintStream dest) ***REMOVED***
	    new Thread(new Runnable() ***REMOVED***
	        public void run() ***REMOVED***
	            Scanner sc = new Scanner(src);
	            while (sc.hasNextLine()) ***REMOVED***
	                dest.println(sc.nextLine());
	            ***REMOVED***
	        ***REMOVED***
	    ***REMOVED***).start();
***REMOVED***
  
  /**
   * Destroy the worker: 
   * - remove the working dir
   */
  public void destroy() ***REMOVED***
    this.removeWorkStructure();
  ***REMOVED***
  
***REMOVED***
