-- V33: 시책·인센티브 (incentive_program + incentive_payment)

-- ============================================================
-- 1. incentive_program — 시책 프로그램 마스터
-- ============================================================

CREATE TABLE incentive_program (
    program_id          BIGSERIAL       PRIMARY KEY,
    program_name        VARCHAR(200)    NOT NULL,               -- 시책명
    program_type        VARCHAR(30)     NOT NULL,               -- 시책 유형 (INCENTIVE_TYPE)
    target_type         VARCHAR(30)     NOT NULL DEFAULT 'AGENT', -- 지급 대상 (AGENT/ORG/GRADE)
    target_grade_id     BIGINT          REFERENCES grade(grade_id), -- 대상 직급 (NULL=전체)
    target_org_id       BIGINT          REFERENCES organization(org_id), -- 대상 조직 (NULL=전체)
    product_category    VARCHAR(30),                            -- 적용 상품 카테고리 (NULL=전체)
    start_month         CHAR(6)         NOT NULL,               -- 시책 시작 정산월 (YYYYMM)
    end_month           CHAR(6)         NOT NULL,               -- 시책 종료 정산월 (YYYYMM)
    condition_desc      VARCHAR(2000),                          -- 지급 조건 상세 기술
    pay_rate            NUMERIC(7,4),                           -- 지급률 (%) — rate 방식
    pay_amount_fixed    NUMERIC(15,2),                          -- 고정 지급액 — amount 방식
    pay_type            VARCHAR(20)     NOT NULL DEFAULT 'RATE', -- RATE / FIXED_AMOUNT
    budget_amount       NUMERIC(15,2),                          -- 시책 예산 (NULL=무제한)
    is_active           BOOLEAN         NOT NULL DEFAULT TRUE,
    created_at          TIMESTAMP       NOT NULL DEFAULT NOW(),
    created_by          BIGINT,
    updated_at          TIMESTAMP,
    updated_by          BIGINT,
    CHECK (end_month >= start_month),
    CHECK (pay_type IN ('RATE', 'FIXED_AMOUNT'))
);

COMMENT ON TABLE  incentive_program                  IS '시책 프로그램 마스터 — 기간/대상/조건/지급률 정의';
COMMENT ON COLUMN incentive_program.program_type     IS '시책 유형 코드 (INCENTIVE_TYPE 그룹)';
COMMENT ON COLUMN incentive_program.target_type      IS '지급 대상 구분 (AGENT=개인/ORG=조직/GRADE=직급)';
COMMENT ON COLUMN incentive_program.start_month      IS '시책 시작 정산월 (YYYYMM)';
COMMENT ON COLUMN incentive_program.end_month        IS '시책 종료 정산월 (YYYYMM, 포함)';
COMMENT ON COLUMN incentive_program.pay_rate         IS 'RATE 방식 시 지급률 (%)';
COMMENT ON COLUMN incentive_program.pay_amount_fixed IS 'FIXED_AMOUNT 방식 시 고정 지급액';
COMMENT ON COLUMN incentive_program.pay_type         IS 'RATE=수수료 대비 비율 / FIXED_AMOUNT=건당 고정액';

CREATE INDEX idx_ip_prog_month  ON incentive_program(start_month, end_month, is_active);
CREATE INDEX idx_ip_prog_type   ON incentive_program(program_type, is_active);

-- ============================================================
-- 2. incentive_payment — 시책 지급 이력
-- ============================================================

CREATE TABLE incentive_payment (
    incentive_pay_id    BIGSERIAL       PRIMARY KEY,
    program_id          BIGINT          NOT NULL REFERENCES incentive_program(program_id),
    agent_id            BIGINT          NOT NULL REFERENCES agent(agent_id),
    settle_month        CHAR(6)         NOT NULL,               -- 지급 정산월 (YYYYMM)
    base_amount         NUMERIC(15,2),                          -- 기준 수수료 (RATE 방식)
    incentive_amount    NUMERIC(15,2)   NOT NULL,               -- 시책 지급액
    status              VARCHAR(20)     NOT NULL DEFAULT 'CALCULATED', -- CALCULATED/CONFIRMED/PAID/CANCELLED
    calc_date           TIMESTAMP       NOT NULL DEFAULT NOW(),
    confirmed_by        BIGINT,
    confirmed_at        TIMESTAMP,
    settle_id           BIGINT          REFERENCES settle_master(settle_id), -- 반영된 정산
    cancel_reason       VARCHAR(500),
    created_at          TIMESTAMP       NOT NULL DEFAULT NOW(),
    updated_at          TIMESTAMP,
    UNIQUE (program_id, agent_id, settle_month)
);

COMMENT ON TABLE  incentive_payment                   IS '시책 지급 이력 — program_id + agent_id + settle_month 단위';
COMMENT ON COLUMN incentive_payment.base_amount       IS 'RATE 방식 시 계산 기준 수수료';
COMMENT ON COLUMN incentive_payment.incentive_amount  IS '최종 시책 지급액';
COMMENT ON COLUMN incentive_payment.status            IS 'CALCULATED/CONFIRMED/PAID/CANCELLED';
COMMENT ON COLUMN incentive_payment.settle_id         IS '시책 금액이 반영된 settle_master 참조';

CREATE INDEX idx_ipay_agent     ON incentive_payment(agent_id, settle_month);
CREATE INDEX idx_ipay_program   ON incentive_payment(program_id, settle_month);
CREATE INDEX idx_ipay_status    ON incentive_payment(status, settle_month);

-- ============================================================
-- 3. 공통코드 INCENTIVE_TYPE / INCENTIVE_PAY_STATUS
-- ============================================================

INSERT INTO common_code_group (group_code, group_name, description, is_system, sort_order) VALUES
    ('INCENTIVE_TYPE',       '시책유형',     'RECRUIT_BONUS/MAINTAIN_BONUS/SPECIAL/CONTEST/OTHER', 'Y', 340),
    ('INCENTIVE_PAY_STATUS', '시책지급상태', 'CALCULATED/CONFIRMED/PAID/CANCELLED',                'Y', 350)
ON CONFLICT (group_code) DO NOTHING;

INSERT INTO common_code (group_code, code, code_name, code_desc, sort_order) VALUES
    ('INCENTIVE_TYPE', 'RECRUIT_BONUS',  '신계약시책', '신계약 실적 기반 시책',           10),
    ('INCENTIVE_TYPE', 'MAINTAIN_BONUS', '유지시책',   '유지율 기반 시책',                 20),
    ('INCENTIVE_TYPE', 'SPECIAL',        '특별시책',   '본사 특별 지정 시책',              30),
    ('INCENTIVE_TYPE', 'CONTEST',        '콘테스트',   '경쟁 목표 달성 인센티브',         40),
    ('INCENTIVE_TYPE', 'OTHER',          '기타',       '기타 시책',                        50),
    ('INCENTIVE_PAY_STATUS', 'CALCULATED', '산출',     '시책 금액 산출 완료',              10),
    ('INCENTIVE_PAY_STATUS', 'CONFIRMED',  '확정',     '지급 확정',                        20),
    ('INCENTIVE_PAY_STATUS', 'PAID',       '지급완료', '정산 반영 완료',                   30),
    ('INCENTIVE_PAY_STATUS', 'CANCELLED',  '취소',     '시책 지급 취소',                   40)
ON CONFLICT (group_code, code) DO NOTHING;
