#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import argparse
import os
import traceback

import imas
from rich.markdown import Markdown
from rich_argparse import RichHelpFormatter

from idstools.eqdsk2ids import eqdsk2ids
from idstools.set_logger import set_logger
from idstools.utils.clihelper import (
    get_database_path,
)

# ----------------------------------------------------------------------


def main():
    """
    EQDSK Converter to IDS/equilibrium (eqdsk2ids)
    """

    # Convert GEQDSK to IDS/equilibrium
    eq = eqdsk2ids(
        gfile=args.gpath,
        cocos_in=args.cocos_in,
    )

    outputargs = argparse.Namespace()
    outputargs.uri = args.dest
    dest_connection = None
    if args.force:
        # CREATE DEST
        outputargs.mode = "w"
        logger.info("creating output datafile ...")
        if outputargs.uri != "" and outputargs.uri is not None:
            dest_connection = imas.DBEntry(outputargs.uri, outputargs.mode)
        if dest_connection is None:
            logger.error("Error creating destination pulse! " "Please check parameters and permissions.")
            exit(1)
    else:
        outputargs.mode = "a"
        dest_connection = None
        logger.info("opening the output datafile ...")
        if outputargs.uri != "" and outputargs.uri is not None:
            try:
                dest_connection = imas.DBEntry(outputargs.uri, outputargs.mode)
            except Exception:
                outputargs.mode = "w"
                dest_connection = imas.DBEntry(outputargs.uri, outputargs.mode)

        if dest_connection is None:
            logger.error("Error opening destination pulse! " "Please check parameters and permissions.")
            exit(1)

    dest_connection.put(eq)
    dest_connection.close()
    db_path = get_database_path(outputargs)
    logger.info(f"IDS/equilibrium populated in {db_path}.")


# ----------------------------------------------------------------------

description = r"""
(I) Command Line Interface for EQDSK Converter (eqdsk2ids)
------------------------------------------------------------

**Usage:**

0) Load IMAS and install fortranformat and Cerberus (if not done before)

    > module load IMAS

    > pip install fortranformat cerberus

1) Compute COCOS and create IDS data file in local database

    > eqdsk2ids -g path_to_gfile -d "imas:hdf5?path=/path/to/data" -c 11

2) Process multiple files using wildcards

    > eqdsk2ids -g "*.geqdsk" -d "imas:hdf5?path=/path/to/data" -c 11

3) Process multiple files by specifying them individually

    > eqdsk2ids -g file1.g file2.g file3.g -d "imas:hdf5?path=/path/to/data" -c 11

4) Increase verbosity to see COCOS index and transformation coefficient info.

    > eqdsk2ids -g gfile -d "imas:hdf5?path=/path/to/data" -c 11 --log INFO

(II) Functional Interface in Python (idstools/eqdsk2ids.py)
------------------------------------------------------------

**Usage:**

0) Initialization

    > from idstools.eqdsk2ids import eqdsk2ids

1) Convert single G-file

    > eq = eqdsk2ids(gfile='path/to/gfile')

2) Convert multiple files with wildcards

    > eq = eqdsk2ids(gfile='path/to/*.geqdsk')

3) Convert multiple files as a list

    > eq = eqdsk2ids(gfile=['file1.g', 'file2.g', 'file3.g'])

4) Convert with COCOS input (=1) coerced

    > eq = eqdsk2ids(gfile='path/to/gfile', cocos_in=1)"""
if __name__ == "__main__":
    # Parse for command line options
    prog = os.path.basename(__file__)
    parser = argparse.ArgumentParser(
        prog=prog,
        formatter_class=RichHelpFormatter,
        description=Markdown(description, style="argparse.text"),
    )
    parser.add_argument(
        "-d",
        "--dest",
        type=str,
        required=True,
        help="destination uri (e.g. imas:hdf5?path=./testdb or ./testpulse.nc)",
    )
    parser.add_argument(
        "-f",
        "--force",
        action="store_true",
        help="Force creation of destination data-entry (existing data lost)",
    )
    parser.add_argument(
        "-g",
        "--gpath",
        dest="gpath",
        nargs="+",
        help="path(s) to GEQDSK file(s). Can specify multiple files "
        "separated by spaces, use wildcards (e.g., *.g), or "
        "provide a directory",
        required=True,
        default=None,
    )
    parser.add_argument(
        "--log",
        dest="log",
        default="WARNING",
        choices=["DEBUG", "INFO", "WARNING", "ERROR", "CRITICAL"],
        help="Configure the logging level, default=%(default)s",
    )
    parser.add_argument(
        "-c",
        "--cocos_in",
        dest="cocos_in",
        help="Tokamak coordinate conventions (COCOS) describing input data",
        required=True,
        type=int,
        default=None,
        choices=[*range(1, 9), *range(11, 19)],
    )
    args = parser.parse_args()
    # Initialize logger
    logger = set_logger(__name__, level=args.log)

    try:
        main()
    except Exception:
        logger.error(traceback.format_exc())
