import os
import csv
from make_feedme import *
from astropy.io import fits
from astropy.wcs import WCS
from astropy.coordinates import SkyCoord
from astropy import units as u
import math
import argparse
from norm_psf_function import *

def set_val(val,ig,param):
  try:
    return ig[param]
    print "INITIAL GUESS ACCEPTED"
  except KeyError:
    return val

def make_feedme_file(file_img,initial_guess={}):
  hdulist = fits.open('res_gal.fits')
  hdulist2 = fits.open(file_img)
  PSFFILE_NAME='psf_A.fits'
  norm_psf(PSFFILE_NAME)
  w = WCS(file_img)
  ra1, dec1 = w.wcs_pix2world(1, 1, 0)
  ra2, dec2 = w.wcs_pix2world(1, 2, 0)
  c1 = SkyCoord(ra=ra1*u.degree, dec=dec1*u.degree, frame='icrs')
  c2 = SkyCoord(ra=ra2*u.degree, dec=dec2*u.degree, frame='icrs')
  sep = c1.separation(c2)
  data=hdulist[2].data
  mag = hdulist2[0].header['PHOTZP'] - 2.5*math.log10(float(data[0]['FLUX_AUTO']))
  
  x_c = data[0]['X_IMAGE']
  y_c = data[0]['Y_IMAGE']
  flux_radi = float(data[0]['FLUX_RADIUS'])
  flux_fwhm = flux_radi
  hdulist.close()
  hdr2=hdulist2[0].header
  width = int(hdr2['NAXIS1'])
  height = int(hdr2['NAXIS2'])

  hdulist2.close()
  x_min = int(x_c - 5 * flux_radi)
  x_max = int(x_c + 5 * flux_radi)
  y_min = int(y_c - 5 * flux_radi)
  y_max = int(y_c + 5 * flux_radi) 
  
  if x_min <= 0:
    x_min = 1
    
  if y_min <= 0:
    y_min = 1
    
  if x_max >= width:
    x_max = width-1
    
  if y_max >= height:
    y_max = height-1

  feed_me_name='galfit_B.feedme'
  input_parameters={}
  input_parameters['input_fits'] = file_img
  input_parameters['output_fits'] = 'output_B.fits'
  input_parameters['psf_fits']=PSFFILE_NAME
  input_parameters['mask_fits']='none'
  input_parameters['xmin']=x_min
  input_parameters['xmax']=x_max
  input_parameters['ymin']=y_min
  input_parameters['ymax']=y_max
  input_parameters['x_conv']=x_max-x_min
  input_parameters['y_conv']=y_max-y_min
  input_parameters['zero_point']=hdulist2[0].header['PHOTZP']
  input_parameters['s_x']=sep.arcsec
  input_parameters['s_y']=sep.arcsec
  fit_parameters={}
  fit_parameters['fit_type']='sersic'
  fit_parameters['x_c']=float(x_c)
  fit_parameters['x_c_ch']=1
  fit_parameters['y_c']=float(y_c)
  fit_parameters['y_c_ch']=1
  fit_parameters['int_mag']=mag
  fit_parameters['int_mag_ch']=1
  fit_parameters['re']=set_val(0.8,initial_guess,'r_sers')
  fit_parameters['re_ch']=1
  fit_parameters['s_ind']=set_val(2.5,initial_guess,'n_sers')
  fit_parameters['s_ind_ch']=1
  fit_parameters['ax_ratio']=set_val(1,initial_guess,'ar_sers')
  fit_parameters['ax_ratio_ch']=1
  fit_parameters['pa']=set_val((float(data[0]['THETA_IMAGE'])+90),initial_guess,'pa_sers')
  fit_parameters['pa_ch']=1

  fit_parameters2={}
  fit_parameters2['fit_type']='expdisk'
  fit_parameters2['x_c']=float(x_c)
  fit_parameters2['x_c_ch']=1
  fit_parameters2['y_c']=float(y_c)
  fit_parameters2['y_c_ch']=1
  fit_parameters2['int_mag']=mag
  fit_parameters2['int_mag_ch']=1
  fit_parameters2['re']=set_val(float(flux_fwhm)/1.3,initial_guess,'r_disk')
  fit_parameters2['re_ch']=1
  fit_parameters2['ax_ratio']=set_val(float(data[0]['ELLIPTICITY']),initial_guess,'ar_disk')
  fit_parameters2['ax_ratio_ch']=1
  fit_parameters2['pa']=set_val((float(data[0]['THETA_IMAGE'])+90),initial_guess,'pa_disk')
  fit_parameters2['pa_ch']=1

  f_params=[]
  f_params.append(fit_parameters)
  f_params.append(fit_parameters2)

  make_fm(feed_me_name,input_parameters,f_params)


parser = argparse.ArgumentParser()
parser.add_argument("-p", "--path", type=str)
args = parser.parse_args()

if args.path:
  print args.path
else:
  print "ALLLA"

initial_guess={}
with open('initial_guesses_A') as f:
    for line in f:
      line.replace(' ','')
      l_spl=line.split(' - ')
      ObjID=l_spl[0]
      params_spl=l_spl[1].split(',')
      initial_guess[ObjID]={}
      for param in params_spl:
	p_spl = param.split(':')
	parameter = p_spl[0]
	value = float(p_spl[1])
	initial_guess[ObjID][parameter]=value

with open('CFHT_WITH_PSF','r') as csvfile:
    rows = csv.reader(csvfile, delimiter=',')
    i=0
    for row in rows:
      print row
      os.chdir(row[2])
      if args.path:
	print args.path
	if args.path in row[2]:
	  print 'PARAMS'
	  try:
	    make_feedme_file(row[3])
	    for way, val in initial_guess.iteritems():
	      if way in row[2]:
		make_feedme_file(row[3],initial_guess=val)
		break
	  except KeyError:
	    make_feedme_file(row[3])
      else:
	  print 'NO PARAMS'
	  try:
	    make_feedme_file(row[3])
	    for way, val in initial_guess.iteritems():
	      if way in row[2]:
		make_feedme_file(row[3],initial_guess=val)
		break
	  except KeyError:
	    make_feedme_file(row[3])	
      os.chdir('../../../')
      
'''
cmd = './galfit '+feed_me_name
print cmd

PIPE = subprocess.PIPE
p = subprocess.Popen(cmd, shell = True)
p.wait()

show_resmap(input_parameters['output_fits'], 165, 232, 341, 431)
'''