"""GitHub commit data class."""

from __future__ import annotations

from typing import Any, Dict

from .base import GitHubDataModelBase
from .user import GitHubUserModel


class _Author(GitHubDataModelBase):
    """Internal entry."""

    name: str | None = None
    email: str | None = None
    date: str | None = None


class _Committer(_Author):
    """Internal entry."""


class _Tree(GitHubDataModelBase):
    """Internal entry."""

    sha: str | None = None
    url: str | None = None


class _Verification(GitHubDataModelBase):
    """Internal entry."""

    verified: bool | None = None
    reason: str | None = None
    signature: str | None = None
    payload: str | None = None


class _Parents(GitHubDataModelBase):
    """Internal entry."""

    sha: str | None = None
    url: str | None = None
    html_url: str | None = None


class _Commit(GitHubDataModelBase):
    """Internal entry."""

    author: _Author | None = None
    committer: _Committer | None = None
    message: str | None = None
    tree: _Tree | None = None
    url: str | None = None
    comment_count: int | None = None
    verification: _Verification | None = None

    def _generate_author(self, data: Dict[str, Any] | None) -> _Author:
        """Generate author data."""
        return _Author(data) if data else None

    def _generate_committer(self, data: Dict[str, Any] | None) -> _Committer:
        """Generate committer data."""
        return _Committer(data) if data else None

    def _generate_tree(self, data: Dict[str, Any] | None) -> _Tree:
        """Generate tree data."""
        return _Tree(data) if data else None

    def _generate_verification(self, data: Dict[str, Any] | None) -> _Verification:
        """Generate verification data."""
        return _Verification(data) if data else None


class GitHubCommitModel(GitHubDataModelBase):
    """GitHub commit data class."""

    sha: str | None = None
    commit: _Commit | None = None
    url: str | None = None
    html_url: str | None = None
    comments_url: str | None = None
    author: GitHubUserModel | None = None
    committer: GitHubUserModel | None = None
    parents: list[_Parents] | None = None

    def _generate_commit(self, data: Dict[str, Any] | None) -> _Commit:
        """Generate commit data."""
        return _Commit(data) if data else None

    def _generate_author(self, data: Dict[str, Any] | None) -> GitHubUserModel:
        """Generate author data."""
        return GitHubUserModel(data) if data else None

    def _generate_committer(self, data: Dict[str, Any] | None) -> GitHubUserModel:
        """Generate committer data."""
        return GitHubUserModel(data) if data else None
