package ru.ulstu.students.model;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.validator.constraints.NotEmpty;
import ru.ulstu.deadline.model.Deadline;
import ru.ulstu.tags.model.Tag;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Set;
import java.util.stream.Collectors;

public class TaskDto {

    private final static int MAX_TAGS_LENGTH = 50;

    private Integer id;
    @NotEmpty
    private String title;
    private String description;
    private Task.TaskStatus status;
    private List<Deadline> deadlines = new ArrayList<>();
    private Date createDate;
    private Date updateDate;
    private Set<Integer> tagIds;
    private List<Tag> tags;

    public TaskDto() {
        deadlines.add(new Deadline());
    }

    @JsonCreator
    public TaskDto(@JsonProperty("id") Integer id,
                   @JsonProperty("title") String title,
                   @JsonProperty("description") String description,
                   @JsonProperty("createDate") Date createDate,
                   @JsonProperty("updateDate") Date updateDate,
                   @JsonProperty("status") Task.TaskStatus status,
                   @JsonProperty("deadlines") List<Deadline> deadlines,
                   @JsonProperty("tagIds") Set<Integer> tagIds,
                   @JsonProperty("tags") List<Tag> tags) {
        this.id = id;
        this.title = title;
        this.status = status;
        this.deadlines = deadlines;
        this.createDate = createDate;
        this.updateDate = updateDate;
        this.description = description;
        this.tags = tags;
    }

    public TaskDto(Task task) {
        this.id = task.getId();
        this.title = task.getTitle();
        this.status = task.getStatus();
        this.deadlines = task.getDeadlines();
        this.createDate = task.getCreateDate();
        this.updateDate = task.getUpdateDate();
        this.description = task.getDescription();
        this.tags = task.getTags();
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public Task.TaskStatus getStatus() {
        return status;
    }

    public void setStatus(Task.TaskStatus status) {
        this.status = status;
    }

    public List<Deadline> getDeadlines() {
        return deadlines;
    }

    public void setDeadlines(List<Deadline> deadlines) {
        this.deadlines = deadlines;
    }

    public Date getCreateDate() {
        return createDate;
    }

    public void setCreateDate(Date createDate) {
        this.createDate = createDate;
    }

    public Date getUpdateDate() {
        return updateDate;
    }

    public void setUpdateDate(Date updateDate) {
        this.updateDate = updateDate;
    }

    public Set<Integer> getTagIds() {
        return tagIds;
    }

    public void setTagIds(Set<Integer> tagIds) {
        this.tagIds = tagIds;
    }

    public List<Tag> getTags() {
        return tags;
    }

    public void setTags(List<Tag> tags) {
        this.tags = tags;
    }

    public String getTagsString() {
        return StringUtils.abbreviate(tags
                .stream()
                .map(tag -> tag.getTagName())
                .collect(Collectors.joining(", ")), MAX_TAGS_LENGTH);
    }
}