package fr.dcproject.component.comment.generic import fr.dcproject.component.citizen.CitizenRef import fr.dcproject.entity.EntityI import fr.dcproject.entity.ExtraI import fr.dcproject.entity.HasTarget import fr.dcproject.entity.TargetI import fr.dcproject.entity.TargetRef import fr.dcproject.entity.Votable import fr.dcproject.entity.VotableImp import fr.postgresjson.entity.EntityCreatedAt import fr.postgresjson.entity.EntityCreatedAtImp import fr.postgresjson.entity.EntityCreatedBy import fr.postgresjson.entity.EntityCreatedByImp import fr.postgresjson.entity.EntityDeletedAt import fr.postgresjson.entity.EntityDeletedAtImp import fr.postgresjson.entity.EntityUpdatedAt import fr.postgresjson.entity.EntityUpdatedAtImp import org.joda.time.DateTime import java.util.UUID class CommentForView( id: UUID = UUID.randomUUID(), override val createdBy: C, override val target: T, override var content: String, override val parent: CommentParent? = null, val childrenCount: Int? = null, override val deletedAt: DateTime? = null ) : ExtraI, CommentWithParentI, CommentForUpdate(id, createdBy, target, content, parent, deletedAt), CommentWithTargetI, EntityCreatedBy by EntityCreatedByImp(createdBy), EntityUpdatedAt by EntityUpdatedAtImp(), EntityDeletedAt by EntityDeletedAtImp(), Votable by VotableImp(), TargetI { constructor( createdBy: C, parent: CommentParent, content: String ) : this( createdBy = createdBy, parent = parent, target = parent.target, content = content ) } open class CommentForUpdate( override val id: UUID = UUID.randomUUID(), override val createdBy: C, override val target: T, open var content: String, override val parent: CommentParent? = null, override val deletedAt: DateTime? = null ) : CommentParent(id, deletedAt, target), CommentWithParentI, ExtraI, CommentWithTargetI, EntityCreatedAt by EntityCreatedAtImp(), EntityCreatedBy, EntityDeletedAt, TargetI { constructor( createdBy: C, parent: CommentParent, content: String ) : this( createdBy = createdBy, parent = parent, target = parent.target, content = content ) } open class CommentParent( override val id: UUID, override val deletedAt: DateTime?, override val target: T ) : CommentRef(id), CommentParentI interface CommentParentI : CommentI, EntityDeletedAt, CommentWithTargetI interface CommentWithTargetI : CommentI, TargetI, HasTarget interface CommentWithParentI { val parent: CommentParent? } open class CommentRef(id: UUID = UUID.randomUUID()) : CommentI, TargetRef(id) interface CommentI : EntityI