package kr.itn.itnhub.mattermost;

import kr.itn.itnhub.feed.FileRef;
import kr.itn.itnhub.feed.FileView;
import kr.itn.itnhub.feed.PostView;

import java.util.List;
import java.util.Optional;

public interface MattermostClient {

    Optional<String> findChannelIdByInternalName(String internalName);

    Optional<String> findChannelIdByDisplayName(String displayName);

    String createPrivateChannel(String internalName, String displayName);

    /** 채널의 최근 게시글 한 페이지를 오래된순(화면 표시 순서)으로 돌려준다. */
    List<PostView> getRecentPosts(String channelId, int perPage);

    /** 채널 전체를 페이지네이션하며 첨부파일을 전부 모아 최신순으로 돌려준다. */
    List<FileView> collectChannelFiles(String channelId);

    byte[] downloadFile(String fileId);

    FileRef fileInfo(String fileId);

    /** 파일을 채널에 업로드하고 file id를 돌려준다. 아직 어떤 게시글에도 첨부되지 않은 상태다. */
    String uploadFile(String channelId, String filename, byte[] data, String contentType);

    /** 채널에 게시글을 올리고 post id를 돌려준다. {@code fileIds}는 비어 있어도 된다. */
    String createPost(String channelId, String message, List<String> fileIds);

    void pinPost(String postId);

    void unpinPost(String postId);

    /** 채널의 고정된 게시글을 최신순으로 돌려준다. */
    List<PostView> getPinnedPosts(String channelId);

    void updateChannelHeader(String channelId, String header);

    /** 이메일로 사용자를 찾는다. 없으면 빈 값이다. */
    Optional<String> findUserIdByEmail(String email);

    /** 사용자를 새로 만들고 user id를 돌려준다. */
    String createUser(String email, String username, String password);

    /** 사용자를 (설정된) 팀에 추가한다. 채널 추가 전에 반드시 선행되어야 한다. */
    void addUserToTeam(String userId);

    /** 사용자를 채널에 추가한다. 이미 멤버여도 안전하다(idempotent). */
    void addUserToChannel(String channelId, String userId);

    /**
     * 채널을 보관 처리한다. Mattermost의 {@code DELETE /channels/{id}}는 삭제가 아니라
     * 아카이브라서 게시글·파일이 남고 시스템 콘솔에서 되돌릴 수 있다.
     *
     * <p>영구 삭제({@code ?permanent=true})는 일부러 쓰지 않는다. 운영 서버의
     * {@code ServiceSettings.EnableAPIChannelDeletion}이 꺼져 있어 어차피 거부되고,
     * 켜더라도 복구가 불가능하기 때문이다.</p>
     */
    void archiveChannel(String channelId);
}
