package kr.itn.itnhub.seed;

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

import java.io.InputStream;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

@Service
public class SeedService {

    private final SeedParser parser;
    private final OrganizationMapper mapper;

    public SeedService(SeedParser parser, OrganizationMapper mapper) {
        this.parser = parser;
        this.mapper = mapper;
    }

    @Transactional
    public SeedReport seed(InputStream xlsx) {
        List<SeedRow> rows = parser.parse(xlsx);

        Set<String> before = new HashSet<>();
        for (Organization existing : mapper.findAll()) {
            before.add(key(existing.getOrgNo(), existing.getOrgName()));
        }

        int created = 0;
        int updated = 0;

        for (SeedRow row : rows) {
            if (before.contains(key(row.orgNo(), row.orgName()))) {
                updated++;
            } else {
                created++;
            }
            mapper.upsertBySeed(toOrganization(row));
        }

        return new SeedReport(created, updated, rows.size());
    }

    private String key(String orgNo, String orgName) {
        return orgNo + " " + orgName;
    }

    private Organization toOrganization(SeedRow row) {
        Organization org = new Organization();
        org.setOrgNo(row.orgNo());
        org.setOrgName(row.orgName());
        org.setChannelSlug(row.channelSlug());
        org.setDeptName(row.deptName());
        org.setManagerName(row.managerName());
        org.setManagerTitle(row.managerTitle());
        org.setManagerPhone(row.managerPhone());
        org.setManagerEmail(row.managerEmail());
        return org;
    }
}
