import unicodedata
import adglobal as g
import adclass
import os
import sys
import pdb
def zhconv(str1):  # 住所入力中に郵便番号、電話番号を全角で入れてしまうので、全角数字を半角数字に変換する。住所中の全角数字も半角数字になる。
    size = len(str1)
    s = list(str1)  # 文字列内を変更できないので、一旦リストに変換
    str2 = [""] * size
    for k in range(size):
        c1 = s[k]
        if c1 in g.z:
            str2[k] = g.h[g.z.index(c1)]  # 全角数字を半角数字に置き換える。
        else:
            str2[k] = s[k]  # 全角数字以外はそのまま
    return ''.join(str2)   # リストを文字列に戻す。
def setdir():
    g.org_path = os.getcwd()  # org_path:カレンとディレクトリ
    os.chdir(g.ad_path)  # カレント・ディレクトリをad_pathに設定
def restoredir():
    os.chdir(g.org_path)
def setbook(ad_book):  # 住所録名ad_bookに基づいて住所録のパス文字列を作って返す。
    book_path = ad_path + "\\" + ad_book + ".csv"  # ad_book:住所録のパス名
    return book_path
def name_check(str1):  # 名前文字列の確認
    size = len(str1)    
    if size == 0 or size > 20:
        return False  # 長さ20字以上の名前は不可ということにする。
    return True
def postcode_check(str1):  # 郵便番号チェック
    size = len(str1)
    if size != 8:  # 郵便番号文字列の長さは8文字限定
        return False
    c1 = str1.count('-')
    if c1 == 1:  # ハイフン個数は1に限定
        m = str1.split('-')  # ハイフンで2つの文字列に分けてリストに入れる。
        if len(m) == 2:
            if len(m[0]) == 3 and len(m[1]) == 4:  # 最初の文字列の長さは3、2番目の文字列の長さは4
                if m[0].isdecimal() and m[1].isdecimal():  # 文字列は数字でできているか?
                    return True  # correct postcode
    return False  # illegal postcode
def address_check(str1):  # 住所文字列の確認(長さが0かどうかしか見ていない)
    size = len(str1)
    if size == 0:
        return False
    return True
def telno_check(str1):  # 電話番号の確認
    size = len(str1)
    if size == 0:
        return False
    if str1[0] != '0':  # '0'から始まらないときは、市外局番が省力されている。
        c1 = str1.count('-')
        if c1 == 1:  # ハイフンが1個のときは、m[1]は4文字のはず
            m = str.split('-')
            if len(m[1]) == 4:
                if m[0].isdecimal() and m[1].isdecimal():
                    return True
        if c1 == 0:
            if str1.isdecimal():
                return True
        else:
            return False  # 電話番号の最初の数字が'0'でない場合(市外局番なし)は、ハイフンが2個になることはない。
    c1 = str1.count('-')  # '0'から始まるときは、市外局番から始まっている
    if c1 == 2:  # ハイフンが2個入っている。
        m = str1.split('-')  # ハイフンで分割すると3つの文字列ができる。
        if len(m[2]) == 4:  # m[2]は4文字のはず
           if m[0].isdecimal() and m[1].isdecimal() and m[2].isdecimal():
               return True
        return False
    elif c1 == 1:  # ハイフンが1個のとき
        m = str1.split('-')  # ハイフンで分割すると2つの文字列ができる。
        if len(m[1]) == 4:  # m[1]は4文字のはず
            if m[0].isdecimal() and m[1].isdecimal():
                return True
        return False
    elif c1 == 0:  # ハイフンが入っていない。
        if str1.isdecimal():  # このときは、文字数を限定しない。
            return True
    return False  # str1は電話番号ではない。
def mail_check(str1):  # メール・アドレスのチェック
    size = len(str1)
    if size == 0:
        return False
    m = list(str1)  # 文字列を1文字ずつのリストに分解する。
    atc = 0  # atc:'@'を数える。
    prc = 0  # prc:'.'を数える。但し、通常文字でクリアする。
    cnt = 0  # cnt:文字数を数える。
    for c in m:
        u = ord(c)  # 文字のUTF-8コード(shift-JISと同じだが)を取り出す
        if (u > 47 and u < 58) or (u > 64 and u < 91) or (u > 96 and u < 123) or u == 95:
            cnt += 1  # 通常文字は文字数をカウント
            prc = 0  # '.'の連続検知のため通常文字で'.'の数を0にしておく
        elif u == 64:  # '@'検出
            if atc > 0:
                return False  # 2個目の'@'はエラー
            else:
                if prc > 0:
                    return False  # '.'直後の'@'はエラー
                atc += 1
                cnt += 1
        elif u == 46:  # '.'検出
            if prc > 0:
                return False  # '.'の連続はエラー
            prc += 1
            cnt += 1
        else:
            return False  # 通常文字の他"@._"以外の文字は使えない
    if atc == 0:
        return False  # 必ず'@'が1個入るはず。入らなければエラー
    if cnt > 30:  # mail文字列の長さは30文字まで
        return False  # 30文字を超えていたらエラー
    return True
def eachappend(ba, d):  # 項目毎のリストに追加する。ba:項目毎リスト。p:1人分データ
    p = d.p
    for i, da in enumerate(ba):
        da.append(p[i])
def len2(str):  # 半角全角を考慮した文字列幅の取得
    cnt = 0
    for c1 in str:
        if unicodedata.east_asian_width(c1) in "FWA":  # 2バイト系文字か?
            cnt += 2
        else:
            cnt += 1
    return cnt
def makestr(n, align, w, d, sep):  # n:表示項目数, align:左右寄せ, w:表示幅, d:表示文字列
    str1 = ""
    for i in range(n):  # i:項目番号
        w1 = w[i]  # 項目幅
        for c1 in d[i]:
            str1 = str1 + c1  # 幅の限界を超えてもどこまでも書き込む
            if unicodedata.east_asian_width(c1) in "FWA":  # 2バイト系文字か?
                w1 -= 2
            else:
                w1 -= 1
        if w1 > 0:
            if align[i] == "l":  # 左寄せ
                str1 = str1 + ' ' * w1  # 表示幅の不足する分を半角ブランクで埋める
            else:  # 右寄せ
                str1 = ' ' * w1 + str1
        str1 = str1 + sep
    return str1
check_func = [name_check, postcode_check, address_check, telno_check, mail_check]  # check関数のリスト