<?php

declare(strict_types=1);

namespace Kylin\Ecommerce\Services;

/**
 * 收货地址脱敏服务
 *
 * 依据《个人信息保护法》第五十一条：
 * 收货地址属于敏感个人信息，展示时需脱敏处理。
 *
 * 依据《电子商务法》第二十三条：
 * 电子商务经营者收集、使用其用户的个人信息，应当遵守法律、行政法规有关个人信息保护的规定。
 *
 * 脱敏规则：
 *  - 收货人姓名：仅保留姓氏
 *  - 手机号：保留前3后4
 *  - 详细地址：保留省市区，隐藏门牌号
 *
 * 使用方式：
 *   $masked = AddressMasker::mask($address);
 *   $masked = AddressMasker::maskForDisplay($order);
 */
final class AddressMasker
{
    /**
     * 脱敏收货地址
     *
     * @param array $address 地址数据（含 name/phone/province/city/district/detail）
     * @return array 脱敏后的地址
     */
    public static function mask(array $address): array
    {
        $masked = $address;

        // 收货人姓名脱敏
        if (isset($masked['name']) && is_string($masked['name'])) {
            $masked['name'] = self::maskName($masked['name']);
        }
        if (isset($masked['receiver_name']) && is_string($masked['receiver_name'])) {
            $masked['receiver_name'] = self::maskName($masked['receiver_name']);
        }

        // 手机号脱敏
        if (isset($masked['phone']) && is_string($masked['phone'])) {
            $masked['phone'] = self::maskPhone($masked['phone']);
        }
        if (isset($masked['mobile']) && is_string($masked['mobile'])) {
            $masked['mobile'] = self::maskPhone($masked['mobile']);
        }

        // 详细地址脱敏
        if (isset($masked['detail']) && is_string($masked['detail'])) {
            $masked['detail'] = self::maskDetail($masked['detail']);
        }
        if (isset($masked['address']) && is_string($masked['address'])) {
            $masked['address'] = self::maskDetail($masked['address']);
        }

        return $masked;
    }

    /**
     * 脱敏用于展示的订单地址
     *
     * @param array $order 订单数据
     * @return array 脱敏后的订单
     */
    public static function maskForDisplay(array $order): array
    {
        if (isset($order['address']) && is_array($order['address'])) {
            $order['address'] = self::mask($order['address']);
        }

        if (isset($order['receiver_name'])) {
            $order['receiver_name'] = self::maskName($order['receiver_name']);
        }
        if (isset($order['receiver_phone'])) {
            $order['receiver_phone'] = self::maskPhone($order['receiver_phone']);
        }

        return $order;
    }

    /**
     * 脱敏姓名
     */
    public static function maskName(string $name): string
    {
        if (mb_strlen($name) <= 1) {
            return '*';
        }
        return mb_substr($name, 0, 1) . str_repeat('*', mb_strlen($name) - 1);
    }

    /**
     * 脱敏手机号
     */
    public static function maskPhone(string $phone): string
    {
        if (mb_strlen($phone) < 7) {
            return '****';
        }
        return mb_substr($phone, 0, 3) . '****' . mb_substr($phone, -4);
    }

    /**
     * 脱敏详细地址
     */
    private static function maskDetail(string $detail): string
    {
        if (mb_strlen($detail) <= 6) {
            return '****';
        }
        // 保留前6个字符（省市区）+ 隐藏门牌号
        return mb_substr($detail, 0, 6) . '****';
    }

    /**
     * 获取完整的地址字符串（脱敏后）
     *
     * @param array $address 地址数据
     * @return string 脱敏后的完整地址
     */
    public static function toMaskedString(array $address): string
    {
        $masked = self::mask($address);

        $parts = [];
        if (! empty($masked['province'])) $parts[] = $masked['province'];
        if (! empty($masked['city'])) $parts[] = $masked['city'];
        if (! empty($masked['district'])) $parts[] = $masked['district'];
        if (! empty($masked['detail'])) $parts[] = $masked['detail'];

        return implode('', $parts);
    }
}