package com.zioinfo.mes;

import com.zioinfo.mes.oee.MesOeeRecord;
import com.zioinfo.mes.oee.OeeService;
import org.junit.jupiter.api.Test;

import java.util.Map;

import static org.junit.jupiter.api.Assertions.*;

/** OEE 산식 테스트 — 가동률 × 성능 × 품질. compute() 는 DB 미사용(순수 계산). */
class OeeComputeTest {

    // compute() 는 mapper/audit 를 사용하지 않으므로 null 주입(순수 산식 검증).
    private final OeeService service = new OeeService(null, null);

    @Test
    void oee_equalsAvailabilityTimesPerformanceTimesQuality() {
        MesOeeRecord r = new MesOeeRecord();
        r.setPlannedTimeMin(480.0);   // 계획 480분
        r.setRunTimeMin(420.0);       // 가동 420분 → 가동률 0.875
        r.setIdealCycleMin(0.5);      // 이상 사이클 0.5분/개
        r.setTotalCount(800.0);       // 총 800개 → 성능 = (0.5*800)/420 = 0.952
        r.setGoodCount(780.0);        // 양품 780 → 품질 0.975

        Map<String, Object> m = service.compute(r);
        double availability = (double) m.get("availability");
        double performance = (double) m.get("performance");
        double quality = (double) m.get("quality");
        double oee = (double) m.get("oee");

        assertEquals(0.875, availability, 0.001);
        assertEquals(0.9524, performance, 0.001);
        assertEquals(0.975, quality, 0.001);
        assertEquals(availability * performance * quality, oee, 0.001);
    }

    @Test
    void oee_clampsAndHandlesZero() {
        MesOeeRecord r = new MesOeeRecord();
        // 모두 0 → 0으로 안전 처리(0 나눗셈 없음)
        Map<String, Object> m = service.compute(r);
        assertEquals(0.0, (double) m.get("oee"), 0.0001);
    }
}
