import re
import os
import openpyxl
from openpyxl.styles import Alignment

def get_user_input():
    """获取姓名输入（不能为空）"""
    while True:
        name = input("请输入要拼接的姓名(Excel用)：").strip()
        if name:
            break
        print("❌ 姓名不能为空，请重新输入!\n")
    return name

def generate_telphone_link():
    """输入地区 + 手机号前三位，生成 telphone.cn 可访问链接"""
    print("=== 生成 telphone.cn 号段查询链接 ===")
    
    # 1. 输入地区
    region = input("请输入地区（如：北京、上海、广州）：").strip()
    if not region:
        print("❌ 地区不能为空")
        return None
    
    # 2. 输入前三位并校验
    prefix = input("请输入手机号前三位（如：182、138）：").strip()
    if not (prefix.isdigit() and len(prefix) == 3):
        print("❌ 前三位必须是3位数字")
        return None
    
    # 3. 生成链接
    link = f"https://telphone.cn/prefix/{region}{prefix}/"
    print("\n✅ 生成的可访问链接：")
    print(link)
    
    # 可选：自动复制到剪贴板（需先安装：pip install pyperclip）
    try:
        import pyperclip
        pyperclip.copy(link)
        print("📋 链接已复制到剪贴板，请打开链接复制号段信息")
    except ImportError:
        print("ℹ️ 如需自动复制链接，执行：pip install pyperclip")
    return prefix

def extract_segments_from_input():
    """
    让用户粘贴号段文本，连续按两次回车即结束
    从中提取7位有效号段
    """
    print("\n=== 粘贴号段信息 ===")
    print("请粘贴号段文本，完成后**连续按两下回车**即可提取：")
    
    input_lines = []
    empty_count = 0  # 连续空行计数
    
    while True:
        line = input()
        stripped = line.strip()
        
        if not stripped:
            empty_count += 1
            if empty_count >= 2:
                break  # 连续两个空行，结束输入
        else:
            empty_count = 0
            input_lines.append(line)
    
    content = "\n".join(input_lines)
    if not content.strip():
        print("❌ 未输入任何号段文本")
        return []
    
    # 匹配7位手机号段
    segment_pattern = re.compile(r'1[3-9]\d{5}')
    phone_segments = set()
    matches = segment_pattern.findall(content)
    
    for seg in matches:
        phone_segments.add(seg)
    
    if not phone_segments:
        print("❌ 未从输入文本中提取到任何7位有效号段")
        return []
    
    print(f"✅ 成功提取到 {len(phone_segments)} 个不重复的7位号段")
    return sorted(list(phone_segments))

def generate_from_segment(segment, digit_type, user_digits):
    """根据7位号段+后N位生成手机号"""
    generated = []
    segment = segment[:7]
    if digit_type == 2:
        for i in range(1, 100):
            fill = str(i).zfill(2)
            generated.append(segment + fill + user_digits)
    elif digit_type == 3:
        for i in range(1, 10):
            generated.append(segment + str(i) + user_digits)
    elif digit_type == 4:
        generated.append(segment + user_digits)
    return generated

def generate_from_full_template(template):
    """全国模式：按1-99/999/9999生成占位符数字"""
    template = template.lower()
    x_count = template.count('x')
    
    if x_count == 0:
        return [template]
    
    start = 1
    end = (10 ** x_count) - 1
    generated = []
    
    for num in range(start, end + 1):
        fill_digits = str(num).zfill(x_count)
        full_phone = template.replace('x' * x_count, fill_digits, 1)
        generated.append(full_phone)
    return generated

def sanitize_filename(filename):
    """清理文件名中的非法字符"""
    illegal_chars = r'\/:*?"<>|'
    for char in illegal_chars:
        filename = filename.replace(char, '_')
    return filename

def save_to_excel(phone_list, name, suffix="", batch_size=3000):
    """保存手机号到Excel（分批+格式优化）"""
    total_phones = len(phone_list)
    total_batches = (total_phones + batch_size - 1) // batch_size
    success_list = []
    fail_list = []

    for batch_num in range(1, total_batches + 1):
        start_idx = (batch_num - 1) * batch_size
        end_idx = min(batch_num * batch_size, total_phones)
        current_phones = phone_list[start_idx:end_idx]
        
        raw_filename = f"{suffix}_{name}_第{batch_num}批.xlsx"
        filename = sanitize_filename(raw_filename)

        try:
            wb = openpyxl.Workbook()
            ws = wb.active
            ws.title = f"手机号列表_第{batch_num}批"
            
            for idx, phone in enumerate(current_phones, 1):
                ws.append([idx, phone, name, 1])
            
            for col in ws.columns:
                max_length = 0
                col_letter = col[0].column_letter
                for cell in col:
                    try:
                        if len(str(cell.value)) > max_length:
                            max_length = len(str(cell.value))
                    except:
                        pass
                adjusted_width = min(max_length + 2, 25)
                ws.column_dimensions[col_letter].width = adjusted_width
            
            for row in ws.rows:
                for cell in row:
                    cell.alignment = Alignment(horizontal="center", vertical="center")
            
            wb.save(filename)
            success_list.append(f"第{batch_num}批（{len(current_phones)}个）：{filename}")
        except Exception as e:
            fail_list.append(f"第{batch_num}批：{str(e)}")

    print("\n=== 分批保存结果 ===")
    if success_list:
        print("✅ 成功保存：")
        for msg in success_list:
            print(f"   {msg}")
    if fail_list:
        print("❌ 保存失败：")
        for msg in fail_list:
            print(f"   {msg}")

def main():
    """主程序逻辑（整合号段查询+手动输入提取）"""
    print("=== 手机号生成工具（手动号段提取版）===")
    
    # 1. 获取姓名
    name = get_user_input()

    # 2. 选择生成模式
    while True:
        mode = input("\n请选择生成模式（输入1或2）：\n1. 手动号段模式（从telphone.cn复制号段）\n2. 全国模式（直接输入模板）\n").strip()
        if mode in ["1", "2"]:
            break
        print("❌ 输入错误！只能选择1或2，请重新输入。")

    all_phones = []
    file_suffix = ""

    # 3. 手动号段模式
    if mode == "1":
        prefix = generate_telphone_link()
        if not prefix:
            print("❌ 链接生成失败，程序结束")
            return
        
        segments = extract_segments_from_input()
        if not segments:
            print("❌ 无有效号段，程序结束")
            return
        
        while True:
            digit_input = input("\n请选择要补充的手机号位数（2/3/4）：").strip()
            if digit_input in ["2", "3", "4"]:
                digit_type = int(digit_input)
                break
            print("❌ 输入错误！只能选择2、3、4，请重新输入。")
        
        while True:
            user_digits = input(f"请输入要补充的手机号后{digit_type}位数字：").strip()
            if len(user_digits) == digit_type and user_digits.isdigit():
                break
            print(f"❌ 输入错误！必须输入{digit_type}位纯数字，请重新输入。")
        
        for seg in segments:
            all_phones += generate_from_segment(seg, digit_type, user_digits)
        file_suffix = user_digits

    # 4. 全国模式
    else:
        while True:
            template = input("请输入手机号模板（x为占位符）：").strip()
            if len(template) == 11 and re.match(r'^[0-9xX]+$', template):
                break
            print("❌ 模板错误！必须是11位，且只能包含数字和x/X，请重新输入。")
        
        all_phones = generate_from_full_template(template)
        file_suffix = template.replace('x', '_').replace('X', '_')

    # 去重排序
    all_phones = sorted(list(set(all_phones)))
    total = len(all_phones)
    if total == 0:
        print("❌ 未生成任何有效手机号，程序结束")
        return
    print(f"\n✅ 生成完成！共生成 {total} 个不重复的11位手机号")

    # 示例
    print("\n📋 生成结果示例（前10个）：")
    for i, phone in enumerate(all_phones[:10], 1):
        print(f"   {i}. {phone}")
    if total > 10:
        print(f"   ... 共{total}个，省略后续显示")

    # 保存
    save_choice = input("\n是否保存为Excel文件？(y/n，默认y)：").strip().lower()
    if save_choice in ["y", ""]:
        save_to_excel(all_phones, name, file_suffix)
    else:
        print("📌 已取消保存，程序结束")

if __name__ == '__main__':
    main()
