import pymysql
from pathlib import Path
import configparser
import os
from argparse import ArgumentParser

命令 = ArgumentParser(prog='寻觅_手机号生成器', usage='可以根据地区,运营商,号段开头生成指定格式的手机号。',
                    description="如: `python .\生成手机号.py -y 电信,移动 -g 北京,上海 -hao 135,1801111`", add_help=False)
选填命令 = 命令.add_argument_group('选填命令', '下述命令都并非强制填写,可以选择性填写!')
选填命令.add_argument('-h', '--帮助', action='help', help='查看帮助信息')
选填命令.add_argument('-y', '--运营商', help='指定运营商(电信,联通,移动)')
选填命令.add_argument('-g', '--归属地', help='市级归属地(武汉,北京,成都)')
选填命令.add_argument('-hao', '--号段', help='开头号段(135,138,1808660)')


class 读取数据:
    def __init__(self, 配置名):
        当前_目录 = Path(__file__).resolve().parent
        self.读取配置 = 配置名
        self.配置数据 = configparser.ConfigParser()
        if os.access(os.path.join(当前_目录, "非公开数据\配置.ini"), os.F_OK):
            self.配置数据.read(os.path.join(当前_目录, "非公开数据\配置.ini"), encoding="utf-8-sig")
        else:
            self.配置数据.read(os.path.join(当前_目录, "数据\配置.ini"), encoding="utf-8-sig")

    def 读取参数(self, 参数名):
        return self.配置数据.get(self.读取配置, 参数名)


class 手机号处理:
    def __init__(self, 归属地=None, 运营商=None, 号段=None, 配置名="数据库", 表名="手机号来源地查询"):
        配置数据 = 读取数据(配置名)
        数据库连接 = pymysql.connect(
            host=配置数据.读取参数('地址'),
            port=int(配置数据.读取参数('端口')),
            db=配置数据.读取参数('数据库'),
            user=配置数据.读取参数('用户名'),
            passwd=配置数据.读取参数('密码'),
            charset='utf8'
        )
        self.表名 = 表名
        self.数据库游标 = 数据库连接.cursor()

        def 列表转sql语句(表头, 内容数据):
            sql语句 = None
            if 内容数据:
                内容数据 = 内容数据.split(',')
                表头 = "`" + 表头 + "`"
                for 内容 in 内容数据:
                    if 表头 == '`归属地`' or 表头 == '`运营商`':
                        内容 = "'%" + 内容 + "%'"
                    else:
                        内容 = "'" + 内容 + "%'"
                    if sql语句:
                        sql语句 += " OR " + 表头 + " LIKE " + 内容
                    else:
                        sql语句 = 表头 + " LIKE " + 内容
                return sql语句
            else:
                return '1=1'

        self.归属地 = 列表转sql语句('归属地', 归属地)
        self.运营商 = 列表转sql语句('运营商', 运营商)
        self.号段 = 列表转sql语句('号段', 号段)

    def 读取指定数据(self):
        数据库查询语句拼接 = str(
            "SELECT * FROM " + self.表名 + " WHERE (" + self.归属地 + ") AND (" + self.运营商 + ") AND (" + self.号段 + ");"
        )
        self.数据库游标.execute(数据库查询语句拼接)
        return self.数据库游标.fetchall()

    def 完善号码(self, 待完善号码):
        号码 = []
        for x in 待完善号码:
            完善位数 = int(11 - len(str(x)))
            for y in range(10 ** (完善位数 - 1), 10 ** 完善位数):
                号码.append(str(x) + str(y))
        for i in range(10 ** (完善位数-1)):
            号码.append(str(i).rjust(完善位数, '0'))
        return 号码

    def 运行(self, 保存为文件=True):
        try:
            号码头 = [i[1] for i in self.读取指定数据()]
        except:
            print("未找到相关手机号段")
            return
        print('找到:', len(号码头), '个号段,正在生产所有号码...')
        全部号码 = self.完善号码(号码头)
        print('号码查询完成,一共:', len(全部号码), '个号码,正在输出中...')
        if 保存为文件:
            with open('测试数据/手机号.txt', 'a') as 输出:
                for i in 全部号码:
                    输出.write(i + "\n")
        return 全部号码


if 命令.parse_args().归属地 or 命令.parse_args().运营商 or 命令.parse_args().号段:
    手机号处理(命令.parse_args().归属地, 命令.parse_args().运营商, 命令.parse_args().号段).运行()
else:
    print(命令.format_help())
