package org.wocommunity.movies.model.migration;

import com.webobjects.eoaccess.EOAdaptorChannel;
import com.webobjects.eoaccess.EOModel;
import com.webobjects.eocontrol.EOEditingContext;
import com.webobjects.foundation.NSArray;

import er.extensions.jdbc.ERXJDBCUtilities;
import er.extensions.migration.ERXMigrationDatabase;
import er.extensions.migration.ERXMigrationTable;
import er.extensions.migration.ERXModelVersion;

public class Movies0 extends ERXMigrationDatabase.Migration {
	@Override
	public NSArray<ERXModelVersion> modelDependencies() {
		return null;
	}

	@Override
	public void downgrade(EOEditingContext editingContext,
			ERXMigrationDatabase database) throws Throwable {
		// DO NOTHING
	}

	@Override
	public void upgrade(EOEditingContext editingContext,
			ERXMigrationDatabase database) throws Throwable {

		ERXMigrationTable movieRoleTable = database.newTableNamed("movierole");
		movieRoleTable.newIntegerColumn("MOVIE_ID", false);
		movieRoleTable.newStringColumn("ROLE_NAME", 50, true);
		movieRoleTable.newIntegerColumn("TALENT_ID", false);
		movieRoleTable.create();
		movieRoleTable.setPrimaryKey("TALENT_ID", "MOVIE_ID");

		ERXMigrationTable directorTable = database.newTableNamed("director");
		directorTable.newIntegerColumn("MOVIE_ID", false);
		directorTable.newIntegerColumn("TALENT_ID", false);
		directorTable.create();
		directorTable.setPrimaryKey("TALENT_ID", "MOVIE_ID");

		ERXMigrationTable reviewTable = database.newTableNamed("review");
		reviewTable.newIntegerColumn("MOVIE_ID", false);
		reviewTable.newStringColumn("REVIEW", true);
		reviewTable.newStringColumn("REVIEWER", 50, true);
		reviewTable.newIntegerColumn("REVIEW_ID", false);
		reviewTable.create();
		reviewTable.setPrimaryKey("REVIEW_ID");

		ERXMigrationTable talentTable = database.newTableNamed("talent");
		talentTable.newStringColumn("FIRST_NAME", 50, false);
		talentTable.newStringColumn("LAST_NAME", 50, false);
		talentTable.newIntegerColumn("TALENT_ID", false);
		talentTable.create();
		talentTable.setPrimaryKey("TALENT_ID");

		ERXMigrationTable talentPhotoTable = database
				.newTableNamed("talentphoto");
		talentPhotoTable.newBlobColumn("PHOTO", true);
		talentPhotoTable.newIntegerColumn("TALENT_ID", false);
		talentPhotoTable.create();
		talentPhotoTable.setPrimaryKey("TALENT_ID");

		ERXMigrationTable movieTable = database.newTableNamed("movie");
		movieTable.newStringColumn("CATEGORY", 50, true);
		movieTable.newTimestampColumn("DATE_RELEASED", true);
		movieTable.newIntegerColumn("MOVIE_ID", false);
		movieTable.newStringColumn("POSTER_NAME", 255, true);
		movieTable.newStringColumn("RATED", 10, true);
		movieTable.newBigDecimalColumn("REVENUE", 38, 4, true);
		movieTable.newIntegerColumn("STUDIO_ID", false);
		movieTable.newStringColumn("TITLE", 255, false);
		movieTable.newStringColumn("TRAILER_NAME", 255, true);
		movieTable.create();
		movieTable.setPrimaryKey("MOVIE_ID");

		ERXMigrationTable votingTable = database.newTableNamed("voting");
		votingTable.newIntegerColumn("MOVIE_ID", false);
		votingTable.newIntegerColumn("NUMBER_OF_VOTES", true);
		votingTable.newDoubleColumn("RUNNING_AVERAGE", 20, 9, true);
		votingTable.create();
		votingTable.setPrimaryKey("MOVIE_ID");

		ERXMigrationTable studioTable = database.newTableNamed("studio");
		studioTable.newBigDecimalColumn("BUDGET", 38, 4, false);
		studioTable.newStringColumn("NAME", 50, false);
		studioTable.newIntegerColumn("STUDIO_ID", false);
		studioTable.create();
		studioTable.setPrimaryKey("STUDIO_ID");

		ERXMigrationTable plotSummaryTable = database
				.newTableNamed("plotsummary");
		plotSummaryTable.newIntegerColumn("MOVIE_ID", 9, false);
		plotSummaryTable.newStringColumn("SUMMARY", true);
		plotSummaryTable.create();
		plotSummaryTable.setPrimaryKey("MOVIE_ID");

		movieRoleTable.addForeignKey("MOVIE_ID", "movie", "MOVIE_ID");
		movieRoleTable.addForeignKey("TALENT_ID", "talent", "TALENT_ID");
		directorTable.addForeignKey("MOVIE_ID", "movie", "MOVIE_ID");
		directorTable.addForeignKey("TALENT_ID", "talent", "TALENT_ID");
		reviewTable.addForeignKey("MOVIE_ID", "movie", "MOVIE_ID");
		talentTable.addForeignKey("TALENT_ID", "talentphoto", "TALENT_ID");
		talentPhotoTable.addForeignKey("TALENT_ID", "talent", "TALENT_ID");
		movieTable.addForeignKey("MOVIE_ID", "plotsummary", "MOVIE_ID");
		movieTable.addForeignKey("STUDIO_ID", "studio", "STUDIO_ID");
		movieTable.addForeignKey("MOVIE_ID", "voting", "MOVIE_ID");
		votingTable.addForeignKey("MOVIE_ID", "movie", "MOVIE_ID");
		plotSummaryTable.addForeignKey("MOVIE_ID", "movie", "MOVIE_ID");

		ERXJDBCUtilities.executeUpdateScriptFromResourceNamed(database
				.adaptorChannel(), "Movies0-"
				+ ERXJDBCUtilities.databaseProductName(database
						.adaptorChannel()) + ".sql", "MoviesBusinessLogic");

	}
}