# 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 ModflowUtltvk(MFPackage):
    """
    ModflowUtltvk defines a TVK package.

    Parameters
    ----------
    parent_package
        Parent_package that this package is a part of. Package is automatically
        added to parent_package when it is initialized.
    loading_package : bool, default False
        Do not set this parameter. It is intended for debugging and internal
        processing purposes only.
    print_input : keyword
        keyword to indicate that information for each change to the hydraulic
        conductivity in a cell will be written to the model listing file.
    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.
    perioddata : [(cellid, tvksetting)]
        * 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.
        * tvksetting : k | k22 | k33
                line of information that is parsed into a property name keyword and values.
                property name keywords that can be used to start the tvksetting string include:
                k, k22, and k33.
                * k : double precision
                            is the new value to be assigned as the cell's hydraulic conductivity from the
                            start of the specified stress period, as per k in the npf package.  if the
                            options block includes a ts6 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.
                * k22 : double precision
                            is the new value to be assigned as the cell's hydraulic conductivity of the
                            second ellipsoid axis (or the ratio of k22/k if the k22overk npf package option
                            is specified) from the start of the specified stress period, as per k22 in the
                            npf package.  for an unrotated case this is the hydraulic conductivity in the y
                            direction.  if the options block includes a ts6 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.
                * k33 : double precision
                            is the new value to be assigned as the cell's hydraulic conductivity of the
                            third ellipsoid axis (or the ratio of k33/k if the k33overk npf package option
                            is specified) from the start of the specified stress period, as per k33 in the
                            npf package.  for an unrotated case, this is the vertical hydraulic
                            conductivity.  if the options block includes a ts6 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.



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

    """

    ts_filerecord = ListTemplateGenerator(("tvk", "options", "ts_filerecord"))
    perioddata = ListTemplateGenerator(("tvk", "period", "perioddata"))
    package_abbr = "utltvk"
    _package_type = "tvk"
    dfn_file_name = "utl-tvk.dfn"
    dfn = [
        ["header"],
        [
            "block options",
            "name print_input",
            "type keyword",
            "reader urword",
            "optional true",
        ],
        [
            "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 period",
            "name iper",
            "type integer",
            "block_variable true",
            "in_record true",
            "tagged false",
            "shape",
            "valid",
            "reader urword",
            "optional false",
        ],
        [
            "block period",
            "name perioddata",
            "type recarray cellid tvksetting",
            "shape",
            "reader urword",
        ],
        [
            "block period",
            "name cellid",
            "type integer",
            "shape (ncelldim)",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name tvksetting",
            "type keystring k k22 k33",
            "shape",
            "tagged false",
            "in_record true",
            "reader urword",
        ],
        [
            "block period",
            "name k",
            "type double precision",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name k22",
            "type double precision",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
        [
            "block period",
            "name k33",
            "type double precision",
            "shape",
            "tagged true",
            "in_record true",
            "reader urword",
            "time_series true",
        ],
    ]

    def __init__(
        self,
        parent_package,
        loading_package=False,
        print_input=None,
        timeseries=None,
        perioddata=None,
        filename=None,
        pname=None,
        **kwargs,
    ):
        """Initialize ModflowUtltvk."""
        super().__init__(
            parent=parent_package,
            package_type="tvk",
            filename=filename,
            pname=pname,
            loading_package=loading_package,
            **kwargs,
        )

        self.print_input = self.build_mfdata("print_input", print_input)
        self._ts_filerecord = self.build_mfdata("ts_filerecord", None)
        self._ts_package = self.build_child_package(
            "ts", timeseries, "timeseries", self._ts_filerecord
        )
        self.perioddata = self.build_mfdata("perioddata", perioddata)

        self._init_complete = True


class UtltvkPackages(MFChildPackages):
    """
    UtltvkPackages is a container class for the ModflowUtltvk class.
    """

    package_abbr = "utltvkpackages"

    def initialize(
        self,
        print_input=None,
        timeseries=None,
        perioddata=None,
        filename=None,
        pname=None,
    ):
        """
        Initialize a new ModflowUtltvk package, removing any sibling
        child packages attached to the same parent package.

        See :class:`ModflowUtltvk` for parameter definitions.
        """
        new_package = ModflowUtltvk(
            self._cpparent,
            print_input=print_input,
            timeseries=timeseries,
            perioddata=perioddata,
            filename=filename,
            pname=pname,
            child_builder_call=True,
        )
        self.init_package(new_package, filename)

    def append_package(
        self,
        print_input=None,
        timeseries=None,
        perioddata=None,
        filename=None,
        pname=None,
    ):
        """
        Add a new ModflowUtltvk package to the container.

        See :class:`ModflowUtltvk` for parameter definitions.
        """
        new_package = ModflowUtltvk(
            self._cpparent,
            print_input=print_input,
            timeseries=timeseries,
            perioddata=perioddata,
            filename=filename,
            pname=pname,
            child_builder_call=True,
        )
        self._append_package(new_package, filename)
