package kr.itn.itnhub.memo;

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;

/**
 * 기관관리 상세의 업무메모 탭이 쓰는 서비스. 전화 통화 등 담당자와의 연락 내용을
 * 기관별로 남겨두는 단순 CRUD이며, Mattermost와는 무관한 순수 DB 기능이다.
 */
@Service
public class WorkMemoService {

    private final WorkMemoMapper memoMapper;
    private final OrganizationMapper orgMapper;

    public WorkMemoService(WorkMemoMapper memoMapper, OrganizationMapper orgMapper) {
        this.memoMapper = memoMapper;
        this.orgMapper = orgMapper;
    }

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

    /**
     * 메모를 남긴다. 작성자는 화면에서 고르지 않고 <b>로그인한 사용자</b>를 그대로 기록한다
     * (요청자 확정: "담당자 입력란은 필요없고 로그인한 사람이 자동으로 표출되면 된다").
     */
    @Transactional
    public WorkMemo create(Long orgId, MemoRequest request, String author) {
        requireOrg(orgId);

        WorkMemo memo = new WorkMemo();
        memo.setOrgId(orgId);
        memo.setContactName(author);
        memo.setBody(request.body());
        memoMapper.insert(memo);

        // 방금 넣은 행이 created_at 기준 가장 최신이므로 목록의 첫 행이 곧 이 메모다.
        return memoMapper.findByOrg(orgId).get(0);
    }

    /** 본문만 고친다. 작성자·작성시각은 처음 값을 유지한다. */
    @Transactional
    public WorkMemo update(Long orgId, Long memoId, MemoRequest request) {
        requireOrg(orgId);

        int updated = memoMapper.updateBody(orgId, memoId, request.body());
        if (updated == 0) {
            throw new OrgNotFoundException("메모를 찾을 수 없습니다: " + memoId);
        }
        return memoMapper.findByOrg(orgId).stream()
                .filter(memo -> memo.getId().equals(memoId))
                .findFirst()
                .orElseThrow(() -> new OrgNotFoundException("메모를 찾을 수 없습니다: " + memoId));
    }

    @Transactional
    public void delete(Long orgId, Long memoId) {
        requireOrg(orgId);

        int deleted = memoMapper.delete(orgId, memoId);
        if (deleted == 0) {
            throw new OrgNotFoundException("메모를 찾을 수 없습니다: " + memoId);
        }
    }

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