package com.arms.api.aichat.service;

import static com.arms.api.aichat.constant.AiChatRedisKeys.RECOMMENDED_CARDS;

import com.arms.api.aichat.domain.RecommendedCard;
import com.arms.api.util.redisrepo.RedisFramework;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.UUID;

@Service
@RequiredArgsConstructor
@Slf4j
public class RecommendedCardServiceImpl implements RecommendedCardService {

    private final RedisFramework redisFramework;

    @Override
    public List<RecommendedCard> findAllCards() {
        Map<Object, Object> entries = redisFramework.hash().getAll(RECOMMENDED_CARDS);

        if (entries == null || entries.isEmpty()) {
            return Collections.emptyList();
        }

        List<RecommendedCard> cards = new ArrayList<>();
        for (Object obj : entries.values()) {
            cards.add((RecommendedCard) obj);
        }
        cards.sort(Comparator.comparingInt(RecommendedCard::getSortOrder));
        return cards;
    }

    @Override
    public RecommendedCard findCardById(String cardId) {
        Object card = redisFramework.hash().get(RECOMMENDED_CARDS, cardId);

        if (card == null) {
            return null;
        }

        return (RecommendedCard) card;
    }

    @Override
    public RecommendedCard saveCard(RecommendedCard card) {
        card.setCardId(UUID.randomUUID().toString());

        Map<Object, Object> entries = redisFramework.hash().getAll(RECOMMENDED_CARDS);
        int maxOrder = 0;
        if (entries != null && !entries.isEmpty()) {
            for (Object obj : entries.values()) {
                RecommendedCard existing = (RecommendedCard) obj;
                if (existing.getSortOrder() > maxOrder) {
                    maxOrder = existing.getSortOrder();
                }
            }
        }
        card.setSortOrder(maxOrder + 1);

        redisFramework.hash().set(RECOMMENDED_CARDS, card.getCardId(), card);
        log.info("Saved recommended card: {}", card.getCardId());
        return card;
    }

    @Override
    public RecommendedCard updateCard(String cardId, RecommendedCard card) {
        Object existing = redisFramework.hash().get(RECOMMENDED_CARDS, cardId);

        if (existing == null) {
            return null;
        }

        card.setCardId(cardId);
        redisFramework.hash().set(RECOMMENDED_CARDS, cardId, card);
        log.info("Updated recommended card: {}", cardId);
        return card;
    }

    @Override
    public void deleteCard(String cardId) {
        redisFramework.hash().delete(RECOMMENDED_CARDS, cardId);
        log.info("Deleted recommended card: {}", cardId);
    }

}
