includeTargets << grailsScript("Init")

import joms.oms.Init
import joms.oms.DataInfo
import joms.oms.ImageStager


def checkDirectoryBasedImage(File file)
{
  def status = true
  def peers = file?.parentFile.list()?.collect { it.toLowerCase() }

  if ( peers?.contains("a.toc") || peers?.contains("dht") )
  {
    def name = file.name.toLowerCase()

    switch ( name )
    {
    case "a.toc":
    case "dht":
      status = true
      break
    default:
      status = false
    }
  }
  else if ( peers.find { it.endsWith(".img") } )
  {
    status = file.name.endsWith(".img")
  }

  return status
}

def checkDirectory(File directory)
{
  def status = true

  if ( new File(directory, "__OSSIM_NO_SCAN__").exists() )
  {
    status = false
  }
  else
  {
    status = checkDirectoryBasedImage(directory)
  }

  return status
}

def checkFilename(File file)
{
  def ext = file.name.toLowerCase().tokenize('.')[-1]
  def cppFiles = ~/(cpp|h|o|obj|exe|dll|so|lib)/
  def javaFiles = ~/(java|class|jar|war)/
  def programming = ~/(py|pl|sh|cgi)/
  def imageSupport = ~/(ovr|spec|kwl|his|omd|statistics|geom|prj|aux|hdr|dim|key)/
  def elevationSupport = ~/(bin|avg|min|max)/
  def worldFiles = ~/(gfw|jpw|pgw|tfw|nfw|sdw|jgw)/
  def vectorSupport = ~/(sbn|sbx|shx|dbf)/
  def documentation = ~/(txt|xml|xsl|xls|[x]html|htm[l]?|pdf|doc|rtf)/
  def archive = ~/zip|tar|gz|tgz|bz2/
  def macStuff = ~/ds_store/
  def otherFiles = ~/(tmp|log|out|orig[inal]|back|bck|save|ini|new|readme|db|htaccess)/
  def backup = ~/.*\~/
  def landSatSupport = ~/fst/
  def jp2Files = ~/jp2/
  def remoteViewSupport = ~/rv.*/
  def nitfSupport = ~/(imd|rpb|til)/

  def status = true

  if ( file.name.startsWith(".") )
  {
    status = false
  }
  else
  {
    switch ( ext )
    {
    case cppFiles:
    case javaFiles:
    case programming:
    case imageSupport:
    case elevationSupport:
    case worldFiles:
    case vectorSupport:
    case documentation:
    case backup:
    case archive:
    case macStuff:
    case otherFiles:
    case remoteViewSupport:
    case nitfSupport:
      status = false
      break
    case landSatSupport:
      def openLandSat = ~/.*b[1-8][0-2].fst/
      status = !(openLandSat.matcher(file.name.toLowerCase()).matches())
      break
    }
  }

  return status
}


def buildSupportFiles(def file)
{
  def imageStager = new ImageStager()

  imageStager.filename = file.absolutePath
  imageStager.setUseFastHistogramStagingFlag(true)

  def generated = imageStager.stageAll()

  imageStager.delete()

  return generated
}

def getInfo(def file)
{
  def dataInfo = new DataInfo()
  def canOpen = dataInfo.open(file.absolutePath)
  def xml = null

  if ( canOpen )
  {
    def generated = buildSupportFiles(file)

    if ( generated )
    {
      dataInfo.close()
      dataInfo.open(file.absolutePath)
    }

    xml = dataInfo.getInfo()?.trim()
  }

  dataInfo.close()
  dataInfo.delete()

  return xml
}

def process(def fileOrDirectory)
{
  if ( fileOrDirectory.isFile() )
  {
    processFile(fileOrDirectory)
  }
  else if ( fileOrDirectory.isDirectory() )
  {
    processDirectory(fileOrDirectory)
  }
}


def stageFile(def file)
{
  def xml = getInfo(file)

  if ( xml )
  {
    println file
  }
}

def processFile(def file)
{
  if ( checkFilename(file) )
  {
    stageFile(file)
  }
}


def processDirectory(def directory)
{
  if ( checkDirectory(directory) )
  {
    directory.eachFile { file ->
      process(file)
    }
  }
}

target(main: "The description of the script goes here!") {
  depends(parseArguments)

  def ossimArgs = ["omar", "--disable-notify", "ALL"]

  Init.instance().initialize(ossimArgs.size(), ossimArgs as String[])

  def file

  if ( !argsMap?.params )
  {
    Ant.input(addProperty: "file.name", message: "Please enter the name of the file to run:")
    file = Ant.antProject.properties."file.name" as File
  }
  else
  {
    file = argsMap?.params[0] as File
  }

  if ( file?.exists() )
  {
    process(file)
  }
  else
  {
    System.err.println("Cannot find file: ${file}")
    System.exit(-1)
  }
}

setDefaultTarget(main)