use strict;

BEGIN {use File::Basename; push @INC, dirname($0); }
require "valve_perl_helpers.pl";

my $dynamic_compile = defined $ENV{"dynamic_shaders"} && $ENV{"dynamic_shaders"} != 0;

# ----------------------------------------------
# COMMAND-LINE ARGS
# ----------------------------------------------
my $g_x360			= 0;
my $g_ps3			= 0;
my $g_tmpfolder	= "";
my $g_vcsext		= ".vcs";
my $g_SrcDir = ".";
my $inputbase;
my $g_SourceDir;

while( 1 )
{
	$inputbase = shift;

	if( $inputbase =~ m/-source/ )
	{
		$g_SourceDir = shift;
	}
	elsif( $inputbase =~ m/-x360/ )
	{
		$g_x360 = 1;
		$g_tmpfolder = "_360";
		$g_vcsext = ".360.vcs";
	}
	elsif( $inputbase =~ m/-ps3/ )
	{
		$g_ps3 = 1;
		$g_tmpfolder = "_ps3";
		$g_vcsext = ".ps3.vcs";
	}
	else
	{
		last;
	}
}

# ----------------------------------------------
# Load the list of shaders that we care about.
# ----------------------------------------------
my @srcfiles = &LoadShaderListFile( $inputbase );

my %incHash;
my %vcsHash;
my $shader;
foreach $shader ( @srcfiles )
{
	my $shadertype = &LoadShaderListFile_GetShaderType( $shader );
	my $shaderbase = &LoadShaderListFile_GetShaderBase( $shader );
	my $shadersrc = &LoadShaderListFile_GetShaderSrc( $shader );
	if( $shadertype eq "fxc" || $shadertype eq "vsh" )
	{
		# We only generate inc files for fxc and vsh files.
		my $incFileName = "$shadertype" . "tmp9" . $g_tmpfolder . "/" . $shaderbase . "\.inc";
		$incFileName =~ tr/A-Z/a-z/;
		$incHash{$incFileName} = 1;
	}

	my $vcsFileName = "$shadertype/$shaderbase" . $g_vcsext;
	$vcsFileName =~ tr/A-Z/a-z/;
	$vcsHash{$vcsFileName} = 1;
}

# ----------------------------------------------
# Get the list of inc files to consider for reverting
# ----------------------------------------------
sub RevertIntegratedFiles
{
	my $path = shift;
	my $fileHashRef = shift;

	my $cmd = "p4 fstat $path";
	my @fstat = &RunCommand( $cmd );

	my $depotFile;
	my $action;
	my @openedforintegrate;

	my $line;
	foreach $line ( @fstat )
	{
		if( $line =~ m,depotFile (.*)\n, )
		{
			$depotFile = &NormalizePerforceFilename( $1 );
		}
		elsif( $line =~ m,action (.*)\n, )
		{
			$action = $1;
		}
		elsif( $line =~ m,^\s*$, )
		{
			if( defined $action && defined $fileHashRef->{$depotFile} && $action =~ m/integrate/i )
			{
				push @openedforintegrate, $depotFile;
			}
			undef $depotFile;
			undef $action;
		}
	}

	if( scalar( @openedforintegrate ) )
	{
		my $cmd = "p4 revert @openedforintegrate";
#		print "$cmd\n";
		my @revertOutput = &RunCommand( $cmd );
		&PrintCleanPerforceOutput( @revertOutput );
	}
}

my $path = "vshtmp9" . $g_tmpfolder . "/... fxctmp9" . $g_tmpfolder . "/...";
&RevertIntegratedFiles( $path, \%incHash );

if( !$dynamic_compile )
{
	&MakeDirHier( "../../../game/platform/shaders" );

	# Might be in a different client for the vcs files, so chdir to the correct place.
	chdir "../../../game/platform/shaders" || die;

	my $path = "...";
	&RevertIntegratedFiles( $path, \%vcsHash );
}