from __future__ import annotations

from typing import Any, Callable, Literal

import numpy as np

from gradio import components


class TextArea(components.Textbox):
    """
    Sets: lines=7
    """

    is_template = True

    def __init__(
        self,
        value: str | Callable | None = "",
        *,
        lines: int = 7,
        max_lines: int = 20,
        placeholder: str | None = None,
        label: str | None = None,
        show_label: bool = True,
        interactive: bool | None = None,
        visible: bool = True,
        elem_id: str | None = None,
        **kwargs,
    ):
        super().__init__(
            value=value,
            lines=lines,
            max_lines=max_lines,
            placeholder=placeholder,
            label=label,
            show_label=show_label,
            interactive=interactive,
            visible=visible,
            elem_id=elem_id,
            **kwargs,
        )


# class Sketchpad(components.Image):
#     """
#     Sets: image_mode="L", source="canvas", shape=(28, 28), invert_colors=True, interactive=True
#     """

#     is_template = True

#     def __init__(
#         self,
#         value: str | Image | np.ndarray | None = None,
#         *,
#         shape: tuple[int, int] = (28, 28),
#         image_mode: Literal["L"] = "L",
#         invert_colors: bool = True,
#         source: Literal["canvas"] = "canvas",
#         tool: Literal["editor", "select", "sketch", "color-sketch"] | None = None,
#         type: Literal["numpy", "pil", "filepath"] = "numpy",
#         label: str | None = None,
#         show_label: bool = True,
#         interactive: bool | None = True,
#         visible: bool = True,
#         streaming: bool = False,
#         elem_id: str | None = None,
#         mirror_webcam: bool = True,
#         brush_radius: float | None = None,
#         brush_color: str = "#000000",
#         **kwargs,
#     ):
#         super().__init__(
#             value=value,
#             shape=shape,
#             image_mode=image_mode,
#             invert_colors=invert_colors,
#             source=source,
#             tool=tool,
#             type=type,
#             label=label,
#             show_label=show_label,
#             interactive=interactive,
#             visible=visible,
#             streaming=streaming,
#             elem_id=elem_id,
#             mirror_webcam=mirror_webcam,
#             brush_radius=brush_radius,
#             brush_color=brush_color,
#             **kwargs,
#         )


# class Paint(components.Image):
#     """
#     Sets: source="canvas", tool="color-sketch", interactive=True
#     """

#     is_template = True

#     def __init__(
#         self,
#         value: str | Image | np.ndarray | None = None,
#         *,
#         shape: tuple[int, int] | None = None,
#         image_mode: Literal["RGB"] = "RGB",
#         invert_colors: bool = False,
#         source: Literal["canvas"] = "canvas",
#         tool: Literal["color-sketch"] = "color-sketch",
#         type: Literal["numpy", "pil", "filepath"] = "numpy",
#         label: str | None = None,
#         show_label: bool = True,
#         interactive: bool | None = True,
#         visible: bool = True,
#         streaming: bool = False,
#         elem_id: str | None = None,
#         mirror_webcam: bool = True,
#         brush_radius: float | None = None,
#         brush_color: str = "#000000",
#         **kwargs,
#     ):
#         super().__init__(
#             value=value,
#             shape=shape,
#             image_mode=image_mode,
#             invert_colors=invert_colors,
#             source=source,
#             tool=tool,
#             type=type,
#             label=label,
#             show_label=show_label,
#             interactive=interactive,
#             visible=visible,
#             streaming=streaming,
#             elem_id=elem_id,
#             mirror_webcam=mirror_webcam,
#             brush_radius=brush_radius,
#             brush_color=brush_color,
#             **kwargs,
#         )


# class ImageMask(components.Image):
#     """
#     Sets: source="upload", tool="sketch", interactive=True
#     """

#     is_template = True

#     def __init__(
#         self,
#         value: str | Image | np.ndarray | None = None,
#         *,
#         shape: tuple[int, int] | None = None,
#         image_mode: Literal["RGB", "L"] = "RGB",
#         invert_colors: bool = False,
#         source: Literal["upload"] = "upload",
#         tool: Literal["sketch"] = "sketch",
#         type: Literal["numpy", "pil", "filepath"] = "numpy",
#         label: str | None = None,
#         show_label: bool = True,
#         interactive: bool | None = True,
#         visible: bool = True,
#         streaming: bool = False,
#         elem_id: str | None = None,
#         mirror_webcam: bool = True,
#         brush_radius: float | None = None,
#         brush_color: str = "#000000",
#         **kwargs,
#     ):
#         super().__init__(
#             value=value,
#             shape=shape,
#             image_mode=image_mode,
#             invert_colors=invert_colors,
#             source=source,
#             tool=tool,
#             type=type,
#             label=label,
#             show_label=show_label,
#             interactive=interactive,
#             visible=visible,
#             streaming=streaming,
#             elem_id=elem_id,
#             mirror_webcam=mirror_webcam,
#             brush_radius=brush_radius,
#             brush_color=brush_color,
#             **kwargs,
#         )


# class ImagePaint(components.Image):
#     """
#     Sets: source="upload", tool="color-sketch", interactive=True
#     """

#     is_template = True

#     def __init__(
#         self,
#         value: str | Image | np.ndarray | None = None,
#         *,
#         shape: tuple[int, int] | None = None,
#         image_mode: Literal["RGB", "L"] = "RGB",
#         invert_colors: bool = False,
#         source: Literal["upload"] = "upload",
#         tool: Literal["color-sketch"] = "color-sketch",
#         type: Literal["numpy", "pil", "filepath"] = "numpy",
#         label: str | None = None,
#         show_label: bool = True,
#         interactive: bool | None = True,
#         visible: bool = True,
#         streaming: bool = False,
#         elem_id: str | None = None,
#         mirror_webcam: bool = True,
#         brush_radius: float | None = None,
#         brush_color: str = "#000000",
#         **kwargs,
#     ):
#         super().__init__(
#             value=value,
#             shape=shape,
#             image_mode=image_mode,
#             invert_colors=invert_colors,
#             source=source,
#             tool=tool,
#             type=type,
#             label=label,
#             show_label=show_label,
#             interactive=interactive,
#             visible=visible,
#             streaming=streaming,
#             elem_id=elem_id,
#             mirror_webcam=mirror_webcam,
#             brush_radius=brush_radius,
#             brush_color=brush_color,
#             **kwargs,
#         )


# class Pil(components.Image):
#     """
#     Sets: type="pil"
#     """

#     is_template = True

#     def __init__(
#         self,
#         value: str | Image | np.ndarray | None = None,
#         *,
#         shape: tuple[int, int] | None = None,
#         image_mode: Literal["RGB", "L"] = "RGB",
#         invert_colors: bool = False,
#         source: Literal["upload", "webcam", "canvas"] = "upload",
#         tool: Literal["editor", "select", "sketch", "color-sketch"] | None = None,
#         type: Literal["pil"] = "pil",
#         label: str | None = None,
#         show_label: bool = True,
#         interactive: bool | None = None,
#         visible: bool = True,
#         streaming: bool = False,
#         elem_id: str | None = None,
#         mirror_webcam: bool = True,
#         brush_radius: float | None = None,
#         brush_color: str = "#000000",
#         **kwargs,
#     ):
#         super().__init__(
#             value=value,
#             shape=shape,
#             image_mode=image_mode,
#             invert_colors=invert_colors,
#             source=source,
#             tool=tool,
#             type=type,
#             label=label,
#             show_label=show_label,
#             interactive=interactive,
#             visible=visible,
#             streaming=streaming,
#             elem_id=elem_id,
#             mirror_webcam=mirror_webcam,
#             brush_radius=brush_radius,
#             brush_color=brush_color,
#             **kwargs,
#         )


class PlayableVideo(components.Video):
    """
    Sets: format="mp4"
    """

    is_template = True

    def __init__(
        self,
        value: str | Callable | None = None,
        *,
        format: Literal["mp4"] | None = "mp4",
        sources: list[Literal["upload", "webcam"]] = ["upload"],  # noqa: B006
        label: str | None = None,
        show_label: bool = True,
        interactive: bool | None = None,
        visible: bool = True,
        elem_id: str | None = None,
        mirror_webcam: bool = True,
        include_audio: bool | None = None,
        **kwargs,
    ):
        super().__init__(
            value=value,
            format=format,
            sources=sources,
            label=label,
            show_label=show_label,
            interactive=interactive,
            visible=visible,
            elem_id=elem_id,
            mirror_webcam=mirror_webcam,
            include_audio=include_audio,
            **kwargs,
        )


class Microphone(components.Audio):
    """
    Sets: source="microphone"
    """

    is_template = True

    def __init__(
        self,
        value: str | tuple[int, np.ndarray] | Callable | None = None,
        *,
        sources: list[Literal["upload", "microphone"]]
        | None = ["microphone"],  # noqa: B006
        type: Literal["numpy", "filepath"] = "numpy",
        label: str | None = None,
        show_label: bool = True,
        interactive: bool | None = None,
        visible: bool = True,
        streaming: bool = False,
        elem_id: str | None = None,
        **kwargs,
    ):
        super().__init__(
            value=value,
            sources=sources,
            type=type,
            label=label,
            show_label=show_label,
            interactive=interactive,
            visible=visible,
            streaming=streaming,
            elem_id=elem_id,
            **kwargs,
        )


class Files(components.File):
    """
    Sets: file_count="multiple"
    """

    is_template = True

    def __init__(
        self,
        value: str | list[str] | Callable | None = None,
        *,
        file_count: Literal["multiple"] = "multiple",
        type: Literal["filepath", "binary"] = "filepath",
        label: str | None = None,
        show_label: bool = True,
        interactive: bool | None = None,
        visible: bool = True,
        elem_id: str | None = None,
        **kwargs,
    ):
        super().__init__(
            value=value,
            file_count=file_count,
            type=type,
            label=label,
            show_label=show_label,
            interactive=interactive,
            visible=visible,
            elem_id=elem_id,
            **kwargs,
        )


class Numpy(components.Dataframe):
    """
    Sets: type="numpy"
    """

    is_template = True

    def __init__(
        self,
        value: list[list[Any]] | Callable | None = None,
        *,
        headers: list[str] | None = None,
        row_count: int | tuple[int, str] = (1, "dynamic"),
        col_count: int | tuple[int, str] | None = None,
        datatype: str | list[str] = "str",
        type: Literal["numpy"] = "numpy",
        label: str | None = None,
        show_label: bool = True,
        interactive: bool | None = None,
        visible: bool = True,
        elem_id: str | None = None,
        wrap: bool = False,
        **kwargs,
    ):
        super().__init__(
            value=value,
            headers=headers,
            row_count=row_count,
            col_count=col_count,
            datatype=datatype,
            type=type,
            label=label,
            show_label=show_label,
            interactive=interactive,
            visible=visible,
            elem_id=elem_id,
            wrap=wrap,
            **kwargs,
        )


class Matrix(components.Dataframe):
    """
    Sets: type="array"
    """

    is_template = True

    def __init__(
        self,
        value: list[list[Any]] | Callable | None = None,
        *,
        headers: list[str] | None = None,
        row_count: int | tuple[int, str] = (1, "dynamic"),
        col_count: int | tuple[int, str] | None = None,
        datatype: str | list[str] = "str",
        type: Literal["array"] = "array",
        label: str | None = None,
        show_label: bool = True,
        interactive: bool | None = None,
        visible: bool = True,
        elem_id: str | None = None,
        wrap: bool = False,
        **kwargs,
    ):
        super().__init__(
            value=value,
            headers=headers,
            row_count=row_count,
            col_count=col_count,
            datatype=datatype,
            type=type,
            label=label,
            show_label=show_label,
            interactive=interactive,
            visible=visible,
            elem_id=elem_id,
            wrap=wrap,
            **kwargs,
        )


class List(components.Dataframe):
    """
    Sets: type="array", col_count=1
    """

    is_template = True

    def __init__(
        self,
        value: list[list[Any]] | Callable | None = None,
        *,
        headers: list[str] | None = None,
        row_count: int | tuple[int, str] = (1, "dynamic"),
        col_count: Literal[1] = 1,
        datatype: str | list[str] = "str",
        type: Literal["array"] = "array",
        label: str | None = None,
        show_label: bool = True,
        interactive: bool | None = None,
        visible: bool = True,
        elem_id: str | None = None,
        wrap: bool = False,
        **kwargs,
    ):
        super().__init__(
            value=value,
            headers=headers,
            row_count=row_count,
            col_count=col_count,
            datatype=datatype,
            type=type,
            label=label,
            show_label=show_label,
            interactive=interactive,
            visible=visible,
            elem_id=elem_id,
            wrap=wrap,
            **kwargs,
        )


Mic = Microphone
