<?php

namespace Config;

use CodeIgniter\Config\BaseConfig;

/**
 * 사용자 역할(mb_level) 코드 매핑
 *
 * Phase 2 메뉴·권한 제어 시 config('Roles')로 참조
 */
class Roles extends BaseConfig
{
    /**
     * mb_level 상수 (member.mb_level)
     */
    public const LEVEL_SUPER_ADMIN   = 4;
    /** 본부 관리자 — 현재는 super admin과 동일한 관리자 권한(지자체 선택 후 작업). 추후 super 전용 기능 분리 시 여기만 조정 */
    public const LEVEL_HEADQUARTERS_ADMIN = 5;
    public const LEVEL_LOCAL_ADMIN   = 3;  // 지자체관리자
    public const LEVEL_SHOP          = 2;  // 지정판매소
    public const LEVEL_CITIZEN       = 1;  // 일반 사용자(시민)

    /**
     * mb_level → 한글명 매핑
     *
     * @var array<int, string>
     */
    public array $levelNames = [
        self::LEVEL_CITIZEN     => '일반 사용자',
        self::LEVEL_SHOP        => '지정판매소',
        self::LEVEL_LOCAL_ADMIN => '지자체관리자',
        self::LEVEL_SUPER_ADMIN => 'super admin',
        self::LEVEL_HEADQUARTERS_ADMIN => '본부 관리자',
    ];

    /**
     * super admin(4) 또는 본부 관리자(5) — 동일 관리자 UX(지자체 선택 등)에 사용
     */
    public static function isSuperAdminEquivalent(int $level): bool
    {
        return $level === self::LEVEL_SUPER_ADMIN || $level === self::LEVEL_HEADQUARTERS_ADMIN;
    }

    /**
     * 기본코드(종류·세부) 등록·수정·삭제 가능 (super admin(4) · 본부 관리자(5)만)
     */
    public static function canManageCodeMaster(int $level): bool
    {
        return self::isSuperAdminEquivalent($level);
    }

    /**
     * 기본코드 종류(code_kind) CRUD — super·본부만
     */
    public static function canManageCodeKindMaster(int $level): bool
    {
        return self::isSuperAdminEquivalent($level);
    }

    /**
     * 플랫폼 공통 세부코드(CSV·시드) 수정·삭제 — super·본부만
     */
    public static function canEditPlatformCodeDetail(int $level): bool
    {
        return self::isSuperAdminEquivalent($level);
    }

    /**
     * 세부코드 행 단위 수정/삭제 가능 여부
     *
     * @param object $row code_detail (cd_source, cd_lg_idx)
     */
    public static function canEditCodeDetailRow(int $level, object $row, ?int $adminEffectiveLgIdx): bool
    {
        if (! self::canManageCodeMaster($level)) {
            return false;
        }
        $src = $row->cd_source ?? 'platform';
        $lg  = (int) ($row->cd_lg_idx ?? 0);
        if ($src === 'platform' && $lg === 0) {
            return self::canEditPlatformCodeDetail($level);
        }
        if (self::isSuperAdminEquivalent($level)) {
            return true;
        }

        return $adminEffectiveLgIdx !== null && $adminEffectiveLgIdx > 0 && $lg === $adminEffectiveLgIdx;
    }

    /**
     * TOTP 2차 인증 적용 대상 (지자체·super·본부 관리자)
     */
    public static function requiresTotp(int $level): bool
    {
        return $level === self::LEVEL_LOCAL_ADMIN
            || $level === self::LEVEL_SUPER_ADMIN
            || $level === self::LEVEL_HEADQUARTERS_ADMIN;
    }

    /**
     * 자체 회원가입 시 기본 역할 (mb_level)
     */
    public int $defaultLevelForSelfRegister = self::LEVEL_CITIZEN;

    /**
     * mb_level 유효 여부
     */
    public function isValidLevel(int $level): bool
    {
        return isset($this->levelNames[$level]);
    }

    /**
     * mb_level 한글명 반환
     */
    public function getLevelName(int $level): string
    {
        return $this->levelNames[$level] ?? '알 수 없음';
    }
}
