/**
 * Phone Value Object
 * 手机号值对象 — 格式验证 + E.164 标准化 + 掩码显示
 */
export class Phone {
  /** 中国大陆手机号 (不带区号) */
  private static readonly CN_PATTERN = /^1[3-9]\d{9}$/;
  /** E.164 国际格式 */
  private static readonly E164_PATTERN = /^\+[1-9]\d{6,14}$/;

  private constructor(public readonly value: string) {}

  /**
   * 从原始输入创建 Phone，自动标准化为 E.164 格式
   * - `13800138000`  → `+8613800138000`
   * - `+8613800138000` → `+8613800138000`
   */
  static create(raw: string): Phone {
    const trimmed = raw.trim();

    // 已经是 E.164 格式
    if (Phone.E164_PATTERN.test(trimmed)) {
      return new Phone(trimmed);
    }

    // 中国大陆格式，自动补 +86
    if (Phone.CN_PATTERN.test(trimmed)) {
      return new Phone(`+86${trimmed}`);
    }

    throw new Error(`手机号格式无效: ${trimmed}`);
  }

  /**
   * 从已存储的 E.164 格式重建（跳过验证）
   */
  static fromStored(value: string): Phone {
    return new Phone(value);
  }

  /**
   * 掩码显示: +86138****8000
   */
  get masked(): string {
    if (this.value.startsWith('+86') && this.value.length === 14) {
      const local = this.value.slice(3); // 13800138000
      return `${local.slice(0, 3)}****${local.slice(7)}`;
    }
    // 通用掩码：保留前4后4
    const len = this.value.length;
    if (len <= 8) return this.value;
    return `${this.value.slice(0, 4)}${'*'.repeat(len - 8)}${this.value.slice(-4)}`;
  }

  /**
   * 本地号码 (去除国际区号)
   */
  get local(): string {
    if (this.value.startsWith('+86')) {
      return this.value.slice(3);
    }
    return this.value;
  }

  equals(other: Phone): boolean {
    return this.value === other.value;
  }

  toString(): string {
    return this.value;
  }
}
