<?php

function policyPageDefinitions() {
    return [
        'terms' => [
            'title' => '서비스 이용 안내',
            'short_title' => '이용 안내',
            'icon' => 'fa-solid fa-file-lines',
            'setting_key' => 'policy_terms_body',
            'default_body' => "이 서비스는 개인이 보관한 음악을 더 편하게 감상하고 정리하기 위한 개인 음악 스트리밍 서비스입니다.\n\n음악 파일은 관리자가 지정한 보관 위치의 파일을 기반으로 스캔되며, 원본 음악 파일을 웹 루트로 복사하지 않습니다. 서비스 화면에는 내부 파일 경로나 서버 구조를 표시하지 않습니다.\n\n비로그인 사용자는 서버 설정에 따라 30초 미리듣기만 제공될 수 있습니다. 전체 감상, 좋아요, 플레이리스트, 이어듣기 같은 개인화 기능은 로그인 후 사용하는 것을 기준으로 합니다.\n\n결제, 이용권, 마일리지 기능은 현재 제공하지 않습니다. 추후 제공될 경우 별도 안내와 동의 절차를 추가합니다.\n\n서비스 이용 중 오류나 불편사항은 피드백 / 오류 신고 기능을 통해 남길 수 있습니다.",
        ],
        'privacy' => [
            'title' => '개인정보 안내',
            'short_title' => '개인정보',
            'icon' => 'fa-solid fa-shield-halved',
            'setting_key' => 'policy_privacy_body',
            'default_body' => "서비스는 로그인, 재생 기록, 좋아요, 플레이리스트, 사용자 설정, 피드백 처리에 필요한 최소 정보를 저장합니다.\n\n최근 재생, 대기열, 테마, 홈 구성 같은 일부 설정은 비로그인 상태에서 브라우저 저장소에 저장될 수 있습니다. 로그인 사용자는 사용자별 설정 구조가 있는 경우 이를 우선 사용합니다.\n\n피드백, 오류 신고, 음악 정보 수정 요청에는 현재 페이지, 화면 이름, 사용자 ID, 곡 ID 같은 필요한 정보만 저장합니다. 실제 음악 파일 경로, 브라우저 콘솔 전체 내용, localStorage 전체 내용은 자동 수집하지 않습니다.\n\n관리자 화면의 로그와 알림에는 문제 파악에 필요한 요약 정보만 남기며, 내부 경로와 민감정보는 저장하거나 표시하지 않도록 처리합니다.",
        ],
        'copyright' => [
            'title' => '저작권 / 콘텐츠 이용 안내',
            'short_title' => '저작권',
            'icon' => 'fa-solid fa-copyright',
            'setting_key' => 'policy_copyright_body',
            'default_body' => "이 서비스는 개인 보관 음악을 개인적인 감상과 정리 목적으로 사용하는 것을 전제로 합니다. 외부 배포, 무단 공유, 공중 송신 목적의 사용을 지원하지 않습니다.\n\n음악 파일, 앨범아트, 가사 등은 각 권리자의 저작권 보호 대상일 수 있습니다. 사용자는 본인이 이용할 권한이 있는 콘텐츠만 등록하고 감상해야 합니다.\n\n가사 검색 도우미는 자동 수집 기능이 아니라 사용자가 직접 확인한 가사를 등록하기 쉽게 돕는 보조 기능입니다. 등록 전 권리 관계와 이용 가능 여부를 직접 확인해야 합니다.\n\n앨범아트가 없거나 손상된 경우 기본 커버가 표시될 수 있으며, 외부 이미지 자동 수집은 기본 기능으로 제공하지 않습니다.",
        ],
    ];
}

function policyAllowedType($type) {
    $type = strtolower(trim((string)$type));
    $definitions = policyPageDefinitions();
    return isset($definitions[$type]) ? $type : 'terms';
}

function policyCleanBody($value, $limit = 8000) {
    $value = ensureUtf8String($value);
    $value = str_replace(["\r\n", "\r"], "\n", $value);
    $value = strip_tags($value);
    $value = maskInternalPathText($value);
    $value = preg_replace("/\n{4,}/", "\n\n\n", $value);
    $value = trim((string)$value);
    if ($limit > 0) {
        if (function_exists('mb_strlen') && function_exists('mb_substr')) {
            if (mb_strlen($value, 'UTF-8') > $limit) {
                $value = mb_substr($value, 0, $limit, 'UTF-8');
            }
        } elseif (strlen($value) > $limit) {
            $value = substr($value, 0, $limit);
        }
    }
    return $value;
}

function policyGetContent($type) {
    $definitions = policyPageDefinitions();
    $type = policyAllowedType($type);
    $definition = $definitions[$type];
    $body = getSetting($definition['setting_key'], $definition['default_body']);
    $body = policyCleanBody($body);
    return $body !== '' ? $body : $definition['default_body'];
}

function policySaveContent($type, $body) {
    $definitions = policyPageDefinitions();
    $type = policyAllowedType($type);
    $body = policyCleanBody($body);
    if ($body === '') {
        $body = $definitions[$type]['default_body'];
    }
    return setSetting($definitions[$type]['setting_key'], $body, 'policy');
}

function policySafeAdminError(Throwable $e) {
    $message = maskInternalPathText($e->getMessage());
    if (preg_match('/SQLSTATE|PDOException|Stack trace|Fatal error|Warning:|Notice:|[A-Z]:[\\\\\/]/i', $message)) {
        return '정책 문구 저장 중 오류가 발생했습니다. 오류 로그를 확인해 주세요.';
    }
    return $message !== '' ? $message : '정책 문구 처리 중 오류가 발생했습니다.';
}

