package eu.mulk.mulkcms2.benki.users;

import eu.mulk.mulkcms2.benki.accesscontrol.PageKey;
import eu.mulk.mulkcms2.benki.accesscontrol.Role;
import eu.mulk.mulkcms2.benki.bookmarks.Bookmark;
import eu.mulk.mulkcms2.benki.lazychat.LazychatMessage;
import eu.mulk.mulkcms2.benki.posts.Post;
import eu.mulk.mulkcms2.benki.wiki.WikiPageRevision;
import io.quarkus.hibernate.orm.panache.PanacheEntityBase;
import jakarta.persistence.CollectionTable;
import jakarta.persistence.Column;
import jakarta.persistence.ElementCollection;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.JoinTable;
import jakarta.persistence.ManyToMany;
import jakarta.persistence.OneToMany;
import jakarta.persistence.OneToOne;
import jakarta.persistence.Table;
import jakarta.persistence.Transient;
import java.util.Collection;
import java.util.List;
import java.util.Objects;
import java.util.Set;
import javax.annotation.CheckForNull;

@Entity(name = "BenkiUser")
@Table(name = "users", schema = "benki")
public class User extends PanacheEntityBase {

  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "id", nullable = false)
  public Integer id;

  @Column(name = "first_name", nullable = true, length = -1)
  @CheckForNull
  public String firstName;

  @Column(name = "middle_names", nullable = true, length = -1)
  @CheckForNull
  public String middleNames;

  @Column(name = "last_name", nullable = true, length = -1)
  @CheckForNull
  public String lastName;

  @Column(name = "email", nullable = true, length = -1)
  @CheckForNull
  public String email;

  @Column(name = "website", nullable = true, length = -1)
  @CheckForNull
  public String website;

  @Column(name = "status", nullable = true, length = -1)
  @CheckForNull
  public String status;

  @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
  public Collection<Bookmark> bookmarks;

  @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
  public Collection<LazychatMessage> lazychatMessages;

  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(name = "openids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
  @Column(name = "openid")
  public Set<String> openids;

  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
  public Collection<PageKey> pageKeys;

  @OneToMany(mappedBy = "owner", fetch = FetchType.LAZY)
  public Collection<Post> posts;

  @ManyToMany(fetch = FetchType.LAZY)
  @JoinTable(
      name = "user_default_target",
      schema = "benki",
      joinColumns = @JoinColumn(name = "user"),
      inverseJoinColumns = @JoinColumn(name = "target"))
  public Set<Role> defaultTargets;

  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(
      name = "user_email_addresses",
      schema = "benki",
      joinColumns = @JoinColumn(name = "user"))
  @Column(name = "email")
  public Set<String> emailAddresses;

  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(name = "user_jids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
  @Column(name = "jid")
  public Set<String> jids;

  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(
      name = "user_nicknames",
      schema = "benki",
      joinColumns = @JoinColumn(name = "user"))
  @Column(name = "nickname")
  public Set<String> nicknames;

  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
  public Collection<UserRole> directRoles;

  @OneToMany(mappedBy = "user", fetch = FetchType.LAZY)
  public Collection<RsaKey> rsaKeys;

  @OneToOne(fetch = FetchType.LAZY)
  @JoinColumn(name = "role", referencedColumnName = "id", nullable = false)
  public Role ownedRole;

  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(name = "webids", schema = "benki", joinColumns = @JoinColumn(name = "user"))
  @Column(name = "webid")
  public Set<String> webids;

  @OneToMany(mappedBy = "author", fetch = FetchType.LAZY)
  public Collection<WikiPageRevision> wikiPageRevisions;

  @ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
  public Set<Post> visiblePosts;

  @ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
  public Set<Bookmark> visibleBookmarks;

  @ManyToMany(mappedBy = "visibleTo", fetch = FetchType.LAZY)
  public Set<LazychatMessage> visibleLazychatMessages;

  @ManyToMany(fetch = FetchType.LAZY)
  @JoinTable(
      name = "effective_user_roles",
      schema = "benki",
      joinColumns = @JoinColumn(name = "user"),
      inverseJoinColumns = @JoinColumn(name = "role"))
  public Set<Role> effectiveRoles;

  @Transient
  public String getFirstAndLastName() {
    return String.format("%s %s", firstName, lastName);
  }

  public static User findByNickname(String nickname) {
    return User.find("from BenkiUser u join u.nicknames n where ?1 = n", nickname).singleResult();
  }

  public static User findByNicknameWithRoles(String nickname) {
    return User.find(
            ""
                + "from BenkiUser u "
                + "join u.nicknames n "
                + "left join fetch u.effectiveRoles r "
                + "left join fetch r.tags "
                + "where ?1 = n",
            nickname)
        .singleResult();
  }

  public static List<User> findAdmins() {
    return find("select distinct u from BenkiUser u left join u.effectiveRoles r left join r.tags t where t = 'admin' or u.status = 'admin'")
        .list();
  }

  public final boolean canSee(Post message) {
    return message.isVisibleTo(this);
  }

  @Override
  public boolean equals(Object o) {
    if (this == o) {
      return true;
    }
    if (!(o instanceof User)) {
      return false;
    }
    User user = (User) o;
    return Objects.equals(id, user.id);
  }

  @Override
  public int hashCode() {
    return Objects.hash(id);
  }
}
