package com.example.tampopo_client.views;

import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.util.TypedValue;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.GridView;
import android.widget.ImageButton;
import android.widget.LinearLayout;

import androidx.activity.EdgeToEdge;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.constraintlayout.widget.ConstraintSet;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.graphics.Insets;
import androidx.core.view.ViewCompat;
import androidx.core.view.WindowInsetsCompat;
import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;

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.ActivityViewModel;
import com.example.tampopo_client.viewmodels.ActivityViewModelFactory;
import com.example.tampopo_client.viewmodels.ChatViewModel;
import com.example.tampopo_client.viewmodels.ChatViewModelFactory;
import com.example.tampopo_client.viewmodels.UserViewModel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class MainActivity extends AppCompatActivity {
    //public class MainActivity extends AppCompatActivity implements NotificationListener {

    private EditText editMessage;
    private ImageButton sendButton;
    private GridView wordGroup;
    private LinearLayout messageList;
    //private List<String> friendIds = List.of();
    //アクティビティの選択肢
    private String[] words = {"ひまnow", "あそぼ！", "そろそろ会いたない〜？", "勉強なう", "電話しよ～", "お風呂入ってくる～", "今暇だよー！", "いそがしい～!!"};
    private Button openDialogButton;
    private Map<String, FriendIconView> userViews = new HashMap<>();
    private int[] marginTopInDp = {90, 100, 300, 450, 480, 310, 1000};
    private int[] marginStartInDp = {0, 250, 0, 90, 200, 280, 1000};
    private int i = 0;

    ActivityViewModel activityViewModel;
    UserViewModel userViewModel;
    Tampopo tampopo;

    //追加しました！
    private ChatViewModel chatViewModel;
    private final List<String> recentUpdatedFriends = new ArrayList<>(); // 最新6人


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        EdgeToEdge.enable(this);
        setContentView(R.layout.activity_main);
        ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main), (v, insets) -> {
            Insets systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars());
            v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom);
            return insets;
        });

        //疑似的な通知のためにchatViewModelを定義する
        chatViewModel = new ViewModelProvider(this).get(ChatViewModel.class);
        //chatViewModel.addNotificationListener(this);
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
            if (ContextCompat.checkSelfPermission(this, android.Manifest.permission.POST_NOTIFICATIONS)
                    != PackageManager.PERMISSION_GRANTED) {
                ActivityCompat.requestPermissions(
                        this,
                        new String[]{android.Manifest.permission.POST_NOTIFICATIONS},
                        1001
                );
            }
        }

        // TODO: CHANGE
        userViewModel = new ViewModelProvider(this).get(UserViewModel.class);

        //メイン画面からフレンド一覧画面への遷移
        ImageButton friendButton = (ImageButton) findViewById(R.id.friend);
        friendButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, FriendActivity.class);
                startActivity(intent);
            }
        });

        //tampopoを宣言する
        tampopo = (Tampopo) getApplication();

        //activityViewModelを宣言する
        ActivityViewModelFactory factory = new ActivityViewModelFactory(tampopo.getUserId(), tampopo.getToken()); // Factoryを使って、引数をコンストラクタにわたしつつViewModelを作成
        activityViewModel = new ViewModelProvider(this, factory).get(ActivityViewModel.class);

        //追加しました！！！！！！！！！！！
        // ChatViewModelを初期化する
        ChatViewModelFactory factory1 = new ChatViewModelFactory(tampopo.getUserId(), tampopo.getToken(), tampopo.getChatroomId());
        chatViewModel = new ViewModelProvider(this, factory1).get(ChatViewModel.class);
        chatViewModel.getChatroomIdLiveData().observe(this, new Observer<String>() {
            @Override
            public void onChanged(String chatRoomId) {
                tampopo.setChatroomId(chatRoomId);
            }
        });

        MutableLiveData<List<String>> friendsLiveData = activityViewModel.getFriendUserIdsLiveData();

        friendsLiveData.observe(this, new Observer<List<String>>() {
            @Override
            public void onChanged(List<String> friends) {
                // フレンドの追加と削除
                updateActivityView(friends);
            }
        });

        //アクティビティを投稿した人がアクティビティを更新しないか監視する
        //なにかをクリックしたらここに飛んでくる
        for (String friendId : userViews.keySet()) {
            //final String updateFriendId = friendId;
            MutableLiveData<List<Activity>> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId);
            //MutableLiveData<List<Activity>> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId);

            //FriendIconView friendView = userViews.get(friendId);
            //if (friendView == null) continue;

            activitiesLiveData.observeForever(new Observer<List<Activity>>() {
                //アクティビティを更新したらonChangedが呼び出される
                @Override
                public void onChanged(List<Activity> activities) {
                    // 更新したフレンドの再登場，更新してないフレンドの退場
                    //更新した人を見つけてFriendIconViewを呼び出して、
                    List<String> sortedFriendUserIds = activityViewModel.getSortedFriendUserIds();//アクティビティを更新した最新６人のリスト
//                    FriendIconView userView = userViews.get(friendId);
//                    if (userView != null && activities != null && !activities.isEmpty()) {
//                        //latestは最新のアクティビティを保持する
//                        Activity latest = activities.get(activities.size() - 1);
//                    }
//                    // 最新更新フレンドをリストに追加（最大6人保持）
                    int size = sortedFriendUserIds.size();
                    List<String> latestSix = sortedFriendUserIds.subList(Math.max(size - 6, 0), size);

                    synchronized (recentUpdatedFriends) {
                        if (latestSix.contains(friendId)) {
                            recentUpdatedFriends.remove(friendId);
                            recentUpdatedFriends.add(0, friendId);
                            if (recentUpdatedFriends.size() > 6) {
                                recentUpdatedFriends.remove(recentUpdatedFriends.size() - 1);
                            }
                        }
                    }
//スレッド処理をいれて更新できるようにする
                }
            });
        }


//        for (String friendId : userViews.keySet()) {
//            final String updateFriendId = friendId;
//            MutableLiveData<List<Activity>> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId);
//            //MutableLiveData<List<Activity>> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(updateFriendId);
//
//            FriendIconView friendView = userViews.get(friendId);
//            if (friendView == null) continue;
//
//            activitiesLiveData.observeForever(new Observer<List<Activity>>() {
//                @Override
//                public void onChanged(List<Activity> activities) {
//                    // 更新したフレンドの再登場，更新してないフレンドの退場
//                    //更新した人を見つけてFriendIconViewを呼び出して、
//                    FriendIconView userView = userViews.get(updateFriendId);
//                    if (userView != null && activities != null && !activities.isEmpty()) {
//                        Activity latest = activities.get(activities.size() - 1);
//                        String updateFriendId = latest.getUserId();
//                    }
//                    //フレンドの位置決め
//                    // 最新更新フレンドをリストに追加（最大6人保持）
//                    List<String> list = activityViewModel.getSortedFriendUserIds();
//                    int size = list.size();
//                    List<String> latestSix = list.subList(Math.max(size - 6, 0), size);
//
//                    synchronized (recentUpdatedFriends) {
//                        if (latestSix.contains(updateFriendId)) {
//                            recentUpdatedFriends.remove(updateFriendId);
//                            recentUpdatedFriends.add(0, updateFriendId);
//                            if (recentUpdatedFriends.size() > 6) {
//                                recentUpdatedFriends.remove(recentUpdatedFriends.size() - 1);
//                            }
//                        }
//                    }
//
//                }
//            });
//        }

        //メイン画面から設定画面への遷移
        ImageButton settingButton = (ImageButton) findViewById(R.id.setting);
        settingButton.

                setOnClickListener(new View.OnClickListener() {
                    public void onClick(View v) {
                        Intent intent = new Intent(MainActivity.this, SettingActivity.class);
                        startActivity(intent);
                    }
                });

        messageList =

                findViewById(R.id.messageList);

// ボタンを押すとダイアログ表示（トリガー用）
        openDialogButton =

                findViewById(R.id.openDialogButton);
        openDialogButton.

                setOnClickListener(v ->

                        showInputDialog());

    }

    @Override
    protected void onStart() {
        super.onStart();

        if (activityViewModel != null) {
            activityViewModel.startUpdating(1L);
        }
        if (chatViewModel != null) {
            chatViewModel.startUpdating(1L);
        }
    }

    @Override
    protected void onStop() {
        super.onStop();

        if (activityViewModel != null) {
            activityViewModel.stopUpdating();
        }
        if (chatViewModel != null) {
            chatViewModel.stopUpdating();
        }
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();

        if (activityViewModel != null) {
            activityViewModel.stopUpdating();
        }
        if (chatViewModel != null) {
            chatViewModel.stopUpdating();
        }
    }


    private void showInputDialog() {
        // カスタムビュー読み込み
        View dialogView = getLayoutInflater().inflate(R.layout.main_dialog, null);
        EditText editTextInput = dialogView.findViewById(R.id.editTextInput);
        GridView wordGrid = dialogView.findViewById(R.id.wordGrid);
        ImageButton sendButton = dialogView.findViewById(R.id.sendButton);

        //tokenとuserIdを代入する
        String token = tampopo.getToken();
        String userId = tampopo.getUserId();

        // 語群セット
        ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, words);
        wordGrid.setAdapter(adapter);

        // 語群クリックで入力欄にセット
        wordGrid.setOnItemClickListener((parent, view, position, id) -> {
            editTextInput.setText(words[position]);
            // 入力欄にフォーカス＆キーボード表示
            editTextInput.requestFocus();
            InputMethodManager imm = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
            imm.showSoftInput(editTextInput, InputMethodManager.SHOW_IMPLICIT);
        });

        // ダイアログ生成
        AlertDialog dialog = new AlertDialog.Builder(this)
                .setView(dialogView)
                .create();

        // 送信ボタン処理
        sendButton.setOnClickListener(v -> {
            String message = editTextInput.getText().toString().trim();
            int length = message.length();
            if (!message.isEmpty()) {
                activityViewModel.createActivity(userId, token, message);
                if (length > 20) {
                    openDialogButton.setTextSize(7);
                } else if (length > 10) {
                    openDialogButton.setTextSize(10);
                } else {
                    openDialogButton.setTextSize(12);
                }
                openDialogButton.setMaxLines(10);
                openDialogButton.setLineSpacing(4.0f, 1.2f);
                openDialogButton.setText(message);
                editTextInput.setText("");
                dialog.dismiss(); // ダイアログを閉じる
            } else {
                openDialogButton.setText("");
            }
        });

        dialog.show();
    }

    //natty　仮のフレンド情報
    private int getUserIconResource(String userId) {
        switch (userId) {
            case "user01":
                return R.drawable.friend01_icon;
            case "user02":
                return R.drawable.friend04_icon;
            case "user03":
                return R.drawable.friend03_icon;
            default:
                return R.drawable.default_icon;
        }
    }

    private void setupActivityObservers(List<String> sortedFriendUserIds) {
        for (String friendId : sortedFriendUserIds) {
            FriendIconView userView = userViews.get(friendId);
            if (userView == null) {
                Log.w("MainActivity", "userViews に存在しません: " + friendId);
                continue;
            }

            MutableLiveData<List<Activity>> activitiesLiveData =
                    activityViewModel.getActivitiesLiveDataFromUserId(friendId);

            activitiesLiveData.observeForever(new Observer<List<Activity>>() {
                @Override
                public void onChanged(List<Activity> activities) {
                    if (activities == null || activities.isEmpty()) return;

                    Activity latest = activities.get(activities.size() - 1);
                    Log.d("ActivityUpdate", friendId + " 最新: " + latest.getText());

                    // FriendIconView の更新
                    //userView.setComment(latest.getText());

                    // 最近更新したフレンドリストを更新（最大6人）
                    synchronized (sortedFriendUserIds) {
                        sortedFriendUserIds.remove(friendId);
                        sortedFriendUserIds.add(0, friendId);

                        if (sortedFriendUserIds.size() > 6) {
                            sortedFriendUserIds.remove(sortedFriendUserIds.size() - 1);
                        }
                    }

                    // 並び順をログ出力（デバッグ用）
                    Log.d("RecentFriends", "最新更新順: " + sortedFriendUserIds);
                }
            });
        }
    }

    private void updateActivityView(@NonNull List<String> friends) {
        ///natty ユーザごとにコメントの更新をする
        LinearLayout messageList = findViewById(R.id.messageList);
        ConstraintLayout layout = findViewById(R.id.main);

        i = 0;
        for (String friendId : friends) {
            FriendIconView userView = userViews.get(friendId);
            //userViews.put(friendId, null);
            MutableLiveData<List<Activity>> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId);

//        for (String friendId : sortedFriendUserIds) {
//            FriendIconView userView = userViews.get(friendId);
//            MutableLiveData<List<Activity>> activitiesLiveData = activityViewModel.getActivitiesLiveDataFromUserId(friendId);
            //nattyもしnullだったらって処理入れた気がする
//            if (userView == null) {
//                userView = new FriendIconView(
//                        MainActivity.this,
//                        friendId,
//                        userViewModel.getNickname(friendId),
//                        chatViewModel
//                );
//                userViews.put(friendId, userView);
//            }
            // 新しいユーザなので、アイコン＋コメントを作成
            //FriendIconView container = new FriendIconView(this);


            new Thread(new Runnable() {
                @Override
                public void run() {
                    FriendIconView container = new FriendIconView(MainActivity.this, friendId, userViewModel.getNickname(friendId), chatViewModel,userViewModel.getIcon(friendId));

                    Handler handler = new Handler(Looper.getMainLooper());
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            container.setPadding(16, 16, 16, 16);
                            container.setId(View.generateViewId());

//                                // ユーザのアイコン（固定）
//                                ShapeableImageView iconView = new ShapeableImageView(MainActivity.this);
//                                iconView.setLayoutParams(new LinearLayout.LayoutParams(100, 100));
//                                iconView.setScaleType(ImageView.ScaleType.CENTER_CROP);
//                                iconView.setStrokeColor(ContextCompat.getColorStateList(MainActivity.this, R.color.red));
//                                iconView.setStrokeWidth(2f);
//                                iconView.setShapeAppearanceModel(
//                                        iconView.getShapeAppearanceModel().toBuilder()
//                                                .setAllCornerSizes(50)  // 丸く
//                                                .build()
//                                );
                            ConstraintLayout.LayoutParams params = new ConstraintLayout.LayoutParams(
                                    ConstraintLayout.LayoutParams.WRAP_CONTENT,
                                    ConstraintLayout.LayoutParams.WRAP_CONTENT
                            );
                            container.setLayoutParams(params);
                            layout.addView(container);
//
//                                // ユーザIDに応じてアイコンリソースを決定（仮にハードコード or マッピング）
//                                iconView.setImageResource(getUserIconResource(friendId)); // ←ここがポイント

                            // Mapに登録、画面に追加
                            userViews.put(friendId, container);
//                                userView = container;
//                                messageList.addView(container);

                            ConstraintSet set = new ConstraintSet();
                            set.clone(layout);
                            int marginTopInPx = (int) TypedValue.applyDimension(
                                    TypedValue.COMPLEX_UNIT_DIP,
                                    marginTopInDp[i],
                                    getResources().getDisplayMetrics()
                            );
                            int marginStartInPx = (int) TypedValue.applyDimension(
                                    TypedValue.COMPLEX_UNIT_DIP,
                                    marginStartInDp[i],
                                    getResources().getDisplayMetrics()
                            );

                            set.connect(container.getId(), ConstraintSet.TOP, ConstraintSet.PARENT_ID, ConstraintSet.TOP, marginTopInPx);
                            set.connect(container.getId(), ConstraintSet.START, ConstraintSet.PARENT_ID, ConstraintSet.START, marginStartInPx);

                            set.applyTo(layout);

                            if (i < 6) {
                                i++;
                            }

                            // TODO: CHANGE
                            activitiesLiveData.observe(MainActivity.this, activities -> {
                                if (activities == null || activities.isEmpty()) return;

                                Activity latest = activities.get(activities.size() - 1);

                                // UIスレッドで安全に更新
                                FriendIconView friendView = userViews.get(friendId);
                                if (friendView != null) {
                                    friendView.setComment(latest.getText());
                                    Log.d("ActivityUpdate", friendId + " のコメントを更新: " + latest.getText());
                                }
                            });

                            List<String> sortedFriendUserIds = activityViewModel.getSortedFriendUserIds();
                            int size = sortedFriendUserIds.size();
                            List<String> latestSix = sortedFriendUserIds.subList(Math.max(size - 6, 0), size);

                            synchronized (recentUpdatedFriends) {
                                if (latestSix.contains(friendId)) {
                                    recentUpdatedFriends.remove(friendId);
                                    recentUpdatedFriends.add(0, friendId);
                                    if (recentUpdatedFriends.size() > 6) {
                                        recentUpdatedFriends.remove(recentUpdatedFriends.size() - 1);
                                    }
                                }
                            }
                        }
                    });
                }
            }).start();
        }
    }
}

//プッシュ通知
//private void showChatNotification(String friendName) {
//NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

//String channelId = "chat_channel";

//        NotificationCompat.Builder builder = new NotificationCompat.Builder(this, channelId)
//                .setSmallIcon(R.drawable.default_icon) // 通知アイコン
//                .setContentTitle("新しいチャット")
//                .setContentText(friendName + " さんから通話があります")
//                .setPriority(NotificationCompat.PRIORITY_HIGH)
//                .setAutoCancel(true); // タップしたら消える
//        NotificationChannel channel = new NotificationChannel(
//                channelId,
//                "Chat Notifications",
//                NotificationManager.IMPORTANCE_HIGH
//        );
//notificationManager.createNotificationChannel(channel);

//        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
//            if (ContextCompat.checkSelfPermission(
//                    this,
//                    android.Manifest.permission.POST_NOTIFICATIONS
//            ) == PackageManager.PERMISSION_GRANTED) {
//                Log.d("NotificationTest", "notify() 呼ばれた！！");
//                notificationManager.notify(0, builder.build());
//            } else {
//                // 許可されていない → リクエストする
//                ActivityCompat.requestPermissions(
//                        this,
//                        new String[]{android.Manifest.permission.POST_NOTIFICATIONS},
//                        1001
//                );
//            }
//        } else {
//            Log.d("NotificationTest", "notify() 呼ばれた！！");
//            notificationManager.notify(0, builder.build());
//        }
//}

//通知を受信したときのダイアログ　これが動いてます
//friendName+から通話があります。ってでるから通知が来たときのフレンドを変数に置く必要がある
//    @Override
//    public void onNotificationReceived() {
//        // 通知を受信したときにダイアログを表示
//        runOnUiThread(() -> showChatNotification("user02"));
//    }


