import os
import sys
import glob
import numpy as np

from tklib.tkapplication import tkApplication


print()
print("XRD_GUI_lib loaded")

def error_message(message):
    print()
    print("#############################################")
    print(f"Error in XRD_GUI_lib: {message}")
    print("#############################################")
    print()

#join_path script $(tkprog_X_path) xrd xrd_fit.py
root_dir = os.getenv('tkprog_X_path', None)
if root_dir is None:
    error_message("Environment variable tkprog_X_path must be specified")
    input("Pree ENTER to terminate>>\n")
    exit()

filter_dir = os.path.join(root_dir, "xrd", "filter")

app     = tkApplication()
cparams = app.get_params()
cparams.debug = 0
cparams.findvalidstructure = True
cparams.plugin_dir = 'filter'
cparams.mode = 'plot'
cparams.infile    = '*.txt'
cparams.cif_files = 'data/*.*'
cparams.beam = 'X-ray'
cparams.wavelength = "CuKa"
cparams.xmin  = 20.0
cparams.xmax  = 120.0
cparams.xstep = 0.02
cparams.fwhm   = 0.2
cparams.Gfraction = 0.5
cparams.fwhm_smear      = 0.0
cparams.Gfraction_smear = 0.0
cparams.yscale  = 'linear'
cparams.BGorder = 3
cparams.alpha   = 0.1


print(f"Load modules from {filter_dir}")
module_names, modules = app.load_modules(filter_dir, "*.py", target = "read_data", is_print = True)
for m in modules:
#        if hasattr(m, "initialize"):
#            print(f"initialize {m.name}")
#            m.initialize(app, cparams)
    input_type  = m.get_input_type(app = app, cparams = cparams)
    output_type = m.get_output_type(app = app, cparams = cparams)
    print(f"  {m.name}: input_type={input_type}  output_type={output_type}")


def parse_xrd(path):
    print(f"Read {path} in XRD_GUI_lib.parse_xrd_file() using filters in {filter_dir}")
#    raise ValueError("")

    module = None
    for i in range(len(modules)):
        name = module_names[i]
        m = modules[i]

        file_type  = m.check_file_type(path, app = app, cparams = cparams)
        print(f"try [{name}] for [{path}]: file_type={file_type}")
        if file_type is not None and 'Error' not in file_type:
            print("   type matched.")
            module = m
            break

    if module is None:
        raise ValueError(f"Failed to find modules in {filter_dir}")
#        return None, None, None

    inf = module.read_data(path, app = app, cparams = cparams)

    if not inf:
        raise ValueError("Failed to read {path} by modules in {filter_dir}")

#   module_input.print_data(inf_input)
    inf_input = module.convert(inf, cparams = cparams)
    data_list = inf_input["data_list"][0]
    if type(data_list[0]) is float or type(data_list[0]) is int:
        data_list = inf_input["data_list"]

    sample_name = inf_input["sample_name"]
    xQ2_infile  = data_list[0]
    yobs_infile = data_list[1]
#    if len(inf_input["data_list"]) >= 3:
#        ysim_infile = inf_input["data_list"][2]
#    else:
#        ysim_infile = None

#    print("xQ2_infile=", xQ2_infile)
#    print("yobs_infile=", yobs_infile)
    return sample_name, np.array(xQ2_infile), np.array(yobs_infile)

def parse_reference(path):
    print(f"Read {path} in XRD_GUI_lib.parse_xrd_file() using filters in {filter_dir}")
#    raise ValueError("")

    module = None
    for i in range(len(modules)):
        name = module_names[i]
        m = modules[i]

        file_type  = m.check_file_type(path, app = app, cparams = cparams)
        print(f"try [{name}] for [{path}]: file_type={file_type}")
        if file_type is not None and 'Error' not in file_type:
            print("   type matched.")
            module = m
            break

    if module is None:
        raise ValueError(f"Failed to find modules in {filter_dir}")
#        return None, None, None

    inf = module.read_data(path, app = app, cparams = cparams)

    if not inf:
        raise ValueError("Failed to read {path} by modules in {filter_dir}")

#   module_input.print_data(inf_input)
    inf_input = module.convert(inf, cparams = cparams)
#    sample_name = inf_input["sample_name"]
# inf_input["diffractions"] = {"source": source, "Q2": Q2, "dhkl": dhkl, "hkl": hkl, "mul": mul, "intensity": Int}
    positions = inf_input["diffractions"]["Q2"]
    intensities = inf_input["diffractions"]["intensity"]
    hkls = inf_input["diffractions"]["hkl"]
    maxI = max(intensities)
    intensities = [I / maxI for I in intensities]

    reference_name = os.path.splitext(os.path.basename(path))[0]

    return reference_name, positions, intensities, hkls


def main():
#    infile = "D:/git/tkProg/tkprog_COE/XRD/data/phase1.cif"
#    infile = "D:/git/tkProg/tkprog_COE/XRD/data/Bi_R-3m.xlsx"
    infile = "D:/git/tkProg/tkprog_COE/XRD/data/240219_AlScN_300_5h_oradw_25_Al100.txt"
    parse_xrd(infile)

#    infile = "D:/git/tkProg/tkprog_COE/XRD/data/phase1.cif"
#    parse_reference(infile)
    exit()


if __name__ == "__main__":
    main()
    