# Copyright Pincer 2021-Present
# Full MIT License can be found in `LICENSE` at the project root.

from __future__ import annotations

from dataclasses import dataclass
from enum import IntEnum

from ..objects.emoji import Emoji
from ..utils import APIObject, APINullable, MISSING


class ButtonStyle(IntEnum):
    """
    Buttons come in a variety of styles to convey different types of actions.
    These styles also define what fields are valid for a button.

    Primary:
        - color: blurple
        - required_field: custom_id
    Secondary:
        - color: gray
        - required_field: custom_id
    Success:
        - color: green
        - required_field: custom_id
    Danger:
        - color: red
        - required_field: custom_id
    Link:
        - color: gray, navigates to a URL
        - required_field: url
    """
    PRIMARY = 1
    SECONDARY = 2
    SUCCESS = 3
    DANGER = 4
    LINK = 5


@dataclass
class Button(APIObject):
    """
    Represents a Discord Button object.
    Buttons are interactive components that render on messages.

    They can be clicked by users,
    and send an interaction to your app when clicked.

    :param type:
        `2` for a button

    :param style:
        one of button styles

    :param label:
        text that appears on the button, max 80 characters

    :param emoji:
        `name`, `id`, and `animated`

    :param custom_id:
        a developer-defined identifier for the button,
        max 100 characters

    :param url:
        a url for link-style buttons

    :param disabled:
        whether the button is disabled (default `False`)
    """
    type: int
    style: ButtonStyle

    label: APINullable[str] = MISSING
    emoji: APINullable[Emoji] = MISSING
    custom_id: APINullable[str] = MISSING
    url: APINullable[str] = MISSING
    disabled: APINullable[bool] = False
