#!/usr/bin/perl -W
# -*- cperl -*-

my $inhibit_anything_but_clothes_for_now = 'yes';

use strict;
use DBI;

my $database = 'tville';
my $user = 'root';
my $password = 'pole';

my $dbh = DBI->connect ("dbi:mysql:database=$database", $user, $password)
  or die "Can't connect to database";

my %item_types = ();
{
  my $get_item_types = $dbh->prepare
    ("SELECT DISTINCT name, ID FROM itemTypes "
     . ($inhibit_anything_but_clothes_for_now ? "WHERE isClothing=1" :'') );
  $get_item_types->execute;
  while (my $row = $get_item_types->fetchrow_arrayref) {
    $item_types{ $$row[0] } = $$row[1];
  }
}

my %default_store = (
	      'Shirts'    => 27,
	      'Pants'     => 28,
	      'Ties'      => 29,
	      'Backpacks' => 30,
	      'Dresses'   => 31,
);


my $get_parts = $dbh->prepare
  ("SELECT bodyParts FROM avatarParts WHERE itemTypeID=?");
my $drop_item_from_stores = $dbh->prepare(<<OK);
DELETE
  FROM storeItems
 USING items, storeItems
 WHERE items.filename=?
   AND items.ID = storeItems.itemID
OK
my $link_item_to_store = $dbh->prepare(<<OK);
INSERT
  INTO storeItems (storeID, itemID)
VALUES (?, (SELECT items.ID
              FROM items, itemTypes
             WHERE items.filename=?
               AND items.itemTypeID=itemTypes.ID
               AND itemTypes.name=?
       ))
OK
my $get_stores_for_item = $dbh->prepare(<<OK);
SELECT storeID AS store
  FROM storeItems, items, itemTypes
 WHERE itemTypes.name=?
   AND items.filename=?
   AND items.itemTypeID=itemTypes.ID
   AND storeItems.itemID=items.ID
OK
my $add_item = $dbh->prepare (<<OK);
INSERT
  INTO items (itemTypeID, name, filename, portrait, description, value)
VALUES (?, ?, ?, ?, ?, ?)
OK
my $update_item = $dbh->prepare (<<OK);
UPDATE items
   SET name=?,
       portrait=?,
       description=?,
       value=?
 WHERE itemTypeID=?
   AND filename=?
OK
my $promote_item = $dbh->prepare (<<OK);
UPDATE items
 USING itemTypes
   SET filename=?,
   SET portrait=?
 WHERE filename=?
   AND itemTypeName=?
   AND itemTypeID=itemTypes.ID
OK
my $read_item = $dbh->prepare (<<OK);
SELECT items.name AS name, value, description, portrait
  FROM items, itemTypes
 WHERE itemTypeID=itemTypes.ID
   AND itemTypes.name=?
   AND filename=?
OK
my $check_item = $dbh->prepare (<<OK);
SELECT ID
  FROM items
 WHERE itemTypeID=?
   AND name=?
OK

for my $type (keys %item_types) {
  warn "Scanning type $type...\n";
  my @parts = ();
  my $price = 1;
  my @stores = ();
  if ($default_store{ $type }) {
    push @stores => $default_store{ $type };
  }
  my ($name, $desc) = ('','');
  {
    $get_parts->execute ($item_types{ $type });
    my $parts = $get_parts->fetchrow_arrayref;
    if ($$parts[0]) {
      push @parts => split /\|/ => $$parts[0];
    } else {
      @parts = ('.');
    }
#	warn "Parts of $type are strange" unless $$parts[0];
  }

  unless (opendir ITEMS, $type) {
    warn "Can't read folder for items of type $type\n";
    next;
  }
  while (my $item = readdir ITEMS) {
    next if substr ($item, 0, 1) eq '.';

    if (! -d "$type/$item") {
      warn "Item $type/$item is a file, not a folder...\n";
      unless ($parts[0] eq '.') {
	warn "Skipping it; $type need parts (@parts)\n";
	next;
      }
      if ($item =~ /^(.*).swf$/) {
	warn "Item $type/$item may be a bare (old-style) SWF file ... \n";
	my $base = $1;
	mkdir "$type/$base";
	system svn => add => "$type/$base";
	system svn => mv => "$type/$item" => "$type/$base/$base.swf";
	system svn => mv => "$type/$base.fla" => "$type/$base/$base.fla";
	open STORE, '>', "$type/$item/store.txt"
	  or warn "Can't write $type/$item/store.txt";
	warn " ... upgrading to a folder ... \n";
	$read_item->execute ($type, "$type/$item");
	my $data = $read_item->fetchrow_hashref;
	$get_stores_for_item->execute ($type, $base);
	my @stores = ();
	while (my @row = fetchrow_array) {
	  push @stores => @row;
	}
	{
	  local $" = ',';
	  print STORE <<"END";
name=$data{name}
description=$data{description}
price=$data{value}
stores=@stores
END
	}
	close STORE;
	system (svn => mv => $data{portrait} => "$type/$base/portrait.swf");
	$promote_item->execute ("$type/$base/$item",
				"$type/$base/portrait.swf",
				"$type/$item", $type);
	next;
      }
    }

    for my $part (@parts) {
      unless ( -r "$type/$item/$part.swf" ) {
	warn "Missing part: $type/$item/$part.swf\n";
	next;
      }
    }

    if ( -r "$type/$item/price.txt" ) {
      open PRICE, '<', "$type/$item/price.txt"
	or warn "Can't read price.txt: $!\n";
      $price = <PRICE> + 0;
      close PRICE;
    }
    if ( -r "$type/$item/store.txt" ) {
      open STORE, '<', "$type/$item/store.txt"
	or warn "Can't read store.txt: $!\n";
      while (<STORE>) {
	if (/^price\s*=\s*(\d+)/) {
	  $price = $1 + 0;
	}
	if (/^name\s*=\s*(.*)/) {
	  $name = $1;
	}
	if (/^desc\w*\s*=\s*(.*)/) {
	  $desc = $1;
	}
	if (/^stores?\s*=\s*([\d,]+)/) {
	  push @stores => split /,/ => $1;
	}
      }
      close STORE;
    }

    unless ( -r "$type/$item/portrait.swf" ) {
      my $ok = 0;
      warn "Missing portrait: $type/$item/portrait.swf\n";
      my $annoyed = lc $type;
      if ( -d "${annoyed}Portraits" ) {
	if ( -r "${annoyed}Portraits/$item.swf" ) {
	  system svn => mv => "${annoyed}Portraits/$item.swf"
	    => "$type/$item/portrait.swf";
	  system svn => mv => "${annoyed}Portraits/$item.fla"
	    => "$type/$item/portrait.fla";
	  warn " ... found it. It was hiding.\n";
	} elsif ( -r "${annoyed}Portraits/${item}_portrait.swf" ) {
	  system svn => mv => "${annoyed}Portraits/${item}_portrait.swf"
	    => "$type/$item/portrait.swf";
	  system svn => mv => "${annoyed}Portraits/${item}_portrait.fla"
	    => "$type/$item/portrait.fla";
	  warn " ... found it. It was hiding.\n";
	}
      } else {
	if ($annoyed =~ /s$/) {
	  $annoyed = substr($annoyed, 0, (length $annoyed) - 1);
	  if ( -d "${annoyed}Portraits" ) {
	    if ( -r "${annoyed}Portraits/$item.swf" ) {
	      system svn => mv => "${annoyed}Portraits/$item.swf"
		=> "$type/$item/portrait.swf";
	      system svn => mv => "${annoyed}Portraits/$item.fla"
		=> "$type/$item/portrait.fla";
	      warn " ... found it. It was hiding.\n";
	    } elsif ( -r "${annoyed}Portraits/${item}_portrait.swf" ) {
	      system svn => mv => "${annoyed}Portraits/${item}_portrait.swf"
		=> "$type/$item/portrait.swf";
	      system svn => mv => "${annoyed}Portraits/${item}_portrait.fla"
		=> "$type/$item/portrait.fla";
	      warn " ... found it. It was hiding.\n";
	    }
	  }
	}
      }
    }

    next unless -r "$type/$item/portrait.swf";

    $check_item->execute ($item_types{ $type }, $item);
    if ($check_item->fetchrow_array) {
      $update_item->execute ($item,
			     "/$type/$item/portrait.swf",
			     $name ? $name : $item, $price,
			     $item_types{ $type }, $desc ? $desc : $item)
	or warn "$type/$item: " . $dbh->errstr;
    } else {
      $add_item->execute ($item_types{ $type }, $name ? $name : $item, $item,
			  "/$type/$item/portrait.swf",
			  $desc ? $desc : $item, $price)
	or warn "$type/$item: " . $dbh->errstr;
    }
    $drop_item_from_stores->execute ($item);
    for my $store (@stores) {
      $link_item_to_store->execute ($store, $item, $type);
    }
  }
  closedir ITEMS;
}
