import math
from datetime import datetime
import numpy as np
from StringIO import StringIO
import matplotlib.pyplot as plt
import sys
#--------------------------------------------------------------------------------
arNamePar=['REFLECTANCE_MULT_BAND_','REFLECTANCE_ADD_BAND_',
       'RADIANCE_MULT_BAND_','RADIANCE_ADD_BAND_',
       'RADIANCE_MAXIMUM_BAND_','RADIANCE_MINIMUM_BAND_',
       'QUANTIZE_CAL_MAX_BAND_','QUANTIZE_CAL_MIN_BAND_',
       'REFLECTANCE_MAXIMUM_BAND_','REFLECTANCE_MINIMUM_BAND_',
       'SUN_ELEVATION','EARTH_SUN_DISTANCE','DATE_ACQUIRED']
sprav=['l4_1',1957,0.485,
       'l4_2',1825,0.570,
       'l4_3',1557,0.655,
       'l4_4',1033,0.840,
       'l4_5',214.9,1.65,
       'l4_7',80.72,2.22,
       'l5_1',1957,0.485,
       'l5_2',1826,0.570,
       'l5_3',1554,0.655,
       'l5_4',1036,0.840,
       'l5_5',215.0,1.65,
       'l5_7',80.67,2.22,
       'l7_1',1970,0.485,
       'l7_2',1842,0.570,
       'l7_3',1547,0.655,
       'l7_4',1044,0.840,
       'l7_5',225.7,1.65,
       'l7_7',82.06,2.22,
       'l8_2','',0.480,
       'l8_3','',0.560,
       'l8_4','',0.655,
       'l8_5','',0.865,
       'l8_6','',1.61,
       'l8_7','',2.20]
#--------------------------------------------------------------------------------
def conv_Ref(dnar,nameF):
 #decode field in csv to 'band' with MTL use txt
 arPar=[]
 f=open(nameListF,'r')#open decode file
 for line in f: #read line to array
  tmpar=line.split(';')#
  if nameF in tmpar:#find name field in line array[0]
   nameMTL=tmpar[1]#get name MTL
   namesprav=tmpar[2]#get name 'band'
   if namesprav[len(namesprav)-1]=='\n':
    namesprav=namesprav[0:-1]
   nband=namesprav.split('_')#get n band
   nband=nband[1]
 f.close()
 i=sprav.index(namesprav)#get index 'band' in sprav
 for ipar in range(0,10):#set 'name' parametr
  arPar.append(arNamePar[ipar]+nband) 
 for ipar in range(10,13):#set 'name' parametr
  arPar.append(arNamePar[ipar])
 arPar.append(sprav[i+1])
 print namesprav
 #import parametrs from MTL
 f=open(nameMTL,'r')#open MTL file
 for line in f:
  tmpar=line.split('=')
  tmpparname=tmpar[0].strip()
  if tmpparname in arPar:
   i=arPar.index(tmpparname)
   arPar[i]=tmpar[1].strip()
   print tmpparname
 print arPar
 f.close()
 #math convert array
 y=arPar[0]
 print y[0]
 if y[0]<>'R':
  car=(float(arPar[0])*dnar+float(arPar[1]))/math.sin(float(arPar[10])*math.pi/180)
 else:
  Rad=float(arPar[2])*dnar+float(arPar[3])
  da=datetime.strptime( arPar[12], "%Y-%m-%d" )#DATE_ACQUIRED
  da=datetime.strftime( da, "%j" )
  print da
  esd=1-0.01668*math.cos(int(da)*2*math.pi/365)
  car=math.pi*(esd**2)*Rad/math.sin(float(arPar[10])*math.pi/180)/arPar[13]
 return car

def imp_arShape(pTxtAr):
 nr=0
 f = open(pTxtAr, 'r')
 for line in f:
  nr+=1
  if nr==1:
   ar=np.array(line.split(";"))
   nc=ar.size
 f.close()
 ar=[nr,nc]
 return ar
def imp_arFields(pTxtAr):
 nr=0
 f = open(pTxtAr, 'r')
 for line in f:
  nr+=1
  if nr==1:
   ar=np.genfromtxt(StringIO(line), delimiter=";",dtype="|S")
   continue
 f.close()
 return ar
def imp_ar(pTxtAr,nc):
 f = open(pTxtAr, 'r')
 data=f.read()
 ar=np.genfromtxt(StringIO(data), delimiter=";", skip_header=1,  usecols=(nc))
 f.close()
 return ar
#--------------------------------------------------------------------------------
def plt_hist(arSh,arFi):
 for n in range(1,arSh[1]):
  nameF=arFi[n]
  ar=imp_ar(nameFCSV,n)
  print n
  print nameF
  print ar
  step=ar.max()-ar.min()
  #
  if x2=='-re':
   ar=conv_Ref(ar,nameF)
   #print ar
  #
  print ar.min()
  print ar.max()
  #
  if x2=='-dn':
   arHist= np.histogram(ar, bins=np.arange(ar.min(), ar.max()+2, 1))
  elif x2=='-re':
   step=(ar.max()-ar.min())/step
   gmax=ar.max()
   gmin=ar.min()
   print step
   #ar=np.around(ar, decimals=6)
   print ar
   arHist= np.histogram(ar, bins=np.arange((gmin-0.49*step), gmax+(step+step*0.1),step))    
  #
  arX=arHist[1]
  arX=arX[0:-1]
  print arX
  print arHist[0]
  plt.plot(arX,arHist[0],label=str(x)+"_"+str(n))
 return plt
def plt_spec(arSh,arFi):
 arMeans=np.zeros((arSh[1]-1))
 arVBands=[]
 for n in range(1,arSh[1]):
  nameF=arFi[n]
  ar=imp_ar(nameFCSV,n)
  f=open(nameListF,'r')#open decode file
  for line in f: #read line to array
   tmpar=line.split(';')#
   if nameF in tmpar:#find name field in line array[0]
    namesprav=tmpar[2]#get name 'band'
    if namesprav[len(namesprav)-1]=='\n':
     namesprav=namesprav[0:-1]
  f.close()
  i=sprav.index(namesprav)
  vband=sprav[i+2]
  print n
  print nameF
  print ar
  #
  if x2=='-re':
   ar=conv_Ref(ar,nameF)
  print ar
  #
  print ar.mean()
  arMeans[n-1]=ar.mean()
  arVBands.append(vband)
 print arMeans
 print arVBands
 plt.plot(arVBands,arMeans,label=x)
 return plt
#--------------------------------------------------------------------------------
if __name__=="__main__":
 i=1
 for arg in sys.argv[1:]:
  if i==1:
   x1=arg
  elif i==2:
   x2=arg
  elif i==3:
   arnameFCSV=arg.split(",")
  elif i==4:
   nameListF=arg
  elif i==5:
   nameFig=arg
  i+=1
x=1 
for nameFCSV in arnameFCSV:
 arSh=imp_arShape(nameFCSV)
 arFi=imp_arFields(nameFCSV)
 if x1=='-hi':
  plt=plt_hist(arSh,arFi)
 elif x1=='-sp':
  plt=plt_spec(arSh,arFi)
 x+=1
plt.legend(bbox_to_anchor=(1.00, 1), loc=1, borderaxespad=0.)
plt.savefig(nameFig)
plt.show()