﻿// Copyright 2013-2022 AFI,Inc. All rights reserved

using System;
using UnityEngine;
using BackEnd;
using BackEnd.Socketio;

public class NotificationGroup : BaseGroup {
    public override string GetGroupName() {
        return "실시간 알림";
    }

    public override void SetSubFunctionButton() {
        UIManager.Instance.AddSubFunction("에러 알림 활성화", SetErrorHandler);
        UIManager.Instance.AddSubFunction("실시간 알림 서버 접속", Connect);
        UIManager.Instance.AddSubFunction("실시간 알림 서버 접속 해제", DisConnect);
        UIManager.Instance.AddSubFunction("실시간 알림 서버 유저 접속 여부", UserIsConnectByIndate);

    }

    private void SetHandler() {
        Backend.Notification.OnAuthorize = (bool isSuccess, string reason) => {
            if (isSuccess) {
                NotificationUI.Instance.CreateNotificationAndCloseLoadingUI("실시간 알림 서버 접속에 성공했습니다.");
            } else {
                NotificationUI.Instance.CreateNotificationAndCloseLoadingUI("실시간 알림 서버 접속에 실패했습니다.\n" + reason );
            }

        };
        
        Backend.Notification.OnDisConnect = (string reason) => {
            NotificationUI.Instance.CreateNotificationAndCloseLoadingUI("실시간 알림 서버가 종료되었습니다.\n" + reason);
        };

        Backend.Notification.OnException = (Exception exception ) => {
            Debug.Log(exception);
            NotificationUI.Instance.CreateNotification("실시간 알림 중 예외가 발생했습니다.\n" + exception);
        };
        
        Backend.Notification.OnFriendConnected = (string inDate, string nickname) => {
            NotificationUI.Instance.CreateNotification("친구가 접속했습니다.\n" + $"이름 : {nickname}({inDate})");
        };
        
        Backend.Notification.OnFriendDisconnected = (string inDate, string nickname) => {
            NotificationUI.Instance.CreateNotification("친구가 접속 종료했습니다.\n" + $"이름 : {nickname}({inDate})");
        };
        
        Backend.Notification.OnReceivedFriendRequest = () => {
            NotificationUI.Instance.CreateNotification("친구 요청이 도착했습니다.");
        };
        
        Backend.Notification.OnAcceptedFriendRequest = () => {
            NotificationUI.Instance.CreateNotification("친구 요청이 수락되었습니다.");
        };
        
        Backend.Notification.OnRejectedFriendRequest = () => {
            NotificationUI.Instance.CreateNotification("친구 요청이 거절되었습니다.");
        };
        
        Backend.Notification.OnReceivedGuildApplicant = () => {
            NotificationUI.Instance.CreateNotification("길드 가입 요청이 도착했습니다.");
        };
        
        Backend.Notification.OnApprovedGuildJoin = () => {
            NotificationUI.Instance.CreateNotification("길드 가입 신청이 수락되었습니다.");
        };
        
        Backend.Notification.OnRejectedGuildJoin = () => {
            NotificationUI.Instance.CreateNotification("길드 가입 신청이 거절되었습니다.");
        };
        
        Backend.Notification.OnReceivedMessage = () => {
            NotificationUI.Instance.CreateNotification("새 쪽지가 도착하였습니다.");
        };
        
        Backend.Notification.OnReceivedUserPost = () => {
            NotificationUI.Instance.CreateNotification("새 유저 우편이 도착하였습니다.");
        };

        Backend.Notification.OnNewNoticeCreated = (string title, string content) => {
            NotificationUI.Instance.CreateNotification($"새로운 공지사항이 생성되었습니다.\n" +
                                                       $"제목 : {title}\n" +
                                                       $"내용 : {content}\n");
        };
        
        Backend.Notification.OnNewEventCreated = (string title, string content) => {
            NotificationUI.Instance.CreateNotification($"새로운 이벤트가 생성되었습니다.\n" +
                                                       $"제목 : {title}\n" +
                                                       $"내용 : {content}\n");
        };
        
        Backend.Notification.OnServerStatusChanged = (ServerStatusType serverStatusType) => {
            NotificationUI.Instance.CreateNotification($"서버 상태가 변경되었습니다.\n" +
                                                       $"{(serverStatusType)}");
        };

        Backend.Notification.OnNewPostCreated = (PostRepeatType postRepeatType, string title, string content, string author) => {
            NotificationUI.Instance.CreateNotification(
                $"우편이 발송되었습니다.\n" +
                $"| postRepeatType : {postRepeatType}\n" +
                $"| title : {title}\n" +
                $"| content : {content}\n" +
                $"| author : {author}\n");
        };
    }
    

    private void Connect() {
        
        requestUI.SetExecuteButtonAction( () => {
            SetHandler();
            Backend.Notification.Connect();
        }); 
    }

    private void SetErrorHandler() {
        requestUI.SetExecuteButtonAction( () => {
            if (Backend.IsInitialized) {
                Backend.ErrorHandler.InitializePoll(false);

                Backend.ErrorHandler.OnMaintenanceError = () => {
                    Debug.Log("점검 에러 발생!!!");
                    NotificationUI.Instance.CreateNotification("서버 점검이 시작되었습니다.");
                };
                Backend.ErrorHandler.OnTooManyRequestError = () => {
                    Debug.Log("403 에러 발생!!!");
                    NotificationUI.Instance.CreateNotification("과도한 호출이 발생하였습니다.");
                };
                Backend.ErrorHandler.OnTooManyRequestByLocalError = () => {
                    Debug.Log("403 로컬 에러 발생!!!");
                    NotificationUI.Instance.CreateNotification("과도한 호출이 발생하고 있습니다.");
                };
                Backend.ErrorHandler.OnOtherDeviceLoginDetectedError = () => {
                    Debug.Log("리프레시 불가!!!");
                    NotificationUI.Instance.CreateNotification("다른 기기로부터 로그인 요청이 발생했습니다. 연결이 중단됩니다.");
                };
            }
            NotificationUI.Instance.CreateNotificationAndCloseLoadingUI("에러 알림이 활성화되었습니다");
        }); 
    }

    private void DisConnect() {
        requestUI.SetExecuteButtonAction( () => {
            Backend.Notification.DisConnect();
        });
    }

    private void UserIsConnectByIndate() {
        
        Backend.Notification.OnIsConnectUser = (bool isConnect, string nickName, string gamerInDate) => {
            if (isConnect) {
                NotificationUI.Instance.CreateNotificationAndCloseLoadingUI($"{nickName}({gamerInDate})은 현재 접속중입니다.");
            } else {
                NotificationUI.Instance.CreateNotificationAndCloseLoadingUI($"{nickName}({gamerInDate})은 현재 접속중이 아닙니다.");
            }
        };
        
        requestUI.AddInputField("userInDate");
        
        requestUI.SetExecuteButtonAction( () => {
            string userInDate = InputParseByString(0,0);

            Backend.Notification.UserIsConnectByIndate(userInDate);
        });
    }
}