package models;

import models.enumeration.ResourceType;
import models.resource.GlobalResource;
import models.resource.Resource;
import models.resource.ResourceConvertible;
import play.data.validation.Constraints.Required;
import play.db.ebean.Model;

import javax.persistence.*;
import java.util.Set;

/**
 * 프로젝트에 붙일 수 있는 라벨
 */
@Entity
@Table(uniqueConstraints = @UniqueConstraint(columnNames = {"category", "name"}))
public class Label extends Model implements ResourceConvertible {

    /**
     *
     */
    private static final long serialVersionUID = -35487506476718498L;
    public static final Finder<Long, Label> find = new Finder<>(Long.class, Label.class);

    @Id
    public Long id;

    @Required
    public String category;

    @Required
    public String name;

    @ManyToMany(mappedBy="labels")
    public Set<Project> projects;

    /**
     * 주어진 {@code category}와 {@code name}으로 라벨를 생성한다.
     * @param category 이 라벨가 속한 분류
     * @param name 이 라벨의 이름
     */
    public Label(String category, String name) {
        if (category == null) {
            category = "Label";
        }
        this.category = category;
        this.name = name;
    }

    /**
     * 현재 인스턴스와 같은 라벨가 있는지의 여부를 반환한다.
     *
     * when: 사용자가 라벨를 추가하려고 했을 때, 중복 여부를 검사하고자 할 때 사용하고 있다.
     *
     * 이 인스턴스의 {@link Label#category}와 {@link Label#name}가 모두 같은 라벨가 DB에 존재하는지 확인한다.
     *
     * @return 같은 것이 존재하면 {@code true}, 아니면 {@code false}
     */
    @Transient
    public boolean exists() {
        return find.where().eq("category", category).eq("name", name)
            .findRowCount() > 0;
    }

    /**
     * 라벨를 삭제한다.
     *
     * 모든 프로젝트에서 이 라벨를 제거한 뒤, 라벨를 삭제한다.
     */
    @Override
    public void delete() {
        for(Project project: projects) {
            project.labels.remove(this);
            project.update();
        }
        super.delete();
    }


    /**
     * 라벨를 문자열로 변환하여 반환한다.
     *
     * {@link Label#category}와 {@link Label#name}을 " - "로 연결한 문자열을 반환한다.
     *
     * @return "{@link Label#category} - {@link Label#name}" 형식의 문자열
     */
    @Override
    public String toString() {
        return category + " - " + name;
    }

    /**
     * 라벨를 {@link Resource} 형식으로 반환한다.
     *
     * when: 이 라벨에 대해 접근권한이 있는지 검사하기 위해 {@link utils.AccessControl}에서 사용한다.
     *
     * @return {@link Resource}로서의 라벨
     */
    @Override
    public Resource asResource() {
        return new GlobalResource() {
            @Override
            public String getId() {
                return id.toString();
            }

            @Override
            public ResourceType getType() {
                return ResourceType.LABEL;
            }
        };
    }

    public void delete(Project project) {
        this.projects.remove(project);
    }
}

@@ -1173,441 +1173,8 @@
  %7D%0A%0A
-    /**%0A     * %ED%98%84%EC%9E%AC %EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%99%80 %EA%B0%99%EC%9D%80 %EB%9D%BC%EB%B2%A8%EA%B0%80 %EC%9E%88%EB%8A%94%EC%A7%80%EC%9D%98 %EC%97%AC%EB%B6%80%EB%A5%BC %EB%B0%98%ED%99%98%ED%95%9C%EB%8B%A4.%0A     *%0A     * when: %EC%82%AC%EC%9A%A9%EC%9E%90%EA%B0%80 %EB%9D%BC%EB%B2%A8%EB%A5%BC %EC%B6%94%EA%B0%80%ED%95%98%EB%A0%A4%EA%B3%A0 %ED%96%88%EC%9D%84 %EB%95%8C, %EC%A4%91%EB%B3%B5 %EC%97%AC%EB%B6%80%EB%A5%BC %EA%B2%80%EC%82%AC%ED%95%98%EA%B3%A0%EC%9E%90 %ED%95%A0 %EB%95%8C %EC%82%AC%EC%9A%A9%ED%95%98%EA%B3%A0 %EC%9E%88%EB%8B%A4.%0A     *%0A     * %EC%9D%B4 %EC%9D%B8%EC%8A%A4%ED%84%B4%EC%8A%A4%EC%9D%98 %7B@link Label#category%7D%EC%99%80 %7B@link Label#name%7D%EA%B0%80 %EB%AA%A8%EB%91%90 %EA%B0%99%EC%9D%80 %EB%9D%BC%EB%B2%A8%EA%B0%80 DB%EC%97%90 %EC%A1%B4%EC%9E%AC%ED%95%98%EB%8A%94%EC%A7%80 %ED%99%95%EC%9D%B8%ED%95%9C%EB%8B%A4.%0A     *%0A     * @return %EA%B0%99%EC%9D%80 %EA%B2%83%EC%9D%B4 %EC%A1%B4%EC%9E%AC%ED%95%98%EB%A9%B4 %7B@code true%7D, %EC%95%84%EB%8B%88%EB%A9%B4 %7B@code false%7D%0A     */%0A    @Transient%0A    public boolean exists() %7B%0A        return find.where().eq(%22category%22, category).eq(%22name%22, name)%0A            .findRowCount() %3E 0;%0A    %7D%0A%0A
     

Remove unused "Label.exists()"