#**************************************************************
#
#  Licensed to the Apache Software Foundation (ASF) under one
#  or more contributor license agreements.  See the NOTICE file
#  distributed with this work for additional information
#  regarding copyright ownership.  The ASF licenses this file
#  to you under the Apache License, Version 2.0 (the
#  "License"); you may not use this file except in compliance
#  with the License.  You may obtain a copy of the License at
#
#    http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing,
#  software distributed under the License is distributed on an
#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
#  KIND, either express or implied.  See the License for the
#  specific language governing permissions and limitations
#  under the License.
#
#**************************************************************
#
# checknewapi - a perl script to check for new API's
# using two outputs from regview and dump the interscetion
# of new types
#

if($#ARGV != 3)
{
    die "usage: checknewapi <new_type_library> <reference_type_library> <buildinfodescr> <fullpath_regview>\n";
}

-e "$ARGV[0]" || die "ERROR: type library \"$ARGV[0]\" does not exist\n";
-e "$ARGV[1]" || die "ERROR: reference type library \"$ARGV[1]\" does not exist\n";
-e "$ARGV[3]" || die "ERROR: invalid path to the regview tool \"$ARGV[3]\", please specify the full qualified path\n";

# debug flag
$DEBUG = 0;

$main::buildinfo = "$ARGV[2]";
$main::regview = "$ARGV[3]";
%{$main::reftypes} = ();
%{$main::currenttypes} = ();
%{$main::removedtypes} = ();

open ( FILEIN, "$main::regview \"$ARGV[0]\" |" ) || die "could not use content of current typelibrary \"$ARGV[0]\", regview doesn't work\n";

if ($DEBUG == 1)
{
	open( CURRENT, ">current_types.txt" ) || die "\nERROR: could not open current_types.txt for writing";
}

$first = 1;
$linebefore = "";
$published = 0;
$typeclass = "";
while (<FILEIN>)
{
    if ($first == 0)
    {
		if ( $linebefore =~ m#type class: published (.+)# )
		{
			$published = 1;
			$typeclass = $1;
		} elsif ( $linebefore =~ m#type class: (.+)# )
		{
			$published = 0;
			$typeclass = $1;
		} else
		{
			$published = 0;
			$typeclass = "";
		}
	} else
    {
		$first = 0;
    }

    if ( (!$typeclass eq "") && ($_ =~ m# *type name: \"([^\[.]+)\"#) )
    {
		if ($DEBUG == 1)
		{
			print CURRENT "$1\n";
		}
	    if ( ! exists $main::currenttypes->{$1} )
	    {
			$main::currenttypes->{$1} = { PUBLISHED => $published,
										  TYPECLASS => $typeclass,
										  COUNT => 1 };
#			print "### $main::currenttypes->{$1}->{PUBLISHED} $main::currenttypes->{$1}->{TYPECLASS} $main::currenttypes->{$1}->{COUNT}\n";
	    }
    }
    $linebefore = $_;
}
close( FILEIN );
close( CURRENT );

open ( FILEIN, "$main::regview \"$ARGV[1]\" |" ) || die "could not use content of reference type library \"$ARGV[1]\", regview doesn't work\n";

if ($DEBUG == 1)
{
	open( REFERENCE, ">reference_types.txt" ) || die "\nERROR: could not open reference_types.txt for writing";
}

# reset variables
$first = 1;
$linebefore = "";
$published = 0;
$typeclass = "";
while (<FILEIN>)
{
    if ($first == 0)
    {
		if ( $linebefore =~ m#type class: published (.+)# )
		{
			$published = 1;
			$typeclass = $1;
		} elsif ( $linebefore =~ m#type class: (.+)# )
		{
			$published = 0;
			$typeclass = $1;
		} else
		{
			$published = 0;
			$typeclass = "";
		}
	} else
    {
		$first = 0;
    }

    if ( (!$typeclass eq "") && ($_ =~ m# *type name: \"([^\[.]+)\"#) )
    {
		if ($DEBUG == 1)
		{
			print REFERENCE "$1\n";
		}
	    if ( ! exists $main::reftypes->{$1} )
	    {
			$main::reftypes->{$1}++;

			if ( exists $main::currenttypes->{$1} )
			{
				$main::currenttypes->{$1}->{COUNT}++;
#				print "###### $main::currenttypes->{$1}->{PUBLISHED} $main::currenttypes->{$1}->{TYPECLASS} $main::currenttypes->{$1}->{COUNT}\n";
			} else
			{
				if ($published == 0)
				{
					$main::removedtypes->{$1} = { PUBLISHED => $published,
												  TYPECLASS => $typeclass };
				} else
				{
					print "ERROR: type $1 is only in reference type library, this can't be happen\n";
				}
			}
	    }
    }
    $linebefore = $_;
}
close( FILEIN );
close( REFERENCE );


@typekeys = keys %{$main::currenttypes};
$allunotypes = $#typekeys+1;
$newunotypes = 0;
$newpublished = 0;
$draftscount = 0;
$draftspublished = 0;
foreach $i ( sort @typekeys )
{
    if ( $main::currenttypes->{$i}->{COUNT} == 1 &&
		 !("$main::currenttypes->{$i}->{TYPECLASS}" eq "module"))
    {
		$newunotypes++;
		my $t = $i;
		$t =~ s#/#\.#go;
		if ($main::currenttypes->{$i}->{PUBLISHED} == 1)
		{
			print "published ";
			$newpublished++;
		}
		if ( $t =~ m#drafts\.com.+#)
		{
			$draftscount++;
			if ($main::currenttypes->{$i}->{PUBLISHED} == 1)
			{
				$draftspublished++;
			}
		}
		print "$main::currenttypes->{$i}->{TYPECLASS} = $t\n";
	}
}

# count removed not yet published types
$removednotpublished = 0;

@removedtypekeys = keys %{$main::removedtypes};
foreach $i ( sort @removedtypekeys )
{
    $removednotpublished++;
    my $t = $i;
    $t =~ s#/#\.#go;
    print "removed not yet published $main::currenttypes->{$i}->{TYPECLASS} = $t\n";
}

print "\n=======================================================\n\n";
print "Summary [last check for $main::buildinfo]:\n\n";
print "Number of UNO types = $allunotypes\n";
print "Number of new UNO types = $newunotypes\n";
print "New and published types = $newpublished\n";
print "New and draft types = $draftscount\n";
print "New, draft and published = $draftspublished\n";
print "Removed and not published = $removednotpublished\n";

exit 0;
