# Copyright (c) 2021 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher.
from datetime import datetime
from typing import Optional, List, Dict, Any

from .BaseModel import BaseModel
from .DigitalFactoryFileResponse import DIGITAL_FACTORY_RESPONSE_DATETIME_FORMAT


class DigitalFactoryProjectResponse(BaseModel):
    """Class representing a cloud project."""

    def __init__(self,
                 library_project_id: str,
                 display_name: str,
                 username: str,
                 organization_shared: bool,
                 last_updated: Optional[str] = None,
                 created_at: Optional[str] = None,
                 thumbnail_url: Optional[str] = None,
                 organization_id: Optional[str] = None,
                 created_by_user_id: Optional[str] = None,
                 description: Optional[str] = "",
                 tags: Optional[List[str]] = None,
                 team_ids: Optional[List[str]] = None,
                 status: Optional[str] = None,
                 technical_requirements: Optional[Dict[str, Any]] = None,
                 **kwargs) -> None:
        """
        Creates a new digital factory project response object
        :param library_project_id:
        :param display_name:
        :param username:
        :param organization_shared:
        :param thumbnail_url:
        :param created_by_user_id:
        :param description:
        :param tags:
        :param kwargs:
        """

        self.library_project_id = library_project_id
        self.display_name = display_name
        self.description = description
        self.username = username
        self.organization_shared = organization_shared
        self.organization_id = organization_id
        self.created_by_user_id = created_by_user_id
        self.thumbnail_url = thumbnail_url
        self.tags = tags
        self.team_ids = team_ids
        self.created_at = datetime.strptime(created_at, DIGITAL_FACTORY_RESPONSE_DATETIME_FORMAT) if created_at else None
        self.last_updated = datetime.strptime(last_updated, DIGITAL_FACTORY_RESPONSE_DATETIME_FORMAT) if last_updated else None
        self.status = status
        self.technical_requirements = technical_requirements
        super().__init__(**kwargs)

    def __str__(self) -> str:
        return "Project: {}, Id: {}, from: {}".format(self.display_name, self.library_project_id, self.username)

    # Validates the model, raising an exception if the model is invalid.
    def validate(self) -> None:
        super().validate()
        if not self.library_project_id:
            raise ValueError("library_project_id is required on cloud project")
