#!/usr/bin/env python3
import numpy as np
import re
import logging
import os
import sys
from scipy.interpolate import make_interp_spline
import time
import importlib.util

import ldc.io.yml as ymlio
from ldc.lisa.projection import ProjectedStrain, from_file, to_file
from ldc.utils.logging import init_logger, close_logger


if __name__ == "__main__":

    import argparse
    parser = argparse.ArgumentParser()
    parser.add_argument('-i', '--in', dest='hdf5', help= "Path to hdf5 sources file")
    parser.add_argument('-c', '--config', required=True, help= "Path to configuration file")
    parser.add_argument('-o', '--out', default="./strain.hdf5", help= "Output upsampled  strain")
    parser.add_argument('-l', '--log', type=str, default="", help="Log file")
    parser.add_argument('--gw-dt', type=float, default=-1, 
                        help= "GW dt, by default deduced from lisanode sampling (ie upsampling is done out of lisanode")
    args = parser.parse_args()
    logger = init_logger(args.log)		

    cfg = ymlio.load_config(args.config)
    order = cfg["interp_order"]
    if args.gw_dt<0:
        dt_target = cfg["dt_instrument"].to('s').value/cfg["physic_upsampling"] #cfg["dt"]
    else:
        dt_target = cfg["dt"].to('s').value
    
    for ilink in range(6):
        logger.info("doing link %d"%ilink)
        yArm, lst, links, t_min, t_max, dt = from_file(args.hdf5, ilink=ilink)

        if dt==dt_target:
            to_file(args.out, yArm, lst, links, t_min, t_max, dt, ilink=ilink)
        else:
            t1 = np.arange(t_min, t_max, dt)
            t3 = np.arange(t_min, t_max, dt_target)
            bs = make_interp_spline(t1, yArm.squeeze(), k=order)
            merged_up = bs(t3)
            to_file(args.out, merged_up, lst, links,
                    t_min, t_max, dt_target, ilink=ilink)
