import os

class ChipOutput(object):
    def __init__(self, config, focal_plane, chip, filt, imgKey0="", imgKey1="", imgKey2="", exptime=150., mjdTime="", ra_cen=None, dec_cen=None, pointing_type='MS', pointing_ID='0', subdir="./", prefix=""):
        self.focal_plane = focal_plane
        self.chip = chip
        self.filt = filt
        self.imgKey0 = imgKey0
        self.imgKey1 = imgKey1
        self.imgKey2 = imgKey2
        self.exptime = exptime
        self.mjdTime = mjdTime
        if (ra_cen is not None) and (dec_cen is not None):
            self.ra_cen = ra_cen
            self.dec_cen = dec_cen
        else:
            self.ra_cen = config["obs_setting"]["ra_center"]
            self.dec_cen = config["obs_setting"]["dec_center"]
        exp_name = imgKey0 + "_%s_%s.fits"
        self.chipLabel = focal_plane.getChipLabel(chip.chipID)
        self.img_name =  prefix + exp_name%(self.chipLabel, filt.filter_type)
        # self.cat_name = self.img_name[:-5] + ".cat"
        self.cat_name = 'MSC_' +  config["obs_setting"]["date_obs"] + config["obs_setting"]["time_obs"] + "_" + str(pointing_ID).rjust(7, '0') + "_" + self.chipLabel.rjust(2,'0') + ".cat"
        self.subdir = subdir

        # hdr1  = "#ID ID_chip filter xImage yImage ra dec z mag flag SNR "
        hdr1  = "#ID ID_chip filter xImage yImage ra dec z mag flag "
        hdr2  = "thetaR bfrac hlr_disk hlr_bulge e1_disk e2_disk e1_bulge e2_bulge "
        hdr3  = "e1PSF e2PSF e1 e2 g1 g2 e1OBS e2OBS "
        hdr4  = "sed_type av redden "
        hdr5  = "star_model teff logg feh\n"
        # fmt1  = "%10d %4d %5s %10.3f %10.3f %15.6f %15.6f %7.4f %8.4f %2d %9.2f "
        fmt1  = "%10d %4d %5s %10.3f %10.3f %15.6f %15.6f %7.4f %8.4f %2d "
        fmt2  = "%8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f "
        fmt3  = "%8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f %8.4f "
        fmt4 = "%2d %8.4f %8.4f "
        fmt5 = "%10s %8.4f %8.4f %8.4f\n"
        self.hdr = hdr1 + hdr2 + hdr3 + hdr4 + hdr5
        self.fmt = fmt1 + fmt2 + fmt3 + fmt4 + fmt5
        print("pointing_type = %s\n"%(pointing_type))
        if pointing_type == 'MS':
            self.cat = open(os.path.join(self.subdir, self.cat_name), "w")
            print("Creating catalog file %s ...\n"%(os.path.join(self.subdir, self.cat_name)))
            self.cat.write(self.hdr)

    def updateHDR(self, hdr):
        hdrNew = [{"name":"RDNOISE", "value":self.chip.read_noise,        "comment":"read noise in e-/pixel"},
                {"name":"DARK",    "value":self.chip.dark_noise,        "comment":"Dark noise (e-/pixel/s)"},
                {"name":"EXPTIME", "value":self.exptime,          "comment":"exposure time in second"},
                {"name":"GAIN",    "value":self.chip.gain,             "comment":"CCD gain in e-/ADU"},
                {"name":"SATURATE","value":65535.0,          "comment":"saturation level"},
                {"name":"CCDCHIP",  "value":int(self.chipLabel), "comment":"chip ID in the CCD mosaic"},
                {"name":"FILTER",  "value":self.filt.filter_type,          "comment":"filter name"},
                {"name":"MJD-OBS", "value":self.mjdTime,          "comment":"Modified Julian Date (MJD) of observation"},
                {"name":"DATE-OBS","value":self.imgKey1,          "comment":"Date of observation"},
                {"name":"EQUINOX", "value":2000.0},
                {"name":"RADECSYS","value":"ICRS"},
                {"name":"RA",      "value":self.ra_cen,           "comment":"telescope pointing center"},
                {"name":"DEC",     "value":self.dec_cen,          "comment":"telescope pointing center"},
                {"name":"OBJECT",  "value":"CSS-OS"},
                {"name":"WCSDIM",  "value":2.0,              "comment":"WCS Dimensionality"},
                {"name":"EXTNAME", "value":"IM1",            "comment":"Extension name"},
                {"name":"BSCALE",  "value":1.0},
                {"name":"BZERO",   "value":0.0},
                {"name":"OBSID",   "value":self.imgKey0,          "comment":"Observation ID"},
                {"name":"CCDNAME", "value":"ccd"+self.chipLabel,"comment":"CCD name"},
                {"name":"RSPEED",  "value":10.0,             "comment":"Read speed"},
                {"name":"CHIPTEMP","value":-100.0,           "comment":"Chip temperature"},
                {"name":"DATASEC", "value":"1:%d,1:%d"%(self.chip.npix_x,self.chip.npix_y), "comment":"Data section"},
                {"name":"CCDSUM",  "value":self.chip.npix_x*self.chip.npix_y,      "comment":"CCD pixel summing"},
                {"name":"NSUM",    "value":self.chip.npix_x*self.chip.npix_y,      "comment":"CCD pixel summing"},
                {"name":"AUTHOR",  "value":"CSST-Sim Group"},
                {"name":"GROUP",   "value":"Weak Lensing Working Group for CSST"}]
        for item in hdrNew:
            hdr.add_record(item)
        return hdr

    # def cat_add_obj(self, obj, pos_img, snr, pos_shear, g1, g2):
    def cat_add_obj(self, obj, pos_img, pos_shear, g1, g2):
        ximg = pos_img.x - self.chip.bound.xmin + 1.0
        yimg = pos_img.y - self.chip.bound.ymin + 1.0
        e1, e2, g1, g2, e1OBS, e2OBS = obj.getObservedEll(g1, g2)
        if obj.type == 'galaxy':
            line = self.fmt%(obj.id, int(self.chipLabel), self.filt.filter_type, ximg, yimg, obj.ra, obj.dec, obj.z, obj.getMagFilter(self.filt), obj.param["star"], obj.thetaR, obj.bfrac, obj.hlr_disk, obj.hlr_bulge,
                obj.e1_disk, obj.e2_disk, obj.e1_bulge, obj.e2_bulge,
                pos_shear.g1, pos_shear.g2, e1, e2, g1, g2, e1OBS, e2OBS, obj.sed_type, obj.param['av'], obj.param['redden'], 'n', 0, 0, 0)
        elif obj.type == "quasar":
            line = self.fmt % (obj.id, int(self.chipLabel), self.filt.filter_type, ximg, yimg, obj.ra, obj.dec, obj.z,
                               obj.getMagFilter(self.filt), obj.param["star"], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,
                               pos_shear.g1, pos_shear.g2, e1, e2, g1, g2, e1OBS, e2OBS, obj.sed_type, obj.param['av'], obj.param['redden'], 'n', 0.0, 0.0, 0.0)
        else:
            line = self.fmt%(obj.id, int(self.chipLabel), self.filt.filter_type, ximg, yimg, obj.ra, obj.dec, obj.z, obj.getMagFilter(self.filt), obj.param["star"], 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 
                pos_shear.g1, pos_shear.g2, e1, e2, g1, g2, e1OBS, e2OBS, 0, 0.0, 0.0, obj.param['model_tag'], obj.param['teff'], obj.param['logg'],obj.param['feh'])
        # line = self.fmt%(obj.id, int(self.chipLabel), self.filt.filter_type, ximg, yimg, obj.ra, obj.dec, obj.z, obj.getMagFilter(self.filt), obj.param["star"], pos_shear.g1, pos_shear.g2, e1, e2, g1, g2, e1OBS, e2OBS)
        self.cat.write(line)
