# Author:Qiang
"""
        程序:购物车程序2.0
        1.0
        需求: 1.启动程序后,让用户输入工资,然后打印商品列表
                    2.允许用户根据商品编号购买物品
                    3.用户选择商品后,检测余额是否够,够就直接扣款,不够就提醒
                    4.可随时退出,退出时,打印已购买商品和余额

        2.0
        需求: 1.用户入口
                ·商品信息存在文件里
                ·已购商品,余额记录
              2.商家入口
                ·可以添加商品,修改价格
"""

product_list = "product_list.txt"   # 存放商品列表的文本
username_list = {}  # 用于存储用户的用户名和余额
username_list1 = "username_list.txt"  # 存放用户名和余额

user_shopping = []  # 用于存储用户单个购买的商品和价格
user_shopping_list = []  # 用户存储用户的总体消费记录

while True:
    choice = input("请输入您是商家还是顾客 >>>: ")   # 获取输入
    if choice == "商家":                        # 判断是否为商家端
        print("您已进入商家端".center(50, "-"))
        while True:
            merchant_choice = input("请选择 “添加商品”, “查看商品”  >>>: ")              # 商家选择需要进行的选项
            if merchant_choice == "添加商品":                            # 进入修改商品界面
                with open(product_list, "a+") as f:
                    count4 = False
                    while True:
                        if count4:
                            break
                        merchant_input_product = input("请输入需要添加的商品 >>>: ")  # 奇数为商品,偶数为价格
                        merchant_input_product = merchant_input_product + '\n'                  # 换行
                        f.write(merchant_input_product)                                         # 写入
                        merchant_input_product_price = input("请输入改商品价格 >>>: ")             # 将价格写入第二行
                        merchant_input_product_price = merchant_input_product_price + '\n'      # 换行
                        f.write(merchant_input_product_price)                                   # 写入
                        print("添加成功".center(50, "-"))                                         # 提示添加成成功
                        while True:
                            merchant_choice2 = input("如果继续添加商品请按'c',返回上一层请按‘b’,退出请按‘q’ >>>: ")        # 让商家选择接下来的操作
                            if merchant_choice2 == 'c':                                           # 继续添加商品
                                break
                            elif merchant_choice2 == 'b':                                         # 返回上一层
                                count4 = True
                                break
                            elif merchant_choice2 == 'q':                                         # 退出程序
                                exit()
                            else:                                                                 # 如果输入的字符都不符合,则提示输入有误
                                print("您输入的有误,请重新输入")
            elif merchant_choice == "查看商品":                           # 进入查看商品界面
                count = 1                                                # 定义变量用于统计次数
                product2 = ""                                            # 定义变量用存储偶数行的价格
                f = open(product_list, "r")                              # 打开文件  只读
                while True:
                    product1 = f.readline()                              # 逐行读取
                    if product1 == '':                                   # 当读取到的行数为空时   结束读取
                        break
                    if count == 1:                                       # 第一次进入
                        product2 = product1.strip()                      # 保存商品到product2中
                    elif count == 2:                                     # 第二次进入
                        product1 = product2 + "  " + product1.strip()    # 把product1的价格 添加到 product2后 并赋值给 product1
                        print(product1)                                  # 输出商品和价格
                    else:
                        if (count % 2) != 0:                             # 当行数为奇数  即所在行数为价格
                            product2 = product1
                        else:
                            product1 = product2.strip() + "  " + product1.strip()
                            print(product1)
                    count += 1                             # 行数+1
                f.close()                                  # 当文本读取完时  关闭
                merchant_choice3 = input("返回上一层请按‘b’,退出请按‘q’ >>>: ")        # 让商家选择接下来的操作
                if merchant_choice3 == 'b':                                         # 返回上一层
                    continue
                elif merchant_choice3 == 'q':                                         # 退出程序
                    exit()
                else:                                                                 # 如果输入的字符都不符合,则提示输入有误
                    print("您输入的有误")
            elif merchant_choice == "b":
                break
            elif merchant_choice == "q":
                exit()
            else:
                print("您输入的有误,请重新输入")
    elif choice == "顾客":                      # 判断是否为用户端
        print("您已进入用户端".center(50, "-"))
        while True:
            user_choice4 = input("请选择登录或者注册 >>>: ")
            if user_choice4 == "登录":
                while True:
                    username = input("请输入您的用户名 >>>: ")
                    f = open(username_list1, "r")
                    count3 = False
                    while True:
                        product4 = f.readline()
                        if product4 == '':
                            break
                        product4 = product4.strip()
                        if username == product4:
                            count3 = True
                        elif count3:
                            product4 = int(product4.strip())
                            username_list[username] = product4  # 将username设置为字典的key,余额为value
                            break
                    f.close()
                    if count3:       # 判断用户名是否存在
                        if username_list[username] > 0:     # 判断该用户名有没有余额
                            salary = username_list[username]
                            print("Product List".center(50, "-"))
                            count = 1  # 定义变量用于统计次数
                            product2 = ""  # 定义变量用存储偶数行的价格
                            f = open(product_list, "r")  # 打开文件  只读
                            while True:
                                product1 = f.readline()  # 逐行读取
                                if product1 == '':  # 当读取到的行数为空时   结束读取
                                    break
                                if count == 1:  # 第一次进入
                                    product2 = product1.strip()  # 保存商品到product2中
                                elif count == 2:  # 第二次进入
                                    product1 = \
                                        product2 + "  " + product1.strip()  # 把product1的价格 添加到 product2后 并赋值给 product1
                                    print(product1)  # 输出商品和价格
                                else:
                                    if (count % 2) != 0:  # 当行数为奇数  即所在行数为价格
                                        product2 = product1
                                    else:
                                        product1 = product2.strip() + "  " + product1.strip()
                                        print(product1)
                                count += 1  # 行数+1
                            f.close()  # 当文本读取完时  关闭
                            print("返回上一层请按‘b’,退出请按‘q’ >>>: ")
                            print("-".center(50, '-'))
                            while True:
                                user_choice1 = input("请输入您想要购买的商品 >>>: ")  # 让顾客选择接下来的操作
                                if user_choice1 == 'b':  # 返回上一层
                                    break
                                elif user_choice1 == 'q':  # 退出程序
                                    exit()
                                else:
                                    f = open(product_list, "r")  # 打开商品列表
                                    count2 = False                  # 用于控制商品名字读取后 再循环一次
                                    while True:
                                        product3 = f.readline()      # 将文本中读取的字符赋值给product3
                                        if product3 == "":           # 如果为空则跳出循环结束读取
                                            break
                                        product3 = product3.strip()    # 去掉从文本中读取出字符的空格
                                        if user_choice1 == product3:      # 判断用户输入的商品是否与文本中对应
                                            user_shopping.append(user_choice1)      # 对应则添加到用户单个购买的商品和价格列表
                                            count2 = True
                                        elif count2:                         # 用于控制商品名字读取后 再循环一次  保存商品的价格
                                            product3 = int(product3.strip())          # 令价格强类型转换为整数
                                            if username_list[username] > product3:         # 判断用户的余额是否大于商品的价格
                                                username_list[username] = \
                                                    username_list[username] - product3   # 如果大于则用余额减去商品价格完成扣费
                                                print("购买成功".center(50, "-"))
                                                user_shopping.append(product3)         # 将购买商品的价格添加到用户单个购买的商品和价格列表
                                                print("已成功将\033[32;1m%s\033[0m放入购物车,您的余额还剩\033[31;1m%s\033[0m元" %
                                                      (user_choice1, username_list[username]))   # 输出提示用户所剩余额
                                                user_shopping_list.append(user_shopping)   # 将用户单个购买的商品和列表添加到已购商品总列表
                                                user_choice2 = input("按任意键继续购买商品,按‘q’退出 >>>: ")
                                                if user_choice2 == 'q':   # 如果推出则打印用户购买的商品
                                                    if user_shopping_list == "":   # 判断已购商品总列表是否为空从而判断用户是否购买商品
                                                        print("你没有购买任何物品")
                                                    else:
                                                        print("已购商品".center(50, "-"))
                                                        for index, i in enumerate(user_shopping_list):   # 打印已购商品
                                                            print(index + 1, i)
                                                        print(user_shopping_list)
                                                        print("共计花费:%s元" % (salary-username_list[username]))  # 输出共计花费
                                                        print("".center(50, "-"))
                                                    print("您的余额还剩%s元" % (username_list[username]))
                                                    exit()
                                                else:
                                                    break
                                            else:
                                                print("您的余额不足!,只剩%s元" % (username_list[username]))
                                                user_choice3 = input("按任意键继续购买商品,按‘q’退出 >>>: ")
                                                if user_choice3 == 'q':  # 如果推出则打印用户购买的商品
                                                    if user_shopping_list == "":  # 判断已购商品总列表是否为空从而判断用户是否购买商品
                                                        print("你没有购买任何物品")
                                                    else:
                                                        print("已购商品".center(50, "-"))
                                                        for index, i in enumerate(user_shopping_list):  # 打印已购商品
                                                            print(index + 1, i)
                                                        print("共计花费:%s元" % (salary - username_list[username]))  # 输出共计花费
                                                        print("".center(54, "-"))
                                                    print("您的余额还剩%s元" % (username_list[username]))
                                                    exit()
                                                else:
                                                    break
                                    f.close()       # 关闭文件
                                    if count2 == False:           # 如果定义用来控制读取第二回循环count2 没有被改变,则该商品不在列表
                                        print("您输入的商品不在列表中,请重新输入")
                        else:
                            print("您的余额不足!")
                    else:    # 用户名不存在则进行注册
                        print("您输入的用户名不存在!")
            elif user_choice4 == "注册":
                with open(username_list1, "a+") as f:
                    register_username = input("请输入注册的用户名 >>>: ")         # 用户名
                    register_username = register_username + '\n'  # 换行
                    f.write(register_username)  # 写入
                    register_salary = input("请输入您的余额 >>>: ")  # 将用户余额写入第二行
                    register_salary = register_salary + '\n'  # 换行
                    f.write(register_salary)  # 写入
                    print("注册成功".center(50, "-"))
    else:
        print("您的输入错误,请重新输入")