package com.kospo.talk.service.impl;

import com.kospo.talk.config.exception.ErrorCode;
import com.kospo.talk.exception.CustomException;
import com.kospo.talk.model.*;
import com.kospo.talk.payload.AutoReplyDto;
import com.kospo.talk.repository.AutoReplyRepository;
import com.kospo.talk.repository.SmUserRepository;
import com.kospo.talk.service.AutoReplyService;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class AutoReplyServiceImpl implements AutoReplyService {
    private final AutoReplyRepository autoReplyRepository;
    private final SmUserRepository smUserRepository;

    @Override
    public List<AutoReply> findByTalkId(String talkId) {
        return autoReplyRepository.findByTalkId(talkId);
    }

    @Override
    public List<AutoReplyDto> findByWorkIdAndType(String workId, String type) {
        return autoReplyRepository.findByWorkIdAndType(workId, type).stream().map(AutoReplyDto::to).toList();
    }

    @Override
    public List<AutoReplyDto> findBySabun(String sabun) {
        return autoReplyRepository.findBySabun(sabun).stream().map(AutoReplyDto::to).toList();
    }

    @Override
    public void save(AutoReplyDto autoReplyDto) {
        User user = (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        autoReplyDto.setInsSabun(user.getSabun());
        SmUser smUser = smUserRepository.findById(SmUserId.builder()
                .workId(autoReplyDto.getWorkId())
                .sabun(autoReplyDto.getInsSabun()).build()
        ).get();

        if(!smUser.getName().isEmpty() && !smUser.getName().isBlank()) {
            autoReplyRepository.save(AutoReply.builder()
                    .id(AutoReplyId.builder()
                            .workId(autoReplyDto.getWorkId())
                            .type(autoReplyDto.getType()).build())
                    .content(autoReplyDto.getContent())
                    .insSabun(autoReplyDto.getInsSabun())
                    .insName(autoReplyDto.getInsName())
                    .insDate(autoReplyDto.getInsDate())
                    .build());
        }
    }

    @Override
    public void update(AutoReplyDto autoReplyDto, String sabun) {
        AutoReply checker = autoReplyRepository.findById(AutoReplyId.builder().workId(autoReplyDto.getWorkId()).type(autoReplyDto.getType()).build()).get();
        SmUser smUser = smUserRepository.findById(SmUserId.builder().sabun(sabun).workId(autoReplyDto.getWorkId()).build()).get();
        if(smUser != null) {
            checker.setContent(autoReplyDto.getContent());
            autoReplyRepository.save(checker);
        } else {
            throw new CustomException(ErrorCode.AUTHENTICATION);
        }
    }

    @Override
    public void delete(AutoReplyDto autoReplyDto, String sabun) {
        AutoReply checker = autoReplyRepository.findById(AutoReplyId.builder().workId(autoReplyDto.getWorkId()).type(autoReplyDto.getType()).build()).get();
        SmUser smUser = smUserRepository.findById(SmUserId.builder().sabun(sabun).workId(autoReplyDto.getWorkId()).build()).get();
        if(smUser != null) {
            autoReplyRepository.delete(checker);
        } else {
            throw new CustomException(ErrorCode.AUTHENTICATION);
        }
    }
}
