/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
*/

package org.apache.uima.ducc.cli.ws;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.Iterator;
import java.util.List;

import org.apache.uima.ducc.cli.ws.json.NodePidList;
import org.apache.uima.ducc.cli.ws.json.ReservationFacts;
import org.apache.uima.ducc.cli.ws.json.ReservationFactsList;

import com.google.gson.Gson;

public class DuccWebQueryReservations extends DuccWebQuery {

	private DuccWebQueryReservations() {
		super("/ducc-servlet/json-format-reservations");
	}

	private ReservationFactsList get() throws Exception {
		URL url = new URL(getUrlString());
		URLConnection ucon = url.openConnection();
		BufferedReader br = new BufferedReader(new InputStreamReader(ucon.getInputStream()));
		String jSon = br.readLine();
		Gson gson = new Gson();
		ReservationFactsList fl = gson.fromJson(jSon, ReservationFactsList.class);
        br.close();
        return fl;
	}
	
	private String stringify(List<NodePidList> list) {
		StringBuffer sb = new StringBuffer();
		for(NodePidList nodePids : list) {
			String node = nodePids.node;
			StringBuffer pb = new StringBuffer();
			for(String pid : nodePids.pids) {
				if(pb.length() > 0) {
					pb.append(",");
				}
				pb.append(pid);
			}
			String pids = pb.toString();
			if(sb.length() > 0) {
				sb.append(",");
			}
			sb.append(node+"{"+pids+"}");
		}
		return "["+sb.toString()+"]";
	}
	
	private void display(ReservationFactsList fl) {
		if(fl != null) {
			Iterator<ReservationFacts> fIterator = fl.iterator();
			while(fIterator.hasNext()) {
				ReservationFacts f = fIterator.next();
				System.out.println(f.id);
				System.out.println("  "+"start: "+f.start);
				System.out.println("  "+"end: "+ f.end);
				System.out.println("  "+"user: "+ f.user);
				System.out.println("  "+"clas: "+ f.rclass);
				System.out.println("  "+"state: "+ f.state);
				System.out.println("  "+"reason: "+ f.reason);
				System.out.println("  "+"allocation: "+ f.allocation);
				System.out.println("  "+"processes: "+ stringify(f.userProcesses));
				System.out.println("  "+"size: "+ f.size);
				System.out.println("  "+"list: "+ f.list);
				System.out.println("  "+"description: "+ f.description);
			}
		}
		else {
			System.out.println("?");
		}
	}
	
	private void main_instance(String[] args) throws Exception {
		ReservationFactsList fl = get();
		display(fl);
	}
	
	// TODO: Add support for maxRecords=<n> query parameter
	
	public static void main(String[] args) {
		try {
			DuccWebQueryReservations dwq = new DuccWebQueryReservations();
			dwq.main_instance(args);
		}
		catch(Exception e) {
			e.printStackTrace();
		}
	}
}