#!/usr/bin/env python3
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#
#                                  <NAME>
#                        NASA Jet Propulsion Laboratory
#                      California Institute of Technology
#                        (C) 2009  All Rights Reserved
#
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


import sys
import os
import math
import struct
sys.path.append(os.environ['HOME'] + '/LineAccessor/') 
import array
import fortranSrc
from install.LineAccessorPy import LineAccessorPy

def main():
    
    choice = 1
    if len(sys.argv) > 1:
        choice = int(sys.argv[1])
    
    if choice == 1 or choice == 2:
        LAGet = LineAccessorPy()
        LAGet.createLineAccessorObject()
        infile  = "testFile"
        fileSize = 4*4*10#10 lines 4 columns float type i.e. sizeof(float) = 4
        #create test file 160 bytes with integer from 0 to 159
        buffer = array.array('B')
        for i in range(fileSize):
            buffer.append(i)
        fout = open(infile, "wb")
        buffer.tofile(fout)
        fout.close()
        filemode = 'read'
        endian = 'l'
        machineEnd =  LAGet.getMachineEndianness()
        #choice = 1 test machine and file endianness being the same
        if choice == 1:
            if machineEnd == 'b':
                endian = 'b'
        else :
            if machineEnd == 'l':
                endian = 'b'
        type = "FLOAT";# using numpy nomenclature for variable type
        col = 4;# width of the tile. this means 10 lines in total. each line is col*sizeof(float) = 4*4 = 16 bytes.
        row = 3;# height of the tile. 
        # create image object to read from
        LAGet.initLineAccessor(infile,filemode,endian,type,row,col)
        
        LASet = LineAccessorPy()
        LASet.createLineAccessorObject()
        outfile = "testOutP";
        if  choice == 1:
            outfile += "1"
        else:
            outfile += "2"
        filemode1 = "writeread";
        # create image objet to write into
        LASet.initLineAccessor(outfile, filemode1, endian, type, row,col);
        #get the address of teh objects.
        addressGet = LAGet.getLineAccessorPointer()
        addressSet = LASet.getLineAccessorPointer()
        fortranSrc.testImageSetGet(addressGet,addressSet,choice);
        #need to do flushing and free memory
        LASet.finalizeLineAccessor();
        LAGet.finalizeLineAccessor();


    elif choice == 3:
        LAGet = LineAccessorPy()
        LAGet.createLineAccessorObject()
        infile  = "testSwap"
        outfile  = "testSwapOutP"
        type = "FLOAT";
        fileSize = 4*4*10#10 lines 4 columns float type i.e. sizeof(float) = 4
        #create test file 160 bytes with integer from 0 to 159
        buffer = array.array('B')
        for i in range(fileSize):
            buffer.append(i)
        fout = open(infile, "wb")
        buffer.tofile(fout)
        fout.close()
        LAGet.convertFileEndianness(infile,outfile,type);
    elif choice == 4:
        
        LAGet = LineAccessorPy()
        LAGet.createLineAccessorObject()
        infile  = "testFileBand"
        outfile  = "testFileBandOutP"
        fileSize = 4*4*10#10 lines 4 columns float type i.e. sizeof(float) = 4
        #create test file 160 bytes with integer from 0 to 159
        buffer = array.array('B')
        for i in range(fileSize):
            buffer.append(i)
        fout = open(infile, "wb")
        buffer.tofile(fout)
        fout.close()
        type = "FLOAT";# using numpy nomenclature for variable type
        col = 4;# width of the tile. this means 10 lines in total. each line is col*sizeof(float) = 4*4 = 16 bytes.
        bandIn = 1 # BSQ
        bandOut = 3 # BIL
        numBands = 2
        LAGet.changeBandScheme(infile,outfile,type,col,numBands,bandIn,bandOut)
    else:
        raise("Error. Wrong selection")



if __name__ == "__main__":
    sys.exit(main())
