# autogenerated file, do not modify

from os import PathLike, curdir
from typing import Union

from flopy.mf6.data.mfdatautil import ArrayTemplateGenerator, ListTemplateGenerator
from flopy.mf6.mfpackage import MFChildPackages, MFPackage


class ModflowGwtfmi(MFPackage):
    """
    ModflowGwtfmi defines a FMI package.

    Parameters
    ----------
    model
        Model that this package is a part of. Package is automatically
        added to model when it is initialized.
    loading_package : bool, default False
        Do not set this parameter. It is intended for debugging and internal
        processing purposes only.
    save_flows : keyword
        keyword to indicate that fmi flow terms will be written to the file specified
        with 'budget fileout' in output control.
    flow_imbalance_correction : keyword
        correct for an imbalance in flows by assuming that any residual flow error
        comes in or leaves at the concentration of the cell.  when this option is
        activated, the gwt model budget written to the listing file will contain two
        additional entries: flow-error and flow-correction.  these two entries will be
        equal but opposite in sign.  the flow-correction term is a mass flow that is
        added to offset the error caused by an imprecise flow balance.  if these terms
        are not relatively small, the flow model should be rerun with stricter
        convergence tolerances.
    packagedata : [(flowtype, filein, fname)]
        * flowtype : string
                is the word GWFBUDGET, GWFHEAD, GWFMOVER or the name of an advanced GWF stress
                package.  If GWFBUDGET is specified, then the corresponding file must be a
                budget file. If GWFHEAD is specified, the file must be a head file.  If GWFGRID
                is specified, the file must be a binary grid file.  If an advanced GWF stress
                package name appears then the corresponding file must be the budget file saved
                by a LAK, SFR, MAW or UZF Package.
        * filein : keyword
                keyword to specify that an input filename is expected next.
        * fname : string
                is the name of the file containing flows.  The path to the file should be
                included if the file is not located in the folder where the program was run.


    filename : str or PathLike, optional
        Name or path of file where this package is stored.
    pname : str, optional
        Package name.
    **kwargs
        Extra keywords for :class:`flopy.mf6.mfpackage.MFPackage`.

    """

    packagedata = ListTemplateGenerator(("gwt6", "fmi", "packagedata", "packagedata"))
    package_abbr = "gwtfmi"
    _package_type = "fmi"
    dfn_file_name = "gwt-fmi.dfn"
    dfn = [
        ["header"],
        [
            "block options",
            "name save_flows",
            "type keyword",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name flow_imbalance_correction",
            "type keyword",
            "reader urword",
            "optional true",
            "mf6internal imbalancecorrect",
        ],
        [
            "block packagedata",
            "name packagedata",
            "type recarray flowtype filein fname",
            "reader urword",
            "optional true",
        ],
        [
            "block packagedata",
            "name flowtype",
            "in_record true",
            "type string",
            "tagged false",
            "reader urword",
        ],
        [
            "block packagedata",
            "name filein",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block packagedata",
            "name fname",
            "in_record true",
            "type string",
            "preserve_case true",
            "tagged false",
            "reader urword",
        ],
    ]

    def __init__(
        self,
        model,
        loading_package=False,
        save_flows=None,
        flow_imbalance_correction=None,
        packagedata=None,
        filename=None,
        pname=None,
        **kwargs,
    ):
        """Initialize ModflowGwtfmi."""
        super().__init__(
            parent=model,
            package_type="fmi",
            filename=filename,
            pname=pname,
            loading_package=loading_package,
            **kwargs,
        )

        self.save_flows = self.build_mfdata("save_flows", save_flows)
        self.flow_imbalance_correction = self.build_mfdata(
            "flow_imbalance_correction", flow_imbalance_correction
        )
        self.packagedata = self.build_mfdata("packagedata", packagedata)

        self._init_complete = True
