import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import qs.Commons

Rectangle {
  id: root

  property date sampleDate: new Date() // Dec 25, 2023, 2:30:45.123 PM

  signal tokenClicked(string token)

  color: Color.mSurface
  border.color: Color.mOutline
  border.width: Style.borderS
  radius: Style.radiusM

  ColumnLayout {
    id: column
    anchors.fill: parent
    anchors.margins: Style.marginS
    spacing: Style.marginS

    NListView {
      id: tokensList
      Layout.fillWidth: true
      Layout.fillHeight: true
      model: [
        // Common format combinations
        {
          "category": "Common",
          "token": "h:mm AP",
          "description": I18n.tr("widgets.datetime-tokens.common.12hour-time-minutes"),
          "example": "2:30 PM"
        },
        {
          "category": "Common",
          "token": "HH:mm",
          "description": I18n.tr("widgets.datetime-tokens.common.24hour-time-minutes"),
          "example": "14:30"
        },
        {
          "category": "Common",
          "token": "HH:mm:ss",
          "description": I18n.tr("widgets.datetime-tokens.common.24hour-time-seconds"),
          "example": "14:30:45"
        },
        {
          "category": "Common",
          "token": "ddd MMM d",
          "description": I18n.tr("widgets.datetime-tokens.common.weekday-month-day"),
          "example": "Mon Dec 25"
        },
        {
          "category": "Common",
          "token": "yyyy-MM-dd",
          "description": I18n.tr("widgets.datetime-tokens.common.iso-date"),
          "example": "2023-12-25"
        },
        {
          "category": "Common",
          "token": "MM/dd/yyyy",
          "description": I18n.tr("widgets.datetime-tokens.common.us-date"),
          "example": "12/25/2023"
        },
        {
          "category": "Common",
          "token": "dd.MM.yyyy",
          "description": I18n.tr("widgets.datetime-tokens.common.european-date"),
          "example": "25.12.2023"
        },
        {
          "category": "Common",
          "token": "ddd, MMM dd",
          "description": I18n.tr("widgets.datetime-tokens.common.weekday-date"),
          "example": "Fri, Dec 12"
        } // Hour tokens
        ,
        {
          "category": "Hour",
          "token": "H",
          "description": I18n.tr("widgets.datetime-tokens.hour.no-leading-zero"),
          "example": "14"
        },
        {
          "category": "Hour",
          "token": "HH",
          "description": I18n.tr("widgets.datetime-tokens.hour.leading-zero"),
          "example": "14"
        } // Minute tokens
        ,
        {
          "category": "Minute",
          "token": "m",
          "description": I18n.tr("widgets.datetime-tokens.minute.no-leading-zero"),
          "example": "30"
        },
        {
          "category": "Minute",
          "token": "mm",
          "description": I18n.tr("widgets.datetime-tokens.minute.leading-zero"),
          "example": "30"
        } // Second tokens
        ,
        {
          "category": "Second",
          "token": "s",
          "description": I18n.tr("widgets.datetime-tokens.second.no-leading-zero"),
          "example": "45"
        },
        {
          "category": "Second",
          "token": "ss",
          "description": I18n.tr("widgets.datetime-tokens.second.leading-zero"),
          "example": "45"
        } // AM/PM tokens
        ,
        {
          "category": "AM/PM",
          "token": "AP",
          "description": I18n.tr("widgets.datetime-tokens.ampm.uppercase"),
          "example": "PM"
        },
        {
          "category": "AM/PM",
          "token": "ap",
          "description": I18n.tr("widgets.datetime-tokens.ampm.lowercase"),
          "example": "pm"
        } // Timezone tokens
        ,
        {
          "category": "Timezone",
          "token": "t",
          "description": I18n.tr("widgets.datetime-tokens.timezone.abbreviation"),
          "example": "UTC"
        } // Year tokens
        ,
        {
          "category": "Year",
          "token": "yy",
          "description": I18n.tr("widgets.datetime-tokens.year.two-digit"),
          "example": "23"
        },
        {
          "category": "Year",
          "token": "yyyy",
          "description": I18n.tr("widgets.datetime-tokens.year.four-digit"),
          "example": "2023"
        } // Month tokens
        ,
        {
          "category": "Month",
          "token": "M",
          "description": I18n.tr("widgets.datetime-tokens.month.number-no-zero"),
          "example": "12"
        },
        {
          "category": "Month",
          "token": "MM",
          "description": I18n.tr("widgets.datetime-tokens.month.number-leading-zero"),
          "example": "12"
        },
        {
          "category": "Month",
          "token": "MMM",
          "description": I18n.tr("widgets.datetime-tokens.month.abbreviated"),
          "example": "Dec"
        },
        {
          "category": "Month",
          "token": "MMMM",
          "description": I18n.tr("widgets.datetime-tokens.month.full"),
          "example": "December"
        } // Day tokens
        ,
        {
          "category": "Day",
          "token": "d",
          "description": I18n.tr("widgets.datetime-tokens.day.no-leading-zero"),
          "example": "25"
        },
        {
          "category": "Day",
          "token": "dd",
          "description": I18n.tr("widgets.datetime-tokens.day.leading-zero"),
          "example": "25"
        },
        {
          "category": "Day",
          "token": "ddd",
          "description": I18n.tr("widgets.datetime-tokens.day.abbreviated"),
          "example": "Mon"
        },
        {
          "category": "Day",
          "token": "dddd",
          "description": I18n.tr("widgets.datetime-tokens.day.full"),
          "example": "Monday"
        }
      ]

      delegate: Rectangle {
        id: tokenDelegate
        width: tokensList.width
        height: layout.implicitHeight + Style.marginS
        radius: Style.radiusS
        color: {
          if (tokenMouseArea.containsMouse) {
            return Qt.alpha(Color.mPrimary, 0.1);
          }
          return index % 2 === 0 ? Color.mSurfaceVariant : Qt.alpha(Color.mSurfaceVariant, 0.6);
        }

        // Mouse area for the entire delegate
        MouseArea {
          id: tokenMouseArea
          anchors.fill: parent
          hoverEnabled: true
          cursorShape: Qt.PointingHandCursor

          onClicked: {
            root.tokenClicked(modelData.token);
            clickAnimation.start();
          }
        }

        // Click animation
        SequentialAnimation {
          id: clickAnimation
          PropertyAnimation {
            target: tokenDelegate
            property: "color"
            to: Qt.alpha(Color.mPrimary, 0.3)
            duration: 100
          }
          PropertyAnimation {
            target: tokenDelegate
            property: "color"
            to: tokenMouseArea.containsMouse ? Qt.alpha(Color.mPrimary, 0.1) : (index % 2 === 0 ? Color.mSurface : Color.mSurfaceVariant)
            duration: 200
          }
        }

        RowLayout {
          id: layout
          anchors.fill: parent
          anchors.margins: Style.marginXS
          spacing: Style.marginM

          // Category badge
          Rectangle {
            Layout.alignment: Qt.AlignVCenter
            width: 70
            height: 22
            color: getCategoryColor(modelData.category)[0]
            radius: Style.radiusS
            opacity: tokenMouseArea.containsMouse ? 0.9 : 1.0

            Behavior on opacity {
              NumberAnimation {
                duration: Style.animationFast
              }
            }

            NText {
              anchors.centerIn: parent
              text: modelData.category
              color: getCategoryColor(modelData.category)[1]
              pointSize: Style.fontSizeXS
            }
          }

          // Token - Made more prominent and clickable
          Rectangle {
            id: tokenButton
            Layout.alignment: Qt.AlignVCenter // Added this line
            width: 100
            height: 22
            color: tokenMouseArea.containsMouse ? Color.mPrimary : Color.mOnSurface
            radius: Style.radiusS

            Behavior on color {
              ColorAnimation {
                duration: Style.animationFast
              }
            }

            NText {
              anchors.centerIn: parent
              text: modelData.token
              color: tokenMouseArea.containsMouse ? Color.mOnPrimary : Color.mSurface
              pointSize: Style.fontSizeS
              font.weight: Style.fontWeightBold

              Behavior on color {
                ColorAnimation {
                  duration: Style.animationFast
                }
              }
            }
          }

          // Description
          NText {
            Layout.fillWidth: true
            Layout.alignment: Qt.AlignVCenter // Added this line
            text: modelData.description
            color: tokenMouseArea.containsMouse ? Color.mOnSurface : Color.mOnSurfaceVariant
            pointSize: Style.fontSizeS
            wrapMode: Text.WordWrap

            Behavior on color {
              ColorAnimation {
                duration: Style.animationFast
              }
            }
          }

          // Live example
          Rectangle {
            Layout.alignment: Qt.AlignVCenter // Added this line
            width: 90
            height: 22
            color: tokenMouseArea.containsMouse ? Color.mPrimary : Color.mOnSurfaceVariant
            radius: Style.radiusS
            border.color: tokenMouseArea.containsMouse ? Color.mPrimary : Color.mOutline
            border.width: Style.borderS

            Behavior on color {
              ColorAnimation {
                duration: Style.animationFast
              }
            }

            Behavior on border.color {
              ColorAnimation {
                duration: Style.animationFast
              }
            }

            NText {
              anchors.centerIn: parent
              text: I18n.locale.toString(root.sampleDate, modelData.token)
              color: tokenMouseArea.containsMouse ? Color.mOnPrimary : Color.mSurfaceVariant
              pointSize: Style.fontSizeS

              Behavior on color {
                ColorAnimation {
                  duration: Style.animationFast
                }
              }
            }
          }
        }
      }
    }
  }

  function getCategoryColor(category) {
    switch (category) {
    case "Year":
      return [Color.mPrimary, Color.mOnPrimary];
    case "Month":
      return [Color.mSecondary, Color.mOnSecondary];
    case "Day":
      return [Color.mTertiary, Color.mOnTertiary];
    case "Hour":
      return [Color.mPrimary, Color.mOnPrimary];
    case "Minute":
      return [Color.mSecondary, Color.mOnSecondary];
    case "Second":
      return [Color.mTertiary, Color.mOnTertiary];
    case "AM/PM":
      return [Color.mError, Color.mOnError];
    case "Timezone":
      return [Color.mOnSurface, Color.mSurface];
    case "Common":
      return [Color.mError, Color.mOnError];
    default:
      return [Color.mOnSurfaceVariant, Color.mSurfaceVariant];
    }
  }
}
