/*****************************************************************************
 * Copyright (c) 2015 CEA
 *
 *
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/epl-v10.html
 *
 * Contributors:
 *  Francois Le Fevre  francois.le-fevre@cea.fr - Initial API and implementation
 *
 *****************************************************************************/
package org.eclipse.papyrus.sysml14.tools.norm;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;

import org.eclipse.emf.ecore.util.EcoreUtil;

public class RequirementGenerator {

	public static void main(String[] args) {

		FileInputStream fis;
		try {
			fis = new FileInputStream("src/main/resources/req.csv");
			
			//Construct BufferedReader from InputStreamReader
			BufferedReader br = new BufferedReader(new InputStreamReader(fis));
		 
			File autoreq_csv=new File("src/main/resources/autoreq.csv");
			File autoreq_packageElement=new File("src/main/resources/autoreq_packageElement.properties");
			File autoreq_req=new File("src/main/resources/autoreq_requirement.properties");
			BufferedWriter writerCsv = new BufferedWriter(new FileWriter(autoreq_csv));
			BufferedWriter writerPac = new BufferedWriter(new FileWriter(autoreq_packageElement));
			BufferedWriter writerReq = new BufferedWriter(new FileWriter(autoreq_req));
		    
			
			String line = null;
			String id;
			String page;
			while ((line = br.readLine()) != null) {
				
				id = EcoreUtil.generateUUID();
				writerCsv.write (line+"\t"+id);
				page = line.split("\\[")[1].replace("]", "");
				writerPac.write ("<packagedElement xmi:type=\"uml:Class\" xmi:id=\""+id+"\" name=\""+line.split("\\[")[0]+"\"/>\n");
				System.out.println(line);
				writerReq.write ("<Requirements:Requirement xmi:id=\""+EcoreUtil.generateUUID()+"\" text=\""+line.split(" ")[1].split("\\[")[0]+" details here https://hudson.eclipse.org/papyrus/view/Sysml/job/papyrus-sysml-website/ws/site-staging/org.eclipse.papyrus.sysml.core/norm/ptc-13-12-10.pdf#page="+page+"\" id=\""+line.split(" ")[0]+"\" base_Class=\""+id+"\"/>\n");
			}
			
		    //Close writer
			writerCsv.close();
			writerPac.close();
			writerReq.close();
			
		 
			br.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
		
	}

}