/* ScummVM - Graphic Adventure Engine
 *
 * ScummVM is the legal property of its developers, whose names
 * are too numerous to list here. Please refer to the COPYRIGHT
 * file distributed with this source distribution.
 *
 * Additional copyright for this file:
 * Copyright (C) 1995-1997 Presto Studios, Inc.
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
 *
 */

#include "pegasus/pegasus.h"
#include "pegasus/ai/ai_area.h"
#include "pegasus/items/biochips/opticalchip.h"

namespace Pegasus {

OpticalChip *g_opticalChip = 0;

OpticalChip::OpticalChip(const ItemID id, const NeighborhoodID neighborhood, const RoomID room, const DirectionConstant direction) :
		BiochipItem(id, neighborhood, room, direction), _ariesHotspot(kAriesSpotID), _mercuryHotspot(kMercurySpotID),
		_poseidonHotspot(kPoseidonSpotID) {
	_ariesHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 60, kAIMiddleAreaTop + 27, kAIMiddleAreaLeft + 60 + 121, kAIMiddleAreaTop + 27 + 20));
	_ariesHotspot.setHotspotFlags(kOpticalBiochipSpotFlag);
	g_allHotspots.push_back(&_ariesHotspot);

	_mercuryHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 60, kAIMiddleAreaTop + 47, kAIMiddleAreaLeft + 60 + 121, kAIMiddleAreaTop + 47 + 20));
	_mercuryHotspot.setHotspotFlags(kOpticalBiochipSpotFlag);
	g_allHotspots.push_back(&_mercuryHotspot);

	_poseidonHotspot.setArea(Common::Rect(kAIMiddleAreaLeft + 60, kAIMiddleAreaTop + 67, kAIMiddleAreaLeft + 60 + 121, kAIMiddleAreaTop + 67 + 20));
	_poseidonHotspot.setHotspotFlags(kOpticalBiochipSpotFlag);
	g_allHotspots.push_back(&_poseidonHotspot);

	setItemState(kOptical000);

	g_opticalChip = this;
}

OpticalChip::~OpticalChip() {
	g_allHotspots.removeOneHotspot(kAriesSpotID);
	g_allHotspots.removeOneHotspot(kMercurySpotID);
	g_allHotspots.removeOneHotspot(kPoseidonSpotID);
}

void OpticalChip::writeToStream(Common::WriteStream *stream) {
	BiochipItem::writeToStream(stream);
	_opticalFlags.writeToStream(stream);
}

void OpticalChip::readFromStream(Common::ReadStream *stream) {
	BiochipItem::readFromStream(stream);
	_opticalFlags.readFromStream(stream);
}

void OpticalChip::addAries() {
	_opticalFlags.setFlag(kOpticalAriesExposed, true);
	setUpOpticalChip();
}

void OpticalChip::addMercury() {
	_opticalFlags.setFlag(kOpticalMercuryExposed, true);
	setUpOpticalChip();
}

void OpticalChip::addPoseidon() {
	_opticalFlags.setFlag(kOpticalPoseidonExposed, true);
	setUpOpticalChip();
}

void OpticalChip::setUpOpticalChip() {
	if (_opticalFlags.getFlag(kOpticalAriesExposed)) {
		if (_opticalFlags.getFlag(kOpticalMercuryExposed)) {
			if (_opticalFlags.getFlag(kOpticalPoseidonExposed))
				setItemState(kOptical111);
			else
				setItemState(kOptical011);
		} else {
			if (_opticalFlags.getFlag(kOpticalPoseidonExposed))
				setItemState(kOptical101);
			else
				setItemState(kOptical001);
		}
	} else {
		if (_opticalFlags.getFlag(kOpticalMercuryExposed)) {
			if (_opticalFlags.getFlag(kOpticalPoseidonExposed))
				setItemState(kOptical110);
			else
				setItemState(kOptical010);
		} else {
			if (_opticalFlags.getFlag(kOpticalPoseidonExposed))
				setItemState(kOptical100);
			else
				setItemState(kOptical000);
		}
	}
}

void OpticalChip::activateOpticalHotspots() {
	if (_opticalFlags.getFlag(kOpticalAriesExposed))
		_ariesHotspot.setActive();
	if (_opticalFlags.getFlag(kOpticalMercuryExposed))
		_mercuryHotspot.setActive();
	if (_opticalFlags.getFlag(kOpticalPoseidonExposed))
		_poseidonHotspot.setActive();
}

void OpticalChip::clickInOpticalHotspot(HotSpotID id) {
	playOpMemMovie(id);
}

void OpticalChip::playOpMemMovie(HotSpotID id) {
	Common::String movieName;
	switch (id) {
	case kAriesSpotID:
		movieName = "Images/AI/Globals/OMAI";
		break;
	case kMercurySpotID:
		movieName = "Images/AI/Globals/OMMI";
		break;
	case kPoseidonSpotID:
		movieName = "Images/AI/Globals/OMPI";
		break;
	}

	ItemState state = getItemState(), newState;
	switch (state) {
	case kOptical001:
		newState = kOptical002;
		break;
	case kOptical010:
		newState = kOptical020;
		break;
	case kOptical011:
		if (id == kAriesSpotID)
			newState = kOptical012;
		else
			newState = kOptical021;
		break;
	case kOptical100:
		newState = kOptical200;
		break;
	case kOptical101:
		if (id == kAriesSpotID)
			newState = kOptical102;
		else
			newState = kOptical201;
		break;
	case kOptical110:
		if (id == kMercurySpotID)
			newState = kOptical120;
		else
			newState = kOptical210;
		break;
	case kOptical111:
		if (id == kAriesSpotID)
			newState = kOptical112;
		else if (id == kMercurySpotID)
			newState = kOptical121;
		else
			newState = kOptical211;
		break;
	case kOptical000: // Can never happen.
	default:
		error("Invalid optical chip state");
	}

	setItemState(newState);

	if (g_AIArea)
		g_AIArea->playAIMovie(kRightAreaSignature, movieName, false, kOpticalInterruption);

	setItemState(state);
}

} // End of namespace Pegasus