# 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 ModflowGwfevt(MFPackage):
    """
    ModflowGwfevt defines a EVT 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.
    fixed_cell : keyword
        indicates that evapotranspiration will not be reassigned to a cell underlying
        the cell specified in the list if the specified cell is inactive.
    auxiliary : [string]
        defines an array of one or more auxiliary variable names.  there is no limit on
        the number of auxiliary variables that can be provided on this line; however,
        lists of information provided in subsequent blocks must have a column of data
        for each auxiliary variable name defined here.   the number of auxiliary
        variables detected on this line determines the value for naux.  comments cannot
        be provided anywhere on this line as they will be interpreted as auxiliary
        variable names.  auxiliary variables may not be used by the package, but they
        will be available for use by other parts of the program.  the program will
        terminate with an error if auxiliary variables are specified on more than one
        line in the options block.
    auxmultname : string
        name of auxiliary variable to be used as multiplier of evapotranspiration rate.
    boundnames : keyword
        keyword to indicate that boundary names may be provided with the list of
        evapotranspiration cells.
    print_input : keyword
        keyword to indicate that the list of evapotranspiration information will be
        written to the listing file immediately after it is read.
    print_flows : keyword
        keyword to indicate that the list of evapotranspiration flow rates will be
        printed to the listing file for every stress period time step in which 'budget
        print' is specified in output control.  if there is no output control option
        and 'print_flows' is specified, then flow rates are printed for the last time
        step of each stress period.
    save_flows : keyword
        keyword to indicate that evapotranspiration flow terms will be written to the
        file specified with 'budget fileout' in output control.
    timeseries : record ts6 filein ts6_filename
        Contains data for the ts package. Data can be passed as a dictionary to the ts
        package with variable names as keys and package data as values. Data for the
        timeseries variable is also acceptable. See ts package documentation for more
        information.
    observations : record obs6 filein obs6_filename
        Contains data for the obs package. Data can be passed as a dictionary to the
        obs package with variable names as keys and package data as values. Data for
        the observations variable is also acceptable. See obs package documentation for
        more information.
    surf_rate_specified : keyword
        indicates that the proportion of the evapotranspiration rate at the et surface
        will be specified as petm0 in list input.
    maxbound : integer
        integer value specifying the maximum number of evapotranspiration cells cells
        that will be specified for use during any stress period.
    nseg : integer
        number of et segments.  default is one.  when nseg is greater than 1, the pxdp
        and petm arrays must be of size nseg - 1 and be listed in order from the
        uppermost segment down. values for pxdp must be listed first followed by the
        values for petm.  pxdp defines the extinction-depth proportion at the bottom of
        a segment. petm defines the proportion of the maximum et flux rate at the
        bottom of a segment.
    stress_period_data : [(cellid, surface, rate, depth, pxdp, petm, petm0, aux, boundname)]
        * cellid : [integer]
                is the cell identifier, and depends on the type of grid that is used for the
                simulation.  For a structured grid that uses the DIS input file, CELLID is the
                layer, row, and column.   For a grid that uses the DISV input file, CELLID is
                the layer and CELL2D number.  If the model uses the unstructured discretization
                (DISU) input file, CELLID is the node number for the cell.
        * surface : double precision
                is the elevation of the ET surface (:math:`L`). If the Options block includes a
                TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                obtained from a time series by entering the time-series name in place of a
                numeric value.
        * rate : double precision
                is the maximum ET flux rate (:math:`LT^{-1}`). If the Options block includes a
                TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                obtained from a time series by entering the time-series name in place of a
                numeric value.
        * depth : double precision
                is the ET extinction depth (:math:`L`). If the Options block includes a
                TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                obtained from a time series by entering the time-series name in place of a
                numeric value.
        * pxdp : [double precision]
                is the proportion of the ET extinction depth at the bottom of a segment
                (dimensionless). pxdp is an array of size (nseg - 1).  Values in pxdp must be
                greater than 0.0 and less than 1.0.  pxdp values for a cell must increase
                monotonically.  If the Options block includes a TIMESERIESFILE entry (see the
                'Time-Variable Input' section), values can be obtained from a time series by
                entering the time-series name in place of a numeric value.
        * petm : [double precision]
                is the proportion of the maximum ET flux rate at the bottom of a segment
                (dimensionless). petm is an array of size (nseg - 1).  If the Options block
                includes a TIMESERIESFILE entry (see the 'Time-Variable Input' section), values
                can be obtained from a time series by entering the time-series name in place of
                a numeric value.
        * petm0 : double precision
                is the proportion of the maximum ET flux rate that will apply when head is at
                or above the ET surface (dimensionless). PETM0 is read only when the
                SURF_RATE_SPECIFIED option is used. If the Options block includes a
                TIMESERIESFILE entry (see the 'Time-Variable Input' section), values can be
                obtained from a time series by entering the time-series name in place of a
                numeric value.
        * aux : [double precision]
                represents the values of the auxiliary variables for each evapotranspiration.
                The values of auxiliary variables must be present for each evapotranspiration.
                The values must be specified in the order of the auxiliary variables specified
                in the OPTIONS block.  If the package supports time series and the Options
                block includes a TIMESERIESFILE entry (see the 'Time-Variable Input' section),
                values can be obtained from a time series by entering the time-series name in
                place of a numeric value.
        * boundname : string
                name of the evapotranspiration cell.  BOUNDNAME is an ASCII character variable
                that can contain as many as 40 characters.  If BOUNDNAME contains spaces in it,
                then the entire name must be enclosed within single quotes.


    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`.

    """

    auxiliary = ArrayTemplateGenerator(("gwf6", "evt", "options", "auxiliary"))
    ts_filerecord = ListTemplateGenerator(("gwf6", "evt", "options", "ts_filerecord"))
    obs_filerecord = ListTemplateGenerator(("gwf6", "evt", "options", "obs_filerecord"))
    stress_period_data = ListTemplateGenerator(
        ("gwf6", "evt", "period", "stress_period_data")
    )
    package_abbr = "gwfevt"
    _package_type = "evt"
    dfn_file_name = "gwf-evt.dfn"
    dfn = [
        ["header", "multi-package", "package-type stress-package"],
        [
            "block options",
            "name fixed_cell",
            "type keyword",
            "shape",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name auxiliary",
            "type string",
            "shape (naux)",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name auxmultname",
            "type string",
            "shape",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name boundnames",
            "type keyword",
            "shape",
            "reader urword",
            "optional true",
        ],
        [
            "block options",
            "name print_input",
            "type keyword",
            "reader urword",
            "optional true",
            "mf6internal iprpak",
        ],
        [
            "block options",
            "name print_flows",
            "type keyword",
            "reader urword",
            "optional true",
            "mf6internal iprflow",
        ],
        [
            "block options",
            "name save_flows",
            "type keyword",
            "reader urword",
            "optional true",
            "mf6internal ipakcb",
        ],
        [
            "block options",
            "name ts_filerecord",
            "type record ts6 filein ts6_filename",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
            "construct_package ts",
            "construct_data timeseries",
            "parameter_name timeseries",
        ],
        [
            "block options",
            "name ts6",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name filein",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name ts6_filename",
            "type string",
            "preserve_case true",
            "in_record true",
            "reader urword",
            "optional false",
            "tagged false",
        ],
        [
            "block options",
            "name obs_filerecord",
            "type record obs6 filein obs6_filename",
            "shape",
            "reader urword",
            "tagged true",
            "optional true",
            "construct_package obs",
            "construct_data observations",
            "parameter_name continuous",
        ],
        [
            "block options",
            "name obs6",
            "type keyword",
            "shape",
            "in_record true",
            "reader urword",
            "tagged true",
            "optional false",
        ],
        [
            "block options",
            "name obs6_filename",
            "type string",
            "preserve_case true",
            "in_record true",
            "tagged false",
            "reader urword",
            "optional false",
        ],
        [
            "block options",
            "name surf_rate_specified",
            "type keyword",
            "reader urword",
            "optional true",
            "mf6internal surfratespec",
        ],
        [
            "block dimensions",
            "name maxbound",
            "type integer",
            "reader urword",
            "optional false",
        ],
        [
            "block dimensions",
            "name nseg",
            "type integer",
            "reader urword",
            "optional false",
        ],
        [
            "block period",
            "name iper",
            "type integer",
            "block_variable true",
            "in_record true",
            "tagged false",
            "shape",
            "valid",
            "reader urword",
            "optional false",
        ],
        [
            "block period",
            "name stress_period_data",
            "type recarray cellid surface rate depth pxdp petm petm0 aux boundname",
            "shape (maxbound)",
            "reader urword",
            "mf6internal spd",
        ],
        [
            "block period",
            "name cellid",
            "type integer",
            "shape (ncelldim)",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name surface",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name rate",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name depth",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name pxdp",
            "type double precision",
            "shape (nseg-1)",
            "tagged false",
            "in_record true",
            "reader urword",
            "optional true",
            "time_series true",
        ],
        [
            "block period",
            "name petm",
            "type double precision",
            "shape (nseg-1)",
            "tagged false",
            "in_record true",
            "reader urword",
            "optional true",
            "time_series true",
        ],
        [
            "block period",
            "name petm0",
            "type double precision",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "optional true",
            "time_series true",
        ],
        [
            "block period",
            "name aux",
            "type double precision",
            "in_record true",
            "tagged false",
            "shape (naux)",
            "reader urword",
            "optional true",
            "time_series true",
            "mf6internal auxvar",
        ],
        [
            "block period",
            "name boundname",
            "type string",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
            "optional true",
        ],
    ]

    def __init__(
        self,
        model,
        loading_package=False,
        fixed_cell=None,
        auxiliary=None,
        auxmultname=None,
        boundnames=None,
        print_input=None,
        print_flows=None,
        save_flows=None,
        timeseries=None,
        observations=None,
        surf_rate_specified=None,
        maxbound=None,
        nseg=None,
        stress_period_data=None,
        filename=None,
        pname=None,
        **kwargs,
    ):
        """Initialize ModflowGwfevt."""
        super().__init__(
            parent=model,
            package_type="evt",
            filename=filename,
            pname=pname,
            loading_package=loading_package,
            **kwargs,
        )

        self.fixed_cell = self.build_mfdata("fixed_cell", fixed_cell)
        self.auxiliary = self.build_mfdata("auxiliary", auxiliary)
        self.auxmultname = self.build_mfdata("auxmultname", auxmultname)
        self.boundnames = self.build_mfdata("boundnames", boundnames)
        self.print_input = self.build_mfdata("print_input", print_input)
        self.print_flows = self.build_mfdata("print_flows", print_flows)
        self.save_flows = self.build_mfdata("save_flows", save_flows)
        self._ts_filerecord = self.build_mfdata("ts_filerecord", None)
        self._ts_package = self.build_child_package(
            "ts", timeseries, "timeseries", self._ts_filerecord
        )
        self._obs_filerecord = self.build_mfdata("obs_filerecord", None)
        self._obs_package = self.build_child_package(
            "obs", observations, "continuous", self._obs_filerecord
        )
        self.surf_rate_specified = self.build_mfdata(
            "surf_rate_specified", surf_rate_specified
        )
        self.maxbound = self.build_mfdata("maxbound", maxbound)
        self.nseg = self.build_mfdata("nseg", nseg)
        self.stress_period_data = self.build_mfdata(
            "stress_period_data", stress_period_data
        )

        self._init_complete = True
