package com.zioinfo.signage.service;

import com.zioinfo.signage.domain.SignDeployVo;
import com.zioinfo.signage.mapper.SignDeployMapper;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

@Service
@RequiredArgsConstructor
public class SignDeployService {
    private final SignDeployMapper mapper;

    public List<SignDeployVo> list(String tenantCode, String status, String keyword) {
        return mapper.findAll(tenantCode, status, keyword);
    }

    public SignDeployVo get(Long id) { return mapper.findById(id); }

    /**
     * 매장(간판) 단말이 30초 주기로 호출하는 간판정보 폴링.
     * 사업계획서 슬라이드20 계약 형식으로 최신 배포 파일 메타를 반환한다.
     * 대기 파일이 없으면 body=null(변경 없음). token 은 에코만(자격증명 미저장/미노출).
     */
    public Map<String, Object> poll(String storeCode, String token) {
        SignDeployVo v = mapper.findLatestForStore(storeCode);
        Map<String, Object> header = new LinkedHashMap<>();
        header.put("token", token == null ? "" : token);
        Map<String, Object> resp = new LinkedHashMap<>();
        resp.put("header", header);
        if (v == null) {
            resp.put("body", null);
            return resp;
        }
        mapper.markPolled(v.getId());
        Map<String, Object> body = new LinkedHashMap<>();
        body.put("type", v.getDeployType());
        body.put("sub_type", v.getSubType());
        body.put("code", v.getCode());
        body.put("path", v.getFilePath());
        body.put("md5", v.getMd5());
        body.put("file_name", v.getFileName());
        body.put("file_size", v.getFileSize() == null ? null : String.valueOf(v.getFileSize()));
        resp.put("body", body);
        return resp;
    }

    /** 단말이 파일 수신·적용 완료를 통지. */
    public void confirm(Long id) { mapper.markApplied(id); }

    public SignDeployVo create(SignDeployVo v) {
        mapper.insert(v);
        return mapper.findById(v.getId());
    }

    public SignDeployVo update(Long id, SignDeployVo v) {
        v.setId(id);
        mapper.update(v);
        return mapper.findById(id);
    }

    public void delete(Long id) { mapper.delete(id); }
}
