package com.example.tampopo_client.views;

import android.app.Dialog;
import android.content.Context;
import android.content.Intent;
import android.os.Handler;
import android.os.Looper;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.Button;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import androidx.lifecycle.Observer;

import com.bumptech.glide.Glide;
import com.example.tampopo_client.R;
import com.example.tampopo_client.Tampopo;
import com.example.tampopo_client.models.Activity;
import com.example.tampopo_client.viewmodels.ChatViewModel;
import com.google.android.material.imageview.ShapeableImageView;

import java.util.List;

public class FriendIconView extends FrameLayout {
    private ShapeableImageView mFriendIcon;
    private ImageView mFriendCommentImage;
    private TextView mFriendComment;
    private TextView mFriendNickname;
    private ImageView mFriendChatNotification;
    private boolean chatNotification = false;
    private String friendUserId;
    private String friendUserNickname;
    private ChatViewModel chatViewModel;

    private String friendUserIconUrl;
    //ActivityLiveData
    private final Observer<List<Activity>> activitiesObserver = new Observer<List<Activity>>() {
        @Override
        public void onChanged(List<Activity> activityList) {
            if (activityList != null && !activityList.isEmpty()) {
                Activity act = activityList.get(0);
                setComment(act.getText());
            }
        }
    };

    //chatLiveData
    private final Observer<String> chatObserver = new Observer<String>() {
        @Override
        public void onChanged(String fromUserId) {
            if (friendUserId.equals(fromUserId)) {
                chatNotification = true;
                mFriendChatNotification.setVisibility(View.VISIBLE);
            }
        }
    };

    public Observer<List<Activity>> getActivitiesObserver() {
        return activitiesObserver;
    }

    public Observer<String> getChatObserver() {
        return chatObserver;
    }

    public FriendIconView(Context context, String friendUserId, String friendUserNickname, ChatViewModel chatViewModel, String friendUserIconUrl) {
        super(context);
        this.friendUserId = friendUserId;
        this.friendUserNickname = friendUserNickname;
        this.chatViewModel = chatViewModel;
        this.friendUserIconUrl = friendUserIconUrl;
        init(null, 0);
    }

    public FriendIconView(Context context) {
        super(context);
        this.friendUserId = null;
        init(null, 0);
    }

    public FriendIconView(Context context, AttributeSet attrs) {
        super(context, attrs);
        this.friendUserId = null;
        init(attrs, 0);
    }

    public FriendIconView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        this.friendUserId = null;
        init(attrs, defStyle);
    }

    private void init(AttributeSet attrs, int defStyle) {
        LayoutInflater.from(getContext()).inflate(R.layout.sample_friend_icon_view, this, true);
        mFriendCommentImage = findViewById(R.id.friend_comment_image);
        mFriendComment = findViewById(R.id.friend_comment);
        mFriendNickname = findViewById(R.id.friend_nickname);
        mFriendIcon = findViewById(R.id.friend_icon);
        mFriendChatNotification = findViewById(R.id.chat_notification);
        mFriendChatNotification.setVisibility(View.GONE);

        //mainから渡されたfriendUserNicknameがnull出なければセットする
        if(friendUserNickname != null){
            setNickname(friendUserNickname);
        }

        //mainから渡されたfriendUserIconUrlがnull出なければセットする
        if(friendUserIconUrl != null){
            setIconUrl(friendUserIconUrl);
        }

        //iconを押したらチャットを始めることができる（チャットのダイアログができたらFriendActivityを変更）
        mFriendIcon.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //通話に出る場合
                if (chatNotification) {
                    answeringCallDialog(getContext(), FriendIconView.this.friendUserNickname);
                } // 通話をかける場合
                else if (!chatNotification) {
                    showCallRequestDialog(getContext(), FriendIconView.this.friendUserNickname);
                }
            }
        });
    }

    //通話に出る際のダイアログの表示
    public void answeringCallDialog(Context context, String fromUserNickname) {
        Dialog fromDialog = new Dialog(context);
        fromDialog.setContentView(R.layout.dialog_chat_receved);
        fromDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        fromDialog.getWindow().setDimAmount(0.5f);

        // メッセージテキスト
        TextView tvMessage = fromDialog.findViewById(R.id.tv_message);
        tvMessage.setText(fromUserNickname + " さんから通話リクエストが届いています。\n通話を開始しますか？");

        // 開始ボタン
        Button btnStart = fromDialog.findViewById(R.id.btn_start);
        btnStart.setOnClickListener(v -> {
            Toast.makeText(context, "通話を開始しました", Toast.LENGTH_SHORT).show();
            fromDialog.dismiss();
            mFriendChatNotification.setVisibility(View.GONE);//赤丸を消す
            chatNotification = false;

            // 通話を開始する
            Tampopo tampopo = (Tampopo) ((MainActivity) getContext()).getApplication();
//            String chatroomId = chatViewModel.enterChatroom(tampopo.getUserId(), friendUserId, tampopo.getToken());
            tampopo.setChatFriendId(friendUserId);

            // ChatActivityに画面遷移する
            Context ctx = getContext();
            Intent intent = new Intent(ctx, ChatActivity.class);
            ctx.startActivity(intent);
        });

        // キャンセルボタン
        Button btnCancel = fromDialog.findViewById(R.id.btn_cancel);
        btnCancel.setOnClickListener(v -> fromDialog.dismiss());

        fromDialog.show();
    }

    //通話をかける際のダイアログの表示
    public void showCallRequestDialog(Context context, String toUserNickname) {
        Dialog toDialog = new Dialog(context);
        toDialog.setContentView(R.layout.dialog_chat_receved);
        toDialog.getWindow().setBackgroundDrawableResource(android.R.color.transparent);
        toDialog.getWindow().setDimAmount(0.5f);

        // メッセージテキスト
        TextView tvMessage = toDialog.findViewById(R.id.tv_message);
        tvMessage.setText(toUserNickname + " さんと通話を開始しますか？");

        // 開始ボタン
        Button btnStart = toDialog.findViewById(R.id.btn_start);
        btnStart.setOnClickListener(v -> {
            Toast.makeText(context, "通話を開始しました", Toast.LENGTH_SHORT).show();
            toDialog.dismiss();

            // 通話を開始する
            Tampopo tampopo = (Tampopo) ((MainActivity) getContext()).getApplication();
            new Thread(new Runnable() {
                @Override
                public void run() {
                    String chatroomId = chatViewModel.enterChatroom(tampopo.getUserId(), friendUserId, tampopo.getToken());
                    tampopo.setChatroomId(chatroomId);
                    tampopo.setChatFriendId(friendUserId);
                }
            }).start();

            // ChatActivityに画面遷移する
            Context ctx = getContext();
            Intent intent = new Intent(ctx, ChatActivity.class);
            ctx.startActivity(intent);
        });

        // キャンセルボタン
        Button btnCancel = toDialog.findViewById(R.id.btn_cancel);
        btnCancel.setOnClickListener(v -> toDialog.dismiss());

        toDialog.show();
    }

    //変更されたニックネームをセット
    public void setNickname(String nickname) {
        if (mFriendNickname != null) {
            mFriendNickname.setText(nickname);
        }
    }

    //アクティビティの背景（吹き出し）
    public void setImageResource(int resId) {
        if (mFriendIcon != null) {
            mFriendIcon.setImageResource(resId);
        }
    }

    public ImageView getImageView() {
        return mFriendIcon;
    }

    //アクティビティをセット
    public void setComment(String comment) {
        if (mFriendComment != null) {
            int comment_length = comment.length();
            if (comment_length > 20) {
                mFriendComment.setTextSize(7);
            } else if (comment_length > 10) {
                mFriendComment.setTextSize(10);
            } else {
                mFriendComment.setTextSize(12);
            }
            mFriendComment.setText(comment);
        }
    }


    /**
     * FriendIconViewのアイコン画像を更新する
     *
     * @param iconUrl アイコン画像のURL
     */
    public void setIconUrl(String iconUrl) {
        Handler handler = new Handler(Looper.getMainLooper());
        handler.post(new Runnable() {
            @Override
            public void run() {
                Glide.with(getContext()).load(iconUrl).into(getImageView());
            }
        });
    }


}
