package ru.ulstu.paper.model;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import ru.ulstu.user.model.UserDto;

import java.util.Date;
import java.util.List;

import static ru.ulstu.core.util.StreamApiUtils.convert;

public class PaperDto {
    private final Integer id;
    private final String title;
    private final Paper.PaperStatus status;
    private final Date createDate;
    private final Date updateDate;
    private final Date deadlineDate;
    private final String comment;
    private final Boolean locked;
    private final String tmpFileName;
    private final Integer fileId;
    private final String fileName;
    private final Date fileCreateDate;
    private final List<UserDto> authors;

    @JsonCreator
    public PaperDto(@JsonProperty("id") Integer id,
                    @JsonProperty("title") String title,
                    @JsonProperty("status") Paper.PaperStatus status,
                    @JsonProperty("createDate") Date createDate,
                    @JsonProperty("updateDate") Date updateDate,
                    @JsonProperty("deadlineDate") Date deadlineDate,
                    @JsonProperty("comment") String comment,
                    @JsonProperty("locked") Boolean locked,
                    @JsonProperty("tmpFileName") String tmpFileName,
                    @JsonProperty("authors") List<UserDto> authors) {
        this.id = id;
        this.title = title;
        this.status = status;
        this.createDate = createDate;
        this.updateDate = updateDate;
        this.deadlineDate = deadlineDate;
        this.comment = comment;
        this.locked = locked;
        this.tmpFileName = tmpFileName;
        this.fileId = null;
        this.fileName = null;
        this.fileCreateDate = null;
        this.authors = authors;
    }

    public PaperDto(Paper paper) {
        this.id = paper.getId();
        this.title = paper.getTitle();
        this.status = paper.getStatus();
        this.createDate = paper.getCreateDate();
        this.updateDate = paper.getUpdateDate();
        this.deadlineDate = paper.getDeadlineDate();
        this.comment = paper.getComment();
        this.locked = paper.getLocked();
        this.tmpFileName = null;
        this.fileId = paper.getFileData() == null ? null : paper.getFileData().getId();
        this.fileName = paper.getFileData() == null ? null : paper.getFileData().getName();
        this.fileCreateDate = paper.getFileData() == null ? null : paper.getFileData().getCreateDate();
        this.authors = convert(paper.getAuthors(), UserDto::new);
    }

    public Integer getId() {
        return id;
    }

    public String getTitle() {
        return title;
    }

    public Paper.PaperStatus getStatus() {
        return status;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public Date getUpdateDate() {
        return updateDate;
    }

    public Date getDeadlineDate() {return  deadlineDate;}

    public String getComment() {
        return comment;
    }

    public Boolean getLocked() {
        return locked;
    }

    public String getTmpFileName() {
        return tmpFileName;
    }

    public Integer getFileId() {
        return fileId;
    }

    public String getFileName() {
        return fileName;
    }

    public Date getFileCreateDate() {
        return fileCreateDate;
    }

    public List<UserDto> getAuthors() {
        return authors;
    }
}
