/*******************************************************************************
 * Copyright (c) 2014, 2016 Orange.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *******************************************************************************/
package org.eclipse.om2m.sdt.home.smartercoffee;

import java.util.List;

import org.eclipse.om2m.sdt.Domain;
import org.eclipse.om2m.sdt.datapoints.BooleanDataPoint;
import org.eclipse.om2m.sdt.datapoints.IntegerDataPoint;
import org.eclipse.om2m.sdt.datapoints.StringDataPoint;
import org.eclipse.om2m.sdt.exceptions.AccessException;
import org.eclipse.om2m.sdt.exceptions.DataPointException;
import org.eclipse.om2m.sdt.home.devices.CoffeeMachine;
import org.eclipse.om2m.sdt.home.driver.Utils;
import org.eclipse.om2m.sdt.home.modules.BinarySwitch;
import org.eclipse.om2m.sdt.home.modules.Brewing;
import org.eclipse.om2m.sdt.home.modules.FaultDetection;
import org.eclipse.om2m.sdt.home.modules.Grinder;
import org.eclipse.om2m.sdt.home.modules.KeepWarm;
import org.eclipse.om2m.sdt.home.smartercoffee.communication.SmarterCoffeeCommands;
import org.eclipse.om2m.sdt.home.smartercoffee.communication.SmarterCoffeeCommunication;
import org.eclipse.om2m.sdt.home.types.DatapointType;
import org.eclipse.om2m.sdt.home.types.LiquidLevel;
import org.eclipse.om2m.sdt.home.types.TasteStrength;
import org.osgi.framework.BundleContext;
import org.osgi.framework.ServiceRegistration;

@SuppressWarnings({ "rawtypes" })
public class SmarterCoffeeMachine extends CoffeeMachine{
	
	private List<ServiceRegistration> registrations;
	private Domain domain; 
	private String serial = "SmarterCoffee";
	private String IP;
	private int port;
	private SmarterCoffeeCommunication smarterCoffee;
	
	private IntegerDataPoint cupsNumber;
	private BooleanDataPoint keepWarm;
	private TasteStrength strength;
	private IntegerDataPoint status;
	
	public SmarterCoffeeMachine(String id, Domain domain, String ip , int port) {
		super(id, id, domain);
		this.domain = domain;
		this.serial = id;
		this.IP = ip;
		this.port = port;
		
		this.smarterCoffee = new SmarterCoffeeCommunication(ip, port);
		
		setProperties();
		
		try {
			addFaultDetection();
		} catch (Exception e) {
			Activator.logger.warning("Error addFaultDetection", e);
		}
		try {
			addBrewing();
		} catch (Exception e) {
			Activator.logger.warning("Error addBrewing", e);
		}
		try {
			addGrinder();
		} catch (Exception e) {
			Activator.logger.warning("Error addGrinder", e);
		}
		try {
			addWaterStatus();
		} catch (Exception e) {
			Activator.logger.warning("Error addWaterStatus", e);
		}
		try {
			addBrewingSwitch();
		} catch (Exception e) {
			Activator.logger.warning("Error addBrewingSwitch", e);
		}
		try {
			addKeepWarm();
		} catch (Exception e) {
			Activator.logger.warning("Error addKeepWarm", e);
		}
				
		setDeviceManufacturer("Smarter");
		setDeviceModelName("IKTSMC10EUFR");
		setDeviceName("Smarter coffee machine");
	}
	
	public void register(BundleContext context) {
		registrations = Utils.register(this, context);
	}

	void unregister() {
		for (ServiceRegistration reg : registrations) {
			reg.unregister();
		}
		domain.removeDevice(getName());
	}
	
	private void addFaultDetection() {
		FaultDetection faultDetection = new FaultDetection("FaultDetection_" + getId(), domain,
			new BooleanDataPoint(DatapointType.status) {
				@Override
				public Boolean doGetValue() throws DataPointException {
					smarterCoffee.getStatus();
					return smarterCoffee.getFaultDetection(); 
				}
			});
		faultDetection.setCode(new IntegerDataPoint(DatapointType.code) {
			@Override
			protected Integer doGetValue() throws DataPointException {
				return smarterCoffee.getCode();
			}	
		});
		faultDetection.setDescription(new StringDataPoint(DatapointType.description) {
			@Override
			protected String doGetValue() throws DataPointException {
				return smarterCoffee.getDescription();
			}
		});
		
		addModule(faultDetection);
	}
	
	private void addBrewing(){
		Activator.logger.info("add Brewing starting");
		Brewing brewing = new Brewing("Brewing_" + getId(), domain, 
			new IntegerDataPoint(DatapointType.cupsNumber) {
				int cupNumber = 0;
				@Override
				protected Integer doGetValue() throws DataPointException {
					return cupNumber;
				}
				@Override
				protected void doSetValue(Integer value) throws DataPointException {
					cupNumber = value;
					smarterCoffee.setNumberOfCups(value);
				}
			},  
			new TasteStrength() {
				TasteStrength.Values strength = TasteStrength.Values.zero;
				@Override
				protected TasteStrength.Values doGetValue() throws DataPointException {
					return strength;
				}
				@Override
				protected void doSetValue(TasteStrength.Values value) throws DataPointException {
					strength = value;
					if (value.ordinal() >= TasteStrength.Values.zero.ordinal() 
							&& value.ordinal() < TasteStrength.Values.medium.ordinal()) {
						smarterCoffee.setBrewStrength(SmarterCoffeeCommands.BREW_STRENGTH_0);
					}
					else if (value == TasteStrength.Values.medium) {
						smarterCoffee.setBrewStrength(SmarterCoffeeCommands.BREW_STRENGTH_1);
					}
					else if (value.ordinal() > TasteStrength.Values.medium.ordinal() 
							&& value.ordinal() <= TasteStrength.Values.maximum.ordinal()) {
						smarterCoffee.setBrewStrength(SmarterCoffeeCommands.BREW_STRENGTH_2);
					}
				}
		});
		
		addModule(brewing);
	}
	
	public void addBrewingSwitch(){
		BinarySwitch brewingSwitch = new BinarySwitch(IP, domain, 
			new BooleanDataPoint(DatapointType.powerState) {
				@Override
				protected Boolean doGetValue() throws DataPointException {
					smarterCoffee.getStatus();
					return (smarterCoffee.getCoffeeReadyStatus() == 1);
				}
				@Override
				protected void doSetValue(Boolean value) throws DataPointException {
					if (value) {
						try {
							System.out.println("start brewing swtich");
							smarterCoffee.start(getGrinder().getUseGrinder(), 
									getBrewing().getCupsNumber(), 
									getBrewing().getStrength().ordinal(), 
									getKeepWarm().getPowerState());//tu się powinno pojawić getKeepWarm();
							//smarterCoffee.start(true, 1, getBrewing().getStrength(), false);
						} catch (AccessException e) {
							throw new DataPointException(e.getMessage());
						}
					} else {
						smarterCoffee.stop();
					}
				}
			});
		
		addModule(brewingSwitch);
	}
	
	private void addGrinder(){
		Activator.logger.info("add Grinder starting");
		Grinder grinder = new Grinder("Grinder_" + getId(), domain, 
			new BooleanDataPoint(DatapointType.useGrinder) {
				boolean useGrinder = false;
				@Override
				protected Boolean doGetValue() throws DataPointException {
					return useGrinder;
				}
				
				@Override
				protected void doSetValue(Boolean value) throws DataPointException {
					useGrinder = value.booleanValue();
				}
			}, 
			new IntegerDataPoint(DatapointType.coarseness) {
				@Override
				protected Integer doGetValue() throws DataPointException {
					// set and get coarsenes of beans is NOT POSSIBLE through API in SmarterCoffee (is's setted via physical potentiometer on the device)
					return null;
				}
			});
	
		addModule(grinder);
	}
	
	private void addWaterStatus(){
		Activator.logger.info("add WaterStatus starting");
		org.eclipse.om2m.sdt.home.modules.LiquidLevel waterStatus = new org.eclipse.om2m.sdt.home.modules.LiquidLevel("waterStatus", 
			domain, 
			new LiquidLevel(DatapointType.water) {
				@Override
				protected LiquidLevel.Values doGetValue() throws DataPointException {
					smarterCoffee.getStatus();
					return smarterCoffee.getWaterStatus();
				}
			});
		addModule(waterStatus);
	}
	
	private void addKeepWarm(){
		KeepWarm keepWarm = new KeepWarm(name, domain, 
			new BooleanDataPoint(DatapointType.powerState) {
				@Override
				protected Boolean doGetValue() throws DataPointException {
					return smarterCoffee.getKeepWarmStatus();
				}
				protected void doSetValue(Boolean value) {
					if (value)
						smarterCoffee.setHotPlateOn(5); // argument is a mintues user want to use hot plate
					else 
						smarterCoffee.setHotPlateOff();
				}
			});
		addModule(keepWarm);
	}
	
	public void setProperties(){
		
	}
	
}

