#    Copyright (C) 2025 James Brotosky, Brandon Wickline
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU Affero General Public License as published
#    by the Free Software Foundation, either version 3 of the License, or
#    (at your option) any later version.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU Affero General Public License for more details.
#
#    You should have received a copy of the GNU Affero General Public License
#    along with this program.  If not, see <https://www.gnu.org/licenses/>.


"""
Policy model representing policy data and relationships.
"""


# policy.py

from dataclasses import asdict, dataclass, field
import json
from typing import Optional


@dataclass(order=True)
class Policy:
    name: str
    groupid: int = field(compare=False)
    hidden: bool = field(compare=False)
    parent: Optional[str] = field(default=None, compare=False)

    def __repr__(self) -> str:
        attrs = ", ".join(
            f"{key}={repr(value)}" for key, value in self.__dict__.items()
        )
        return f"<Execution({attrs})>"

    def to_dict(self) -> dict:
        return asdict(self)

    def to_json(self) -> str:
        return json.dumps(self.to_dict(), default=str)


class Allowlist:
    """
    Represents Allowlist
    """

    def __init__(self, applicationid, name, version):
        self.applicationid = applicationid
        self.name = name
        self.version = version

    def __repr__(self):
        # Show all current attributes, including dynamically added ones
        attrs = ", ".join(
            f"{key}={repr(value)}" for key, value in self.__dict__.items()
        )
        return f"<Execution({attrs})>"

    def to_dict(self):
        # Return all attributes as a dictionary
        return self.__dict__

    def to_json(self):
        # Convert to JSON string, handling non-serializable types gracefully
        return json.dumps(self.to_dict(), default=str)
