package redis

import (
	"encoding/json"

	"github.com/mylxsw/coyotes/config"
	"github.com/mylxsw/coyotes/log"
)

// GetTaskChannel get a channel from redis
func GetTaskChannel(channelName string) (channel config.Channel, err error) {
	client := createRedisClient()
	defer client.Close()

	result, err := client.HGet(TaskChannelsKey(), channelName).Result()
	if err != nil {
		return
	}

	err = json.Unmarshal([]byte(result), &channel)
	if err != nil {
		log.Error("parse channel [%s] from json to object failed", channelName)
		return
	}

	return
}

// GetTaskChannels return all channels
func GetTaskChannels() (channels map[string]*config.Channel, err error) {
	channels = make(map[string]*config.Channel)

	client := createRedisClient()
	defer client.Close()

	results, err := client.HGetAll(TaskChannelsKey()).Result()
	if err != nil {
		return nil, err
	}

	for key, res := range results {
		channel := config.Channel{}
		err = json.Unmarshal([]byte(res), &channel)
		if err != nil {
			log.Error("parse channel [%s] from json to object failed", key)
			continue
		}

		channels[key] = &channel
	}

	return
}

// AddTaskChannel add a channel to redis for persistence
func AddTaskChannel(channel *config.Channel) error {
	client := createRedisClient()
	defer client.Close()

	channelJSON, err := json.Marshal(channel)
	if err != nil {
		return err
	}

	err = client.HSet(TaskChannelsKey(), channel.Name, string(channelJSON)).Err()
	if err != nil {
		return err
	}

	return nil
}

// RemoveTaskChannel remove a channel from redis
func RemoveTaskChannel(channelName string) error {
	client := createRedisClient()
	defer client.Close()

	err := client.HDel(TaskChannelsKey(), channelName).Err()
	if err != nil {
		return err
	}

	return nil
}