import galsim
import os
from astropy.time import Time as asTime

def config_dir(config, work_dir=None, data_dir=None):
    path_dict = {}
    # Working directory
    if work_dir == None:
        dirname, _ = os.path.split(os.path.abspath(__file__))
        path_dict["work_dir"] = "/".join(dirname.split("/")[:-1]) + "/"
    else:
        path_dict["work_dir"] = work_dir
    
    # Data directory
    if data_dir == None:
        # Assume all input datasets are in the work directory
        path_dict["data_dir"] =os.path.join(path_dict["work_dir"], "data/")
    else:
        path_dict["data_dir"] = data_dir
    # Data sub-catalogs
    # Object catalog direcotry
    path_dict["cat_dir"] = os.path.join(path_dict["data_dir"], config["input_path"]["cat_dir"])
    # PSF data directory
    path_dict["psf_dir"] = os.path.join(path_dict["data_dir"], config["psf_setting"]["psf_dir"])
    path_dict["fd_path"] = os.path.join(path_dict["data_dir"], config["psf_setting"]["fd_path"])
    # SED catalog directory
    # TODO: SED_dir is deprecated
    path_dict["SED_dir"] = os.path.join(path_dict["data_dir"], "imageSims/Catalog/SEDObject")
    # Directories/files for instrument parameters, e.g. efficiency curves.
    path_dict["filter_dir"] = os.path.join(path_dict["data_dir"], config["Efficiency_curve_path"]["filter_eff"])
    path_dict["ccd_dir"] = os.path.join(path_dict["data_dir"], config["Efficiency_curve_path"]["ccd_eff"])
    path_dict["mirror_file"] = os.path.join(path_dict["data_dir"], config["Efficiency_curve_path"]["mirror_eff"])

    # Cosmic-ray data directory:
    path_dict["CRdata_dir"] = os.path.join(path_dict["data_dir"], config["CR_data_path"])
    path_dict["sky_file"] = os.path.join(path_dict["data_dir"], config["sky_data_path"])

    # Slitless spectroscopy realted
    path_dict["sls_dir"] = os.path.join(path_dict["data_dir"], config["SLS_path"]["SLS_conf"])
    path_dict["normalize_dir"] = os.path.join(path_dict["data_dir"], config["SLS_path"]["SLS_norm"])

    return path_dict

def read_config(config_filename):
    """Read in a configuration file and return the corresponding dict(s).

    Parameters:
        config_filename:    The name of the configuration file to read.
    Returns:
        (list) of config dicts
    """
    config = {}
    config_file = open(config_filename).readlines()
    nlines = len(config_file)
    for i in range(nlines):
        row = config_file[i].split()
        if len(row) <= 1: continue # blank row
        if not "#" in row:
            if len(row) == 2:
                key, val = row[0:2]
                config.update({key:val})
            else:
                print("!! Something is wrong with parameter '%s'."%row[0])
                return
        elif row.index("#") == 2:
            key, val = row[0:2]
            config.update({key:val})
        elif row.index("#") == 0:
            continue # annotation
        else:
            print("!! Something is wrong with parameter '%s'."%row[0])
            return
    config = parse_config(config)
    return config

def parse_config(config):
    """Parse the config values to the right type

    Parameters:
        config:     raw config dict 
    Returns:
        Parsed config dict
    """
    config["ra_center"]     = float(config["ra_center"])
    config["dec_center"]    = float(config["dec_center"])
    config["psf_rcont"]     = config["psf_rcont"].split(",")
    config["psfRa"]         = float(config["psf_rcont"][0])
    config["psfCont"]       = float(config["psf_rcont"][1])
    config["image_rot"]     = float(config["image_rot"])*galsim.degrees
    config["sigma_spin"]    = float(config["sigma_spin"])
    config["reduced_g1"]    = float(config["reduced_g1"])
    config["reduced_g2"]    = float(config["reduced_g2"])
    config["rotateEll"]     = float(config["rotateEll"])
    config["reEll"]         = int(config["rotateEll"]/45.0)
    if config["reEll"]==0: config["reIndex"] = "P"
    if config["reEll"]==1: config["reIndex"] = "X"
    if config["reEll"]==2: config["reIndex"] = "N"
    if config["reEll"]==3: config["reIndex"] = "Y"
    config["seed_flat"]     = int(config["seed_flat"])
    config["seed_prnu"]     = int(config["seed_prnu"])
    config["seed_star"]     = int(config["seed_star"])
    config["seed_gal"]      = int(config["seed_gal"])
    config["seed_Av"]       = int(config["seed_Av"])
    config["bias_level"]    = int(config["bias_level"])
    config["df_strength"]   = float(config["df_strength"])
    return config
