package kr.itn.itnhub.re;

import kr.itn.itnhub.org.OrgNotFoundException;
import kr.itn.itnhub.org.OrganizationMapper;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

/**
 * 기관관리 상세의 RE 탭이 쓰는 서비스.
 *
 * <p>요구사항 [4]: 별도 양식 없이 메모장처럼 등록한다. 메모 1개가 RE 1개다.</p>
 */
@Service
public class ReMemoService {

    private final ReMemoMapper mapper;
    private final OrganizationMapper orgMapper;

    public ReMemoService(ReMemoMapper mapper, OrganizationMapper orgMapper) {
        this.mapper = mapper;
        this.orgMapper = orgMapper;
    }

    public List<ReMemo> list(Long orgId) {
        requireOrg(orgId);
        return mapper.findByOrg(orgId);
    }

    @Transactional
    public List<ReMemo> add(Long orgId, ReMemoRequest request) {
        requireOrg(orgId);
        mapper.insert(orgId, request.content().trim(), request.author().trim(),
                blankToNull(request.memoDate()), request.resolved());
        return mapper.findByOrg(orgId);
    }

    @Transactional
    public List<ReMemo> update(Long orgId, Long memoId, ReMemoRequest request) {
        requireOrg(orgId);
        int updated = mapper.update(orgId, memoId, request.content().trim(),
                request.author().trim(), blankToNull(request.memoDate()), request.resolved());
        if (updated == 0) {
            throw new ReMemoNotFoundException("RE 메모를 찾을 수 없습니다: " + memoId);
        }
        return mapper.findByOrg(orgId);
    }

    @Transactional
    public void delete(Long orgId, Long memoId) {
        requireOrg(orgId);
        if (mapper.delete(orgId, memoId) == 0) {
            throw new ReMemoNotFoundException("RE 메모를 찾을 수 없습니다: " + memoId);
        }
    }

    private String blankToNull(String value) {
        return (value == null || value.isBlank()) ? null : value.trim();
    }

    private void requireOrg(Long orgId) {
        if (orgMapper.findById(orgId) == null) {
            throw new OrgNotFoundException("기관을 찾을 수 없습니다: " + orgId);
        }
    }
}
