#!/usr/bin/perl
###########################################
# picfix - Fix image colors
# Mike Schilli, 2008 (m@perlmeister.com)
###########################################
use warnings;
use strict;

use Gimp qw(:auto);
use Gimp::Fu;
use ColorCast;
use Getopt::Std;
use Log::Log4perl qw(:easy);

my $viewer = "eog";

Log::Log4perl->easy_init($DEBUG);

getopts("xl:c:a:s:", \my %opts);

$opts{a} ||= "green"; # color adjust
$opts{s} ||= "1000";  # size
$opts{l} ||= 1;       # autolevel

DEBUG "Starting up";

my $menu = 
    "<Toolbox>/Xtns/Perl-Fu/Picfix";

my $file = $ARGV[0];
die "No file" 
      unless defined $file;

register(
  "perl_fu_picfix",    # Name
  "Fix Colors and More", # Explain
  "",                  # Help 
  "",                  # Author
  "",                  # Copyright
  "",                  # Date
  $menu,               # Menu
  "*",                 # Images accepted
  [ undef ],           # No parameters
  \&picfix             # Function
);

exit main();

###########################################
sub picfix { 
###########################################

  my $img = gimp_file_load(
      RUN_NONINTERACTIVE, $file, $file);

  die "Can't load $file" unless $img;

  my $layer = image_get_active_layer($img);

  scale_image_down($img, $opts{s});

  $layer = $img->get_active_layer();
  if($opts{l}) {
    DEBUG "Autolevel [$file]";
    gimp_levels_stretch($layer);
  }

  if($opts{c}) {
    my $colorcast = ColorCast->new(
      yml_file => $opts{c},
      drawable => $layer,
    );
    $colorcast->load();
    $colorcast->adjust_to($opts{a});
  }
    
  DEBUG "Sharpening $file";
  $img->plug_in_sharpen($layer, 20);

  $file =~ s/\./-1./g;
  $file =~ s/\.nef$/.png/g;

  DEBUG "Saving $file";
  gimp_file_save(
    RUN_NONINTERACTIVE,
    $img,
    $layer,
    $file,
    $file);

  system("$viewer $file") if $opts{x};
  return $img;
}

###########################################
sub scale_image_down { 
###########################################
  my($img, $size) = @_;

  my $w = $img->image_width();
  my $h = $img->image_height();

  if($w >= $h) {
      if($w > $size) {
          $h = int($h * $size/$w);
          $w = $size;
      } else {
          return 1;
      }
  } else {
      if($h > $size) {
          $w = int($w * $size/$h);
          $h = $size;
      } else {
          return 1;
      }
  }

  DEBUG "Resizing to $w x $h";
  $img->image_scale($w, $h);
}
