#!/usr/bin/env python

import sys
import os
import argparse
import shutil

import pusher
import splitter
import scene_index_maker

from osgeo import gdal

def fix_tiling(scene_root, files, verbose=False):
    ret = False
    for filename in files:
        if not filename.endswith('.TIF'):
            continue

        ds = gdal.Open(filename)
        bx, by = ds.GetRasterBand(1).GetBlockSize()
        ds = None
        
        if by != 1:
            continue

        ret = True
        
        splitter.internally_compress(filename, verbose=verbose)

    return ret

def fix_pyramid(scene_root, files, verbose=False):
    ret = False
    for filename in files:
        if not filename.endswith('.TIF'):
            continue

        ds = gdal.Open(filename)
        ov_count = ds.GetRasterBand(1).GetOverviewCount()
        ds = None

        if ov_count != 0:
            continue
        
        ret = True
        
        splitter.build_pyramid(filename, verbose=verbose)

    return ret

def fix_index(scene_root, scene_dir, verbose=False):

    index_filename = scene_dir + '/index.html'
    
    old_index = open(index_filename).read()

    scene_index_maker.make_index(scene_root, scene_dir, verbose=verbose)

    new_index = open(index_filename).read()

    return new_index != old_index

def reprocess(scene_root, local_path, verbose=False):

    files = [os.path.join(local_path,x) for x in os.listdir(local_path)]

    ret = False

    ret |= fix_tiling(scene_root, files, verbose=verbose)
    ret |= fix_pyramid(scene_root, files, verbose=verbose)
    ret |= fix_index(scene_root, local_path, verbose=verbose)

    if verbose:
        if ret:
            print 'Changes made, re-upload'
        else:
            print 'No changes made.'

    return ret

def get_parser():
    aparser = argparse.ArgumentParser(
        description='Reprocess a local, or s3 Landsat8 scene.')

    aparser.add_argument('-v', '--verbose', action='store_true',
                         help='Generate verbose output')
    aparser.add_argument('--s3-path',
                         help='Path on S3 to scene, ie. L8/011/022/LC8011022201509LGN00')
    aparser.add_argument('--local-path',
                         help='Path to local directory for local update.')

    return aparser

def main(rawargs):
    args = get_parser().parse_args(rawargs)

    if args.s3_path is not None:
        scene_root = os.path.basename(args.s3_path)
        args.local_path = scene_root
        pusher.pull_scene(scene_root, args.local_path, verbose=args.verbose)

    else:
        if args.local_path is None:
            print 'ERROR: Please specify one of --s3-path or --local-path'
            sys.exit(1)
        scene_root = os.path.basename(args.local_path)
        
    upload = reprocess(scene_root, args.local_path, verbose=args.verbose)

    if upload and args.s3_path:
        scene_dict = {}
        pusher.push(scene_root, args.local_path, scene_dict,
                    verbose=args.verbose, overwrite=True)

    if args.s3_path:
        shutil.rmtree(args.local_path)


if __name__ == '__main__':
    status = main(sys.argv[1:])
    sys.exit(status)