package org.ntlab.tampoposerver.resources;


import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import org.ntlab.tampoposerver.models.ChatRequest;
import org.ntlab.tampoposerver.models.ChatRooms;
import org.ntlab.tampoposerver.models.FriendRequest;
import org.ntlab.tampoposerver.models.User;
import org.ntlab.tampoposerver.repositories.ChatRequestRepository;
import org.ntlab.tampoposerver.repositories.ChatRoomsRepository;
import org.ntlab.tampoposerver.repositories.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;


import java.util.ArrayList;
import java.util.List;


import static javax.ws.rs.core.Response.status;

@Path("/chat-rooms")
@Component
public class ChatRoomsResource {
    private final ChatRoomsRepository chatRoomsRepository;
    private final UserRepository userRepository;

    @Autowired
    public ChatRoomsResource(UserRepository userRepository, ChatRoomsRepository chatRoomsRepository) {
        this.userRepository = userRepository;
        this.chatRoomsRepository = chatRoomsRepository;
    }


    //チャットルームの作成
    @POST
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Response createChatRoom () {
        ChatRooms chatRoom = chatRoomsRepository.addChatRoom();
        return Response.status(Response.Status.CREATED).entity(chatRoom).build();
    }


    //メッセージを閲覧する
    @GET
    @Path("/{chat-room-id}/{user-id}")
    @Produces(MediaType.APPLICATION_JSON)
    public Response getChatRoomMessages(@PathParam("chat-room-id") int chatRoomId, @PathParam("user-id") String userId) {
        User user = userRepository.getUser(userId);
        if (user == null) throw new NotFoundException("ユーザーが見つかりません");
        List<ChatRooms.Message> messages = chatRoomsRepository.getMessagesFromUser(chatRoomId, userId);
//        if (messages == null) throw new NotFoundException("チャットルームが存在しません");


        return Response.status(Response.Status.OK).entity(messages).build();
    }




    //チャットルームの削除
    @DELETE
    @Path("/{chatroom-id}")
    public Response deleteChatRoom(@PathParam("chatroom-id") int chatRoomId, @FormParam("user-id") String userId, @QueryParam("token") String token) {
        ChatRooms room = chatRoomsRepository.getChatRoom(chatRoomId);
        if (room == null) throw new NotFoundException("チャットルームが存在しません");

        User user = userRepository.getUser(userId);
        if (user == null) {
            throw new NotFoundException("IDが存在しません");
        }

        if (token == null || !token.equals(user.getToken())) {
            throw new WebApplicationException(
                    Response.status(Response.Status.FORBIDDEN)
                            .entity("認証失敗")
                            .build()
            );
        }


        ChatRooms chatRoom = chatRoomsRepository.deleteChatRoom(chatRoomId);
        return Response.noContent().build();
        //return Response.status(Response.Status.noContent).entity(chatRoom).build();
    }




    //チャットルームにユーザーを追加する
    @PUT
    @Path("/{chatroom-id}/{user-id}")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Response addChatRoomUser(@PathParam("chatroom-id") int chatRoomId, @PathParam("user-id") String userId, @QueryParam("token") String token) {
        User user = userRepository.getUser(userId);
        if (user == null) {
            throw new NotFoundException("IDが存在しません");
        }

        //トークン認証
        if (token == null || !token.equals(user.getToken())) {
            throw new WebApplicationException(
                    Response.status(Response.Status.FORBIDDEN)
                            .entity("認証失敗")
                            .build()
            );
        }

        ChatRooms chatRoom = chatRoomsRepository.addUserRoom(chatRoomId, userId);

        return Response.status(Response.Status.OK).entity(chatRoom).build();
    }


    //チャットルームにメッセージを追加する
    @PUT
    @Path("/{chatroom-id}/{user-id}/message")
    @Consumes(MediaType.APPLICATION_FORM_URLENCODED)
    @Produces(MediaType.APPLICATION_JSON)
    public Response updateMessage(@PathParam("chatroom-id") int roomId, @PathParam("user-id") String userId, @FormParam("message") String message) {
        ChatRooms room = chatRoomsRepository.getChatRoom(roomId);
        if (room == null) throw new NotFoundException("チャットルームが存在しません");


        ChatRooms chatRoom = chatRoomsRepository.addMessage(roomId, userId, message);
        return Response.status(Response.Status.OK).entity(chatRoom).build();
    }






}
