#!/usr/bin/perl

BEGIN {
#use lib 'd:/Programs/Perl/lib';
#use lib '/home/tkamiya/bin/lib';
my $BaseDir = $ENV{'TkPerlDir'};
#print "\nBaseDir: $BaseDir\n";
@INC = ("$BaseDir/lib", "$BaseDir/VNL", "d:/Programs/Perl/lib", @INC);
}

use strict;
#use warnings;
use File::Path;
use File::Basename;
use File::Find;

use Deps;
use Utils;
use JFile;

use MyApplication;
use Sci qw($pi);

use Crystal::CIF;
use Crystal::Crystal;
use Crystal::LD;

#===============================================
# デバッグ関係変数
#===============================================
#$PrintLevelが大きいほど、情報が詳しくなる
my $PrintLevel = 0;

#===============================================
# 文字コード関係変数
#===============================================
# sjis, euc, jis, noconv
my $PrintCharCode      = Deps::PrintCharCode();
my $OSCharCode         = Deps::OSCharCode();
my $FileSystemCharCode = Deps::FileSystemCharCode();

my $DirSep    = Deps::DirSep();
my $RegDirSep = Deps::RegDirSep();

#===============================================
# Applicationオブジェクト作成
#===============================================
my $App = new MyApplication;
exit if($App->Initialize() < 0);

#$App->SetLF("<br>\n");
#$App->SetPrintCharCode("sjis");
#$App->SetDebug($Debug);
$App->SetDeleteHTMLFlag(1);

#===============================================
# スクリプト大域変数
#===============================================
my $InitialDirectory = Deps::GetWorkingDirectory();
my %ParamHash;

#==========================================
# コマンドラインオプション読み込み
#==========================================
$App->AddArgument("--Action",    "--Action=[MakeInput]", '');
$App->AddArgument("--Function",  "--Function=[Energy|Permit|WMin|xLSQ|Phonon]", 'Energy');
$App->AddArgument("--EWALD",     "--EWALD=0.4 [def: 0.4]",  0.4);
$App->AddArgument("--EPS",       "--EPS=val [def: 1.0e-5]", 1.0e-5);
$App->AddArgument("--DebugMode", "--DebugMode: Set DebugMode", '');
exit 1 if($App->ReadArgs(1, "sjis", 0) != 1);
my $Args = $App->Args();
#my $form = new CGI;
#$Args->SetCGIForm($form);
#$Args->parseInput($WebCharCode);

my %ArgHash = $Args->GetArgHash();
foreach my $key (keys %ArgHash) {
#print "key: $key: $ArgHash{$key}\n";
	if($key =~ /^Param:(.*?)$/i) {
		$ParamHash{$1} = $ArgHash{$key};
#print "$1:  $ArgHash{$key}\n";
	}
}
$App->{pParamHash} = \%ParamHash;

#==========================================
# メイン関数スタート
#==========================================

#Utils::InitHTML("Research", $WebCharSet, "_self");

my $Debug = $Args->GetGetArg("DebugMode");
$App->SetDebug($Debug);
my $Action = $Args->GetGetArg("Action");

my $ret = 0;
if($Action =~ /MakeInput/i) {
	&MakeInput();
}
elsif($Action =~ /AddSummaryCSV/i) {
	&AddSummaryCSV();
}
else {
	$App->print("Error: Invalid Action: [$Action]\n");
	print "Usage:\n";
	print "  perl Madel.pl --Action=MakeInput CIF_File\n";
	print "  perl Madel.pl --Action=AddSummaryCSV Summary_File\n";
}

#Utils::EndHTML();

exit $ret;

#===============================================
# スクリプト終了
#===============================================

#==========================================
# &Subroutines
#==========================================
sub AddSummaryCSV
{
	my $OutputFile = $Args->GetGetArg(0);
	my $CSVFile    = $Args->GetGetArg(1);
	$App->print("<H2>Add summary of [$OutputFile] to [$CSVFile].</H2>\n");
	
	my $in  = JFile->new($OutputFile, 'r') or die "$!: Can not read [$OutputFile].\n";
	my $out = JFile->new($CSVFile, 'a')    or die "$!: Can not write to [$CSVFile].\n";

	$in->SkipTo("<<TITLE>>");
	my $title    = Utils::DelSpace($in->ReadLine());
	my $line     = $in->SkipTo("asymmetric unit");
	my ($nSite)  = ($line =~ /asymmetric unit>>\s*(\d+)/);
print "nSite=$nSite\n";

	my $line     = $in->SkipTo("EWALD Parameter");
	my ($EWALD)  = ($line =~ /EWALD PARAMETER >>\s*([+\-\.eEdD\d]+)/);
print "EWALD=$EWALD\n";
	$line        = $in->SkipTo("CEPS");
	my ($EPS)   = ($line =~ /CEPS >>\s*([+\-\.eEdD\d]+)/);
print "EPS=$EPS\n";
	$out->print("Title: $title\n");
	$out->print("  nSite: $nSite\n");
	$out->print("  EWALD parameter: $EWALD\n");
	$out->print("  EPS            : $EPS\n");

	$in->SkipTo("<<ENERGY CALCULATION>>");
	$line        = $in->ReadLine();
	for(my $i = 0 ; $i < $nSite ; $i++) {
		$line     = $in->SkipTo("No\\.");
		$out->print("  ", $line);
		$line     = $in->SkipTo("Madelung");
		my ($MP)  = ($line =~ /Madelung potential:\s*([+\-\.eEdD\d]+)/);
		$out->print("    MP: $MP eV\n");
	}
	$out->print("\n");
	$out->Close();
	$in->Close();

	$App->print("<H2>Add summary: finished</H2>\n");
}

sub MakeInput
{
	$App->print("<H2>Make LD files.</H2>\n");

	my $Function = $Args->GetGetArg("Function");
	my $EWALD    = $Args->GetGetArg("EWALD");
	$EWALD = 0.4 if($EWALD eq '');
	my $EPS      = $Args->GetGetArg("EPS");
	$EPS = 1.0e-5 if($EPS eq '');

	my $CIFFile = $Args->GetGetArg(0);
	my @filenames = fileparse($CIFFile, "\.[^\.]+");
	my $fname     = $filenames[0];

	$App->print("<b>Function      :</b> $Function\n");
	$App->print("<b>CIFFile       :</b> $CIFFile\n");
	$App->print("<b>EWALD prameter:</b> $EWALD\n");
	$App->print("<b>EPS           :</b> $EPS\n");

	my $CIF = new CIF();
	unless($CIF->Read($CIFFile)) {
		$App->print("  Error: Can not read [$CIFFile].\n\n");
		return -1;
	}
	my $Crystal = $CIF->GetCCrystal();

	my $LD = new LD();
	$LD->SetSampleName($fname);
	if($LD->MakeLDFiles($Crystal, $Function, $fname, undef, $EWALD, $EPS) <= 0) {
		$App->print("Error in Research.pl::MakeLDFile: Can not write files.\n");
		return 0;
	}

	$App->print("<H2>Make LD files: finished</H2>\n");

	return 1;
}
