package com.erp.provisioning;

import lombok.Data;

import java.time.Instant;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * 프로비저닝 작업 진행 상태. 프론트가 /status/{id} 폴링으로 받아감.
 * 인메모리 ProvisioningRegistry 가 보관. 서버 재시작 시 유실되며, 그 경우 failed 로 간주.
 */
@Data
public class ProvisioningStatus {

    /** 프로비저닝 작업 고유 ID (UUID) */
    private String id;
    /** 생성 요청한 회사 코드 */
    private String companyCode;
    /** 생성 대상 DB 이름 (예: qnc_invyone) */
    private String dbName;
    /** 서브도메인 */
    private String subdomain;

    /** Step.name() — 프론트에서 로컬라이즈 */
    private String currentStep;
    /** 1부터. 완료하면 progress == totalSteps */
    private int progress;
    private int totalSteps;

    /** in_progress | completed | failed */
    private String status;
    /** 실패 시 어느 Step 에서 터졌는지 */
    private String failedStep;
    private String errorMessage;

    private Instant startedAt;
    private Instant completedAt;

    public enum Step {
        /** 메타 DB 에 COMPANY_MNG row 선반영 (status=pending) */
        REGISTER_META,
        /** CREATE DATABASE */
        CREATE_DATABASE,
        /** pg_dump --schema-only | psql */
        COPY_SCHEMA,
        /** 선택된 테이블 데이터 복사 (company_code 필터) */
        COPY_DATA,
        /** {prefix}_admin 계정 생성 */
        CREATE_ADMIN,
        /** COMPANY_MNG.db_status=active */
        FINALIZE
    }

    public Map<String, Object> toMap() {
        Map<String, Object> m = new LinkedHashMap<>();
        m.put("id", id);
        m.put("companyCode", companyCode);
        m.put("dbName", dbName);
        m.put("subdomain", subdomain);
        m.put("currentStep", currentStep);
        m.put("progress", progress);
        m.put("totalSteps", totalSteps);
        m.put("status", status);
        m.put("failedStep", failedStep);
        m.put("errorMessage", errorMessage);
        m.put("startedAt", startedAt == null ? null : startedAt.toString());
        m.put("completedAt", completedAt == null ? null : completedAt.toString());
        return m;
    }
}
