ReservationRoomManager.java

package sk.iway.iwcm.components.reservation;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import sk.iway.iwcm.Logger;
import sk.iway.iwcm.Tools;

/**
 * ReservationRoomManager.java
 *
 * @Title webjet7
 * @Company Interway s.r.o. (www.interway.sk)
 * @Copyright Interway s.r.o. (c) 2001-2014
 * @author $Author: jeeff mkolejak $
 * @version $Revision: 1.3 $
 * @created Date: 6.11.2014 18:20:23
 * @modified $Date: 2004/08/16 06:26:11 $
 */
public class ReservationRoomManager
{
	private int posun = 2;

	/**
	 * Zoznam obsadenosti: datum rezervacie, obsadenost/max obsadenost (
	 * occupancy/max reservation), objekt rezervacie, pozicia dna a pozicia
	 * objektu rezervacie
	 *
	 * @param data
	 * @param datesBetween
	 * @param reservationObjectList
	 * @return
	 * @throws ParseException
	 */
	public String[][] getArrayFromHashPovodne(Map<String, Integer> data, List<Date> datesBetween,
				List<ReservationObjectBean> reservationObjectList) throws ParseException
	{
		String[][] str = null;
		Object[] keys = data.keySet().toArray();
		Object[] values = data.values().toArray();
		str = new String[keys.length][values.length];
		for (int i = 0; i < keys.length; i++)
		{
			String key = (String) keys[i];
			String[] keyArray = key.split("-");
			// reservationDatum-reservationObjectId-maxReservations
			String datumReservation = keyArray[0];
			String reservationObjectId = keyArray[1];
			String maxReservations = keyArray[2];
			Integer occupancy = (Integer) values[i];
			DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
			String datumReservationBezMena = datumReservation.substring(datumReservation.indexOf(".") + 1);
			Date datumReservationDate = dateFormat.parse(datumReservationBezMena);
			int dayPosition = getDatePosition(datesBetween, datumReservationDate);
			int roomPosition = getRoomPosition(reservationObjectList, Integer.valueOf(reservationObjectId));
			str[i][0] = datumReservation;
			str[i][1] = occupancy + "/" + maxReservations;
			str[i][2] = reservationObjectId;
			str[i][3] = String.valueOf(dayPosition);
			str[i][4] = String.valueOf(roomPosition);
		}
		return str;
	}

	/**
	 * Zoznam obsadenosti: datum rezervacie, obsadenost/max obsadenost (
	 * occupancy/max reservation), objekt rezervacie, pozicia dna, pozicia
	 * objektu rezervacie, pozicia mena objektu rezervacie
	 *
	 * @param data
	 * @return
	 * @throws ParseException
	 */
	public String[][] getOccupancyArrayFromHash(Map<String, Integer> data, List<Date> datesBetween,
				List<ReservationObjectBean> reservationObjectList) throws ParseException
	{
		Object[] keys = data.keySet().toArray();
		Object[] values = data.values().toArray();
		int numberOfRow = reservationObjectList.size() + reservationObjectList.size() + 1;
		if (1 == numberOfRow)
		{
			numberOfRow = 0;
		}
		int dates = datesBetween.size();
		String[][] str = new String[numberOfRow][dates];
		for (int k = 1, j = 0; k < numberOfRow; k += 2, j++)
		{
			int room = getMaxReservationPosition(reservationObjectList, j);
			ReservationObjectBean reservationObject = reservationObjectList.get(j);
			String name = reservationObject.getName();
			for (int i = 0; i < datesBetween.size(); i++)
			{
				str[k - 1][0] = name;
				str[k][i] = "0/" + room;
			}
		}
		for (int i = 0; i < keys.length; i++)
		{
			String key = (String) keys[i];
			String[] keyArray = key.split("-");
			// datumReservation-reservationObjectId-maxReservations
			String datumReservation = keyArray[0];
			String reservationObjectId = keyArray[1];
			String maxReservations = keyArray[2];
			Integer occupancy = (Integer) values[i];
			DateFormat dateFormat = new SimpleDateFormat("dd.MM.yyyy");
			String datumReservationBezMena = datumReservation.substring(datumReservation.indexOf(".") + 1);
			Date datumReservationDate = dateFormat.parse(datumReservationBezMena);
			int dayPosition = getDatePosition(datesBetween, datumReservationDate);
			int roomPosition = getRoomPosition(reservationObjectList, Integer.valueOf(reservationObjectId));
			str[roomPosition][dayPosition] = occupancy + "/" + maxReservations;
		}
		return str;
	}

	/**
	 * Pozicia datumu v tabulke rezervacii
	 *
	 * @param datesBetween
	 * @param datumReservation
	 * @return
	 */
	private int getDatePosition(List<Date> datesBetween, Date datumReservation)
	{
		int ret = 0;
		for (int i = 0; i < datesBetween.size(); i++)
		{
			Date actualDate = datesBetween.get(i);
			if (actualDate.equals(datumReservation))
			{
				ret = i;
				break;
			}
		}
		return ret;
	}

	/**
	 * Pozicia izby ( jej obsadenosti ) v tabulke rezervacii
	 *
	 * @param reservationObjectList
	 * @param reservationObjectId
	 * @return
	 */
	public int getRoomPosition(List<ReservationObjectBean> reservationObjectList, int reservationObjectId)
	{
		int ret = 0;
		for (int i = 0, k = 1; i < reservationObjectList.size(); i++, k += 2)
		{
			ReservationObjectBean reservationObject = reservationObjectList.get(i);
			int resObjId = reservationObject.getReservationObjectId();
			if (reservationObjectId == resObjId)
			{
				ret = k;
				break;
			}
		}
		return ret;
	}

	/**
	 * Pozicia max reservation v tabulke rezervacii
	 *
	 * @param reservationObjectList
	 * @param reservationObjectId
	 * @return
	 */
	public int getMaxReservationPosition(List<ReservationObjectBean> reservationObjectList, int reservationObjectOrder)
	{
		int ret = 0;
		for (int i = 0; i < reservationObjectList.size(); i++)
		{
			if (reservationObjectOrder == i)
			{
				ReservationObjectBean reservation = reservationObjectList.get(i);
				ret = reservation.getMaxReservations();
				break;
			}
		}
		return ret;
	}

	/**
	 * Naplni zoznam dni do tabulky
	 *
	 * @param data
	 * @return
	 */
	public String[][] getDaysArrayFromList(List<String> data)
	{
		String[][] str = null;
		Object[] values = data.toArray();
		str = new String[values.length][7];
		for (int i = 0; i < values.length; i++)
		{
			String value = (String) values[i];
			String[] keyArray = value.split("\\.");
			// nazovDna.den.mesiac.rok
			String denNazov = keyArray[0];
			String den = keyArray[1];
			String mesiac = keyArray[2];
			String rok = keyArray[3];
			String mesiacNazovIn = keyArray[4];
			str[i][0] = denNazov;
			str[i][1] = den;
			str[i][2] = mesiac;
			str[i][3] = rok;
			str[i][4] = mesiacNazovIn;
			str[i][5] = value;
			str[i][6] = "" + i;
		}
		return str;
	}

	/**
	 * List obsadenosti pre vsetky dni medzi datumami Zatial iba pre jeden
	 * rezervacny objekt
	 *
	 * @param occupancyMap
	 * @param datumBetweenStringListForDay
	 * @return
	 */
	public List<String> getListOccupancyWithDatum(Map<String, Integer> occupancyMap,
				List<String> datumBetweenStringListForDay, String rezobjid)
	{
		List<String> retOccupancyList = new ArrayList<>();
		// iba obsadene dni
		List<String> occupancyList = getListOccupancyForOccupedDays(occupancyMap);
		String emptyOccupancy = "";
		String del = "-";
		ReservationObjectBean resObj = ReservationManager.getReservationObject(Integer.valueOf(rezobjid));
		int maxReservations = resObj.getMaxReservations();
		String occupancyRatioEmpty = "0/" + maxReservations;
		emptyOccupancy = rezobjid + del + occupancyRatioEmpty;
		// najskor kazdy den z rozsahu naplnim '0/maxReservation'
		for (int i = 0; i < datumBetweenStringListForDay.size(); i++)
		{
			String day = datumBetweenStringListForDay.get(i);
			retOccupancyList.add(i, day + del + emptyOccupancy);
		}
		// neskor ich prechadzam a ak nejaky den ma nenulovu obsadenost prepisem
		// ho
		for (int k = 0; k < datumBetweenStringListForDay.size(); k++)
		{
			String dayFull = datumBetweenStringListForDay.get(k);
			String[] dayArray = dayFull.split("-");
			String day = dayArray[0];
			for (int m = 0; m < occupancyList.size(); m++)
			{
				String occupancy2 = occupancyList.get(m);
				String[] occupancySplits2 = occupancy2.split(del);
				String occupancyDay2 = occupancySplits2[0];
				String occupancyObjectId = occupancySplits2[1];
				String occupancy = occupancySplits2[2];
				if (day.equals(occupancyDay2))
				{
					String ocup = dayFull + del + occupancyObjectId + del + occupancy;
					retOccupancyList.set(k, ocup);
				}
			}
		}
		return retOccupancyList;
	}

	/**
	 * List obsadenosti, iba pre dni, ked su izby obsadene aspon jednym
	 * zakaznikom
	 *
	 * <pre>
	 * Format:
	 * datumReservation-reservationObjectId-occupancy/maxReservations
	 *
	 * Št.06.11.2014.okt-42-Studio-1/4
	 * Št.17.11.2014.okt-42-Studio-3/4
	 * </pre>
	 *
	 * @param occupancyMap
	 * @return
	 */
	private List<String> getListOccupancyForOccupedDays(Map<String, Integer> occupancyMap)
	{
		Iterator<String> keySetIterator = occupancyMap.keySet().iterator();
		List<String> retList = new ArrayList<>();
		while (keySetIterator.hasNext())
		{
			String keyPovod = keySetIterator.next();
			String value = String.valueOf(occupancyMap.get(keyPovod));
			String maxReservations = keyPovod.substring(keyPovod.lastIndexOf("-") + 1);
			String key = keyPovod.substring(0, keyPovod.lastIndexOf("-") + 1);
			key = key + value;
			retList.add(key + "/" + maxReservations);
		}
		return retList;
	}

	public String[][] getArrayOccupancyWithDatum(Map<String, Integer> occupancyMap, List<String> datumBetweenStringListForDay,
				String rezobjid)
	{
		List<String> occupancyWithDatum = getListOccupancyWithDatum(occupancyMap, datumBetweenStringListForDay, rezobjid);
		// datumReservation-positionColumn/positionRow-reservationObjectId-occupancy/maxReservations
		String[][] occupancy = null;
		Object[] values = occupancyWithDatum.toArray();
		occupancy = new String[12][8];
		// skratene nazvy dni v tyzdni
		for (int i = 0; i < values.length; i++)
		{
			// Po.03.11.2014.nov-1/1-43-0/4
			// datum
			String value = (String) values[i];
			String[] keyArray = value.split("-");
			String datumFull = keyArray[0];
			String[] datumArray = datumFull.split("\\.");
			String den = datumArray[1];

			// position
			String position = keyArray[1];
			String[] positionArray = position.split("\\/");
			String positionColumn = positionArray[0];
			int column = Integer.parseInt(positionColumn);
			String positionRow = positionArray[1];

			int row = Integer.valueOf(positionRow) + posun;
			// occupancy
			String occup = keyArray[3];
			int percentageOccupancy = getOccupancyPercentage(occup);
			String occupancyTitle = getOccupancyTitle(occup);
			String out = den + "-" + occupancyTitle + "-" + percentageOccupancy + "-" + datumArray[1]+"."+datumArray[2]+"."+datumArray[3];
			Logger.debug(ReservationRoomManager.class, "" + row + "/" + column + ":" + out);
			occupancy[row][column] = out;
		}

		//odstran prazdne riadky
		List<String[]> occupancyList = new ArrayList<>();
		for (int i=0; i<occupancy.length; i++)
		{
			boolean isNotEmpty = false;
			//System.out.print(i+": ");
			for (int j=0; j<occupancy[i].length; j++)
			{
				//System.out.print(occupancy[i][j]+";");
				if (Tools.isNotEmpty(occupancy[i][j])) isNotEmpty = true;
			}
			//System.out.println("");

			if (isNotEmpty)
			{
				occupancyList.add(occupancy[i]);
			}
		}

		occupancy = new String[occupancyList.size()][8];
		for (int i=0; i<occupancyList.size(); i++)
		{
			for (int j=0; j<8; j++)
			{
				String[] row = occupancyList.get(i);
				occupancy[i][j] = row[j];
			}
		}

		return occupancy;
	}

	private int getOccupancyPercentage(String ratioOccupancy)
	{
		int ret = 100;
		String[] ratioArray = ratioOccupancy.split("\\/");
		String occupiedRooms = ratioArray[0];
		String numberAllRooms = ratioArray[1];
		double occupiedRoomsInt = Double.parseDouble(occupiedRooms);
		double numberAllRoomsInt = Double.parseDouble(numberAllRooms);
		double ratio = occupiedRoomsInt / numberAllRoomsInt;
		int percentage = (int) (ratio * 30d);
		int obsadene = percentage;
		// vsade ratam obsadene izby a zobrazujem volne
		ret = 30 - obsadene;
		return ret;
	}

	private String getOccupancyTitle(String ratioOccupancy)
	{
		String ret = "";
		String[] ratioArray = ratioOccupancy.split("\\/");
		String occupiedRooms = ratioArray[0];
		String numberAllRooms = ratioArray[1];
		int occupiedRoomsInt = Integer.parseInt(occupiedRooms);
		int numberAllRoomsInt = Integer.parseInt(numberAllRooms);
		// vsade ratam obsadene izby a zobrazujem volne
		int freeRooms = numberAllRoomsInt - occupiedRoomsInt;
		ret = freeRooms + " z " + numberAllRooms;
		return ret;
	}
}