/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

package schema

import (
	"encoding/json"

	"github.com/apache/answer/internal/base/constant"
	"github.com/apache/answer/internal/entity"
)

type NotificationChannelConfig struct {
	Key    constant.NotificationChannelKey `json:"key"`
	Enable bool                            `json:"enable"`
}

type NotificationChannels []*NotificationChannelConfig

func NewNotificationChannelsFormJson(jsonStr string) NotificationChannels {
	var list NotificationChannels
	_ = json.Unmarshal([]byte(jsonStr), &list)
	return list
}

func NewNotificationChannelConfigFormJson(jsonStr string) NotificationChannelConfig {
	var list NotificationChannels
	_ = json.Unmarshal([]byte(jsonStr), &list)
	if len(list) > 0 {
		return *list[0]
	}
	return NotificationChannelConfig{}
}

func (n *NotificationChannels) ToJsonString() string {
	data, _ := json.Marshal(n)
	return string(data)
}

type NotificationConfig struct {
	Inbox                          NotificationChannelConfig `json:"inbox"`
	AllNewQuestion                 NotificationChannelConfig `json:"all_new_question"`
	AllNewQuestionForFollowingTags NotificationChannelConfig `json:"all_new_question_for_following_tags"`
}

func NewNotificationConfig(configs []*entity.UserNotificationConfig) NotificationConfig {
	nc := NotificationConfig{}
	for _, item := range configs {
		switch item.Source {
		case string(constant.InboxSource):
			nc.Inbox = NewNotificationChannelConfigFormJson(item.Channels)
		case string(constant.AllNewQuestionSource):
			nc.AllNewQuestion = NewNotificationChannelConfigFormJson(item.Channels)
		case string(constant.AllNewQuestionForFollowingTagsSource):
			nc.AllNewQuestionForFollowingTags = NewNotificationChannelConfigFormJson(item.Channels)
		}
	}
	return nc
}

func (n *NotificationConfig) Format() {
	if n.Inbox.Key == "" {
		n.Inbox.Key = constant.EmailChannel
		n.Inbox.Enable = false
	}
	if n.AllNewQuestion.Key == "" {
		n.AllNewQuestion.Key = constant.EmailChannel
		n.AllNewQuestion.Enable = false
	}
	if n.AllNewQuestionForFollowingTags.Key == "" {
		n.AllNewQuestionForFollowingTags.Key = constant.EmailChannel
		n.AllNewQuestionForFollowingTags.Enable = false
	}
}

// UpdateUserNotificationConfigReq update user notification config request
type UpdateUserNotificationConfigReq struct {
	NotificationConfig
	UserID string `json:"-"`
}

// GetUserNotificationConfigResp get user notification config response
type GetUserNotificationConfigResp struct {
	NotificationConfig
}
