# -*- coding:utf-8 -*-
# --------------------------------------------------------
# Copyright (C), 2016-2021, lizhe, All rights reserved
# --------------------------------------------------------
# @Name:        my_money.py
# @Author:      lizhe
# @Created:     2021/9/14 - 22:12
# --------------------------------------------------------
import xlwings as xw
from abc import ABCMeta, abstractmethod
from typing import List, Dict

from automotive import Utils

outcome = "支出"
income = "收入"

categories = {
    '购物消费': {
        '衣裤鞋帽': ["领跑体育用品", "亚麻拖鞋", "优衣库"],
        '洗护用品': [],
        '厨房用品': ["佳帮手"],
        '家用纺织': [],
        '清洁用品': [],
        '家居日用': ["宜家家居", "厨房下水道", "佛山照明t5", "防滑垫", "外科口罩", "冰箱贴磁贴", "冰箱磁性贴", "香榭手机维修"],
        '家具家电': [],
        '汽车用品': [],
        '电子数码': ["小米之家", "罗马仕", "保护套", "腕带", "佳申驰通讯", "乾元宝融", "小米店", "小米科技"],
        '美妆护肤': [],
        '书报杂志': [],
        '眼镜': []},
    '食品酒水': {
        '早餐': ["禾央汤包", "全家购物", "安德鲁森", "泸州小笼包", "麦的多", "麦包点", "周小霞", "红旗连锁订单-262267876806093", "勇",
               "红旗连锁订单-262267874206093", "四川善禅农业科技有限公司"],
        '中餐': ["阿蠔海鲜焖面", "卢婆婆姜鸭面", "顺旺基", "荟福源", "宜宾燃面", "享米时", "老麻抄手", "西北面点王",
               "袁记云饺", "籣州牛肉面", "成都鸡汤抄手", "大巴山猪脚饭", "卤鹅饭", "e特黄焖鸡瓦香鸡成都店",
               "杨铭宇黄焖鸡米饭", "八二小区干海椒抄手", "晓武林烤鸭", "乡村基", "戊丰记卤肉饭", "沙县小吃成都银泰城店",
               "喜水饺", "兵哥豌豆面", "福记羊肉米粉", "岭南牛杂", "自小田", "搪瓷盌小面成都伏龙北巷", "蚝门圣焱", "本味简餐厅",
               "粤饺皇", "南城香冒烤鸭卤肉饭", "贰柒拾乐山干绍面", "拾小馆", "陕西面馆", "干辣椒抄手", "豆汤饭", "快餐店",
               "姜鸭面", "北方水饺", "匡胖子面馆", "余肥肠", "蜀人卤匠乌鸡米线", "张氏海味面", "担担面", "蒌兰兰州牛肉面"],
        '晚餐': ["庆元猪脚饭"],
        '零食': ["面包新语(银泰城店)", "雪糕批发", "一同零食", "商户_李黎明", "红旗连锁订单-261927364406093"],
        '水果': ["水果", "芭芭农场"],
        '超市购物': ["成都市北城天街店", "成都荆竹中路店", "麦德龙", "欧尚成都市高新店", "谊品生鲜", "高新店", "成都盒马",
                 "成都中营贸易", "招商雍华府店", "万家V+南区", "银犁冷藏", "金牛店", "恒旺超市", "支付宝签购单,永辉(成都市银泰城店)"],
        '烟酒茶': [],
        '外出美食': ["金翠河烧鹅餐厅", "马帮冒菜", "实惠啤酒鸭", "麦当劳", "食其家", "正反面", "青羊区东方宫牛肉拉面店", "成都港九餐饮",
                 "八二私房水饺", "鱼吖吖（武侯店）", "口味鲜面庄", "叶抄手", "雷四孃小吃", "朱记蛙三", "火舞凉山西昌原生烧烤",
                 "万州烤鱼", "肯德基", "巴山豆花饭成都", "卡萨马可", "老北京炸酱面", "禾木烤肉", "峨眉山周记烧烤", "青年火锅店",
                 "茵赫餐饮管理", "汉堡王", "热恋冰淇淋", "初壹饺子", "点都德", "跷脚牛肉", "外卖订单", "蔡锅盔", "潮汕牛肉", "印度菜菜",
                 "韩吉烤肉", "小川王饭店", "传统杂酱面", "烤肉", "蓉辉川菜", "菜鸟烧菜", "老马家资格烤羊排", "正禾鲜", "港仔老友记", "漫山洋芋",
                 "好功夫煲仔饭", "林妹妹饺子馆", "辣妈串串香", "醉鹃城市井火锅", "口口香饭店"],
        '粮油米面': [],
        '米': [],
        '面': ["谢孝元", "高筋鲜面"],
        '肉类': ["金忠食品", "邓哥鱼铺", "龙仕林", "成都泥厨子大食堂", "章相山", "ZXS", "黑龙滩生态鱼铺", "谢氏冷鲜店", "良波", "龙哥鲜肉铺", "顾老四乡村土鸡", "高金食品"],
        '香料': ["林叔干杂铺"],
        '饮料': ["书亦烧仙草", "星巴克", "书亦燒仙草", "Mii Coffee", "茶百道", "瑞幸咖啡", "GREYBOX COFFEE", "可口可乐", "红旗连锁订单-262538119309061",
               "红旗连锁订单-262903487208224",
               "日记咖啡馆", "丸摩堂", "怡宝纯净水", "长虹科技大厦二店", "君茂副食", "天然水", "不要对我尖叫", "0708玉泉街分店", "航空路中心店", "奈雪の茶",
               "红旗连锁订单-261927353606093", "红旗连锁订单-262478899806093", "红旗连锁订单-262459446909458"],
        '调料': ["花生碎"],
        '蔬菜': ["登梅", "雪梅", "思忠", "*琴", "兰兰姐", "*再泉", "春儿", "蔡德文", "沈德全", "小兰蔬菜店",
               "玲利", "邓花椒", "郑淑秀", "正宏", "蔬菜", "沈哥菜摊", "*青", "绿叶", "廖礼华"],
        '蛋类': [],
        '奶制品': [],
        '宵夜': [],
        '食用油': [],
        '外购凉菜': ["唐家臻记", "紫燕百味鸡", "敖锦记烫油鹅", "掌柜土鸡片", "乐山甜皮鸭"],
        '调味品': [],
        '速冻食品': [],
        '买菜': [],
        '饮料牛奶': []
    },
    '居家生活': {
        '清洁衣物': [],
        '水费': [],
        '电费': ["电费"],
        '燃气费': ["燃气费"],
        '物管费': ["重庆华宇", "物业管理费"],
        '维修费': [],
        '房屋清洁': [],
        '理发': ["丽发堂"]
    },
    '行车交通': {
        '加油': ["壳牌", "中石化", "中油", "加好油", "中国石油"],
        '停车': ["无感支付", "停车场", "瑞林", "中青旅山", "停车费"],
        '保养': [],
        '维修': [],
        '违章罚款': [],
        '保险': [],
        '公交': [],
        '地铁': ["成都地铁运营有限公司", "轨道交通", "成都地铁", "天府通", "公共交通"],
        '打车': ["滴滴快车", "高德地图打车"],
        '租车': [],
        '火车': ["火车票"],
        '飞机': [],
        '驾照': [],
        '自行车': ["哈啰"],
        '过路费': [],
        '洗车': ["德系名车专修"],
        '大巴': []
    },
    '交流通讯': {
        '手机费': ["中国移动", "中国电信"],
        '邮寄费': []
    },
    '休闲娱乐': {
        '电影': [],
        '宠物': ["鸡胸肉鲜", "猫", "伍德氏", "激光笔", "瑞爱康宠物医院", "猫砂", "宠物", "红旗连锁订单-261948554408349"],
        '其他娱乐': [],
        '花鸟虫鱼': []
    },
    '人情费用': {
        '请客': [],
        '孝敬父母': ["崔丽"],
        '红包': ["支付宝红包"],
        '其他人情': []
    },
    '公司出差': {
        '交通费': [],
        '住宿费': [],
        '餐饮费': [],
        '其他消费': []
    },
    '金融保险': {
        '汽车首付': [],
        '投资亏损': [],
        '车贷': [],
        '按揭还款': [],
        '车贷手续': [],
        '房贷': [],
        '人身保险': ["众安在线", "相互宝", "保险"],
        '医疗保险': []
    },
    '医疗教育': {
        '门诊药品': [],
        '住院费': [],
        '体检': []
    },
    '装修费用': {
        '装修材料': [],
        '家电家具': [],
        '装修装饰': [],
        '装修人工': [],
        '装修其他': []
    },
    '其他杂项': {
        '意外丢失': [],
        '烂账损失': [],
        '其他支出': ["爱心捐赠"]
    },
    '旅游消费': {
        '住宿': ["102702238409", "马耀龙"],
        '证件': [],
        '餐饮': ["伊香阁餐厅", "郑立峰", "依然風流", "曾凡政", "新俊商店", "*金梅", "马奴海", "*君平", "赫伊尔牛肉面", "顺姐", "照林", "朱之胜",
               "泉记濑粉皇", "惠福东路分店", "陶陶居", "莲香楼", "潘瑞枝", "蔡澜抱抱", "广州盒马", "瓒记美食", "饵果生活超市", "陈在喜", "罗意安", "军校精品"],
        '交通': ["广州地铁", "广州羊城通", "华住酒店订单5102201210517231523139006X05R9DH", "去哪儿网"],
        '购物': ["格尔木梦幻盐湖", "大柴旦晶晶综合超市", "武威服务区", "西广场店", "建军"],
        '旅游其他': []
    }
}


def contain_keyword(keywords: list, pay_detail: str) -> bool:
    for keyword in keywords:
        if keyword in pay_detail:
            return True
    return False


class TemplateExcel(object):

    def __init__(self):
        # 交易类型
        self.exchange_type = ""
        # 日期
        self.date = ""
        # 分类
        self.category = ""
        # 子分类
        self.sub_category = ""
        # 账户1
        self.account1 = ""
        # 账户2
        self.account2 = ""
        # 金额
        self.amount = ""
        # 成员
        self.member = ""
        # 商家
        self.seller = ""
        # 项目
        self.project = ""
        # 备注
        self.comment = ""

    def __str__(self):
        result = ""
        for key, value in self.__dict__.items():
            result = f"{result} {key} = [{value}]"
        return result


class AbsOps(metaclass=ABCMeta):

    def __init__(self):
        self._utils = Utils()

    @abstractmethod
    def read(self, file: str) -> Dict[str, List[TemplateExcel]]:
        pass

    def write(self, date_dict: Dict[str, List[TemplateExcel]], file: str = "template.xls"):
        app = xw.App(visible=True, add_book=False)
        wb = app.books.open(file)
        out_list = date_dict[outcome]
        try:
            in_list = date_dict[income]
        except KeyError:
            in_list = []
        in_sheet = wb.sheets[income]
        out_sheet = wb.sheets[outcome]
        in_sheet.range("A2").value = self.__convert_contents(in_list)
        out_sheet.range("A2").value = self.__convert_contents(out_list)
        wb.save(f"result_{self._utils.get_time_as_string()}.xls")
        wb.close()
        app.quit()

    @staticmethod
    def __convert_contents(templates: List[TemplateExcel]) -> List:
        contents = []
        if len(templates) > 0:
            for template in templates:
                contents.append((
                    template.exchange_type,
                    template.date,
                    template.category,
                    template.sub_category,
                    template.account1,
                    template.account2,
                    template.amount,
                    template.member,
                    template.seller,
                    template.project,
                    template.comment
                ))
        return contents


def read_file(file: str, encoding: str = "utf-8") -> list:
    with open(file, "r", encoding=encoding) as f:
        return f.readlines()

# -*- coding:utf-8 -*-
# --------------------------------------------------------
# Copyright (C), 2016-2021, lizhe, All rights reserved
# --------------------------------------------------------
# @Name:        my_money.py
# @Author:      lizhe
# @Created:     2021/9/14 - 22:12
# --------------------------------------------------------
import xlwings as xw
from abc import ABCMeta, abstractmethod
from typing import List, Dict

from automotive import Utils

outcome = "支出"
income = "收入"

categories = {
    '购物消费': {
        '衣裤鞋帽': ["领跑体育用品", "亚麻拖鞋", "优衣库"],
        '洗护用品': [],
        '厨房用品': ["佳帮手"],
        '家用纺织': [],
        '清洁用品': [],
        '家居日用': ["宜家家居", "厨房下水道", "佛山照明t5", "防滑垫", "外科口罩", "冰箱贴磁贴", "冰箱磁性贴", "香榭手机维修"],
        '家具家电': [],
        '汽车用品': [],
        '电子数码': ["小米之家", "罗马仕", "保护套", "腕带", "佳申驰通讯", "乾元宝融", "小米店", "小米科技"],
        '美妆护肤': [],
        '书报杂志': [],
        '眼镜': []},
    '食品酒水': {
        '早餐': ["禾央汤包", "全家购物", "安德鲁森", "泸州小笼包", "麦的多", "麦包点", "周小霞", "红旗连锁订单-262267876806093", "勇",
               "红旗连锁订单-262267874206093", "四川善禅农业科技有限公司"],
        '中餐': ["阿蠔海鲜焖面", "卢婆婆姜鸭面", "顺旺基", "荟福源", "宜宾燃面", "享米时", "老麻抄手", "西北面点王",
               "袁记云饺", "籣州牛肉面", "成都鸡汤抄手", "大巴山猪脚饭", "卤鹅饭", "e特黄焖鸡瓦香鸡成都店",
               "杨铭宇黄焖鸡米饭", "八二小区干海椒抄手", "晓武林烤鸭", "乡村基", "戊丰记卤肉饭", "沙县小吃成都银泰城店",
               "喜水饺", "兵哥豌豆面", "福记羊肉米粉", "岭南牛杂", "自小田", "搪瓷盌小面成都伏龙北巷", "蚝门圣焱", "本味简餐厅",
               "粤饺皇", "南城香冒烤鸭卤肉饭", "贰柒拾乐山干绍面", "拾小馆", "陕西面馆", "干辣椒抄手", "豆汤饭", "快餐店",
               "姜鸭面", "北方水饺", "匡胖子面馆", "余肥肠", "蜀人卤匠乌鸡米线", "张氏海味面", "担担面", "蒌兰兰州牛肉面"],
        '晚餐': ["庆元猪脚饭"],
        '零食': ["面包新语(银泰城店)", "雪糕批发", "一同零食", "商户_李黎明", "红旗连锁订单-261927364406093"],
        '水果': ["水果", "芭芭农场"],
        '超市购物': ["成都市北城天街店", "成都荆竹中路店", "麦德龙", "欧尚成都市高新店", "谊品生鲜", "高新店", "成都盒马",
                 "成都中营贸易", "招商雍华府店", "万家V+南区", "银犁冷藏", "金牛店", "恒旺超市", "支付宝签购单,永辉(成都市银泰城店)"],
        '烟酒茶': [],
        '外出美食': ["金翠河烧鹅餐厅", "马帮冒菜", "实惠啤酒鸭", "麦当劳", "食其家", "正反面", "青羊区东方宫牛肉拉面店", "成都港九餐饮",
                 "八二私房水饺", "鱼吖吖（武侯店）", "口味鲜面庄", "叶抄手", "雷四孃小吃", "朱记蛙三", "火舞凉山西昌原生烧烤",
                 "万州烤鱼", "肯德基", "巴山豆花饭成都", "卡萨马可", "老北京炸酱面", "禾木烤肉", "峨眉山周记烧烤", "青年火锅店",
                 "茵赫餐饮管理", "汉堡王", "热恋冰淇淋", "初壹饺子", "点都德", "跷脚牛肉", "外卖订单", "蔡锅盔", "潮汕牛肉", "印度菜菜",
                 "韩吉烤肉", "小川王饭店", "传统杂酱面", "烤肉", "蓉辉川菜", "菜鸟烧菜", "老马家资格烤羊排", "正禾鲜", "港仔老友记", "漫山洋芋",
                 "好功夫煲仔饭", "林妹妹饺子馆", "辣妈串串香", "醉鹃城市井火锅", "口口香饭店"],
        '粮油米面': [],
        '米': [],
        '面': ["谢孝元", "高筋鲜面"],
        '肉类': ["金忠食品", "邓哥鱼铺", "龙仕林", "成都泥厨子大食堂", "章相山", "ZXS", "黑龙滩生态鱼铺", "谢氏冷鲜店", "良波", "龙哥鲜肉铺", "顾老四乡村土鸡", "高金食品"],
        '香料': ["林叔干杂铺"],
        '饮料': ["书亦烧仙草", "星巴克", "书亦燒仙草", "Mii Coffee", "茶百道", "瑞幸咖啡", "GREYBOX COFFEE", "可口可乐", "红旗连锁订单-262538119309061",
               "红旗连锁订单-262903487208224",
               "日记咖啡馆", "丸摩堂", "怡宝纯净水", "长虹科技大厦二店", "君茂副食", "天然水", "不要对我尖叫", "0708玉泉街分店", "航空路中心店", "奈雪の茶",
               "红旗连锁订单-261927353606093", "红旗连锁订单-262478899806093", "红旗连锁订单-262459446909458"],
        '调料': ["花生碎"],
        '蔬菜': ["登梅", "雪梅", "思忠", "*琴", "兰兰姐", "*再泉", "春儿", "蔡德文", "沈德全", "小兰蔬菜店",
               "玲利", "邓花椒", "郑淑秀", "正宏", "蔬菜", "沈哥菜摊", "*青", "绿叶", "廖礼华"],
        '蛋类': [],
        '奶制品': [],
        '宵夜': [],
        '食用油': [],
        '外购凉菜': ["唐家臻记", "紫燕百味鸡", "敖锦记烫油鹅", "掌柜土鸡片", "乐山甜皮鸭"],
        '调味品': [],
        '速冻食品': [],
        '买菜': [],
        '饮料牛奶': []
    },
    '居家生活': {
        '清洁衣物': [],
        '水费': [],
        '电费': ["电费"],
        '燃气费': ["燃气费"],
        '物管费': ["重庆华宇", "物业管理费"],
        '维修费': [],
        '房屋清洁': [],
        '理发': ["丽发堂"]
    },
    '行车交通': {
        '加油': ["壳牌", "中石化", "中油", "加好油", "中国石油"],
        '停车': ["无感支付", "停车场", "瑞林", "中青旅山", "停车费"],
        '保养': [],
        '维修': [],
        '违章罚款': [],
        '保险': [],
        '公交': [],
        '地铁': ["成都地铁运营有限公司", "轨道交通", "成都地铁", "天府通", "公共交通"],
        '打车': ["滴滴快车", "高德地图打车"],
        '租车': [],
        '火车': ["火车票"],
        '飞机': [],
        '驾照': [],
        '自行车': ["哈啰"],
        '过路费': [],
        '洗车': ["德系名车专修"],
        '大巴': []
    },
    '交流通讯': {
        '手机费': ["中国移动", "中国电信"],
        '邮寄费': []
    },
    '休闲娱乐': {
        '电影': [],
        '宠物': ["鸡胸肉鲜", "猫", "伍德氏", "激光笔", "瑞爱康宠物医院", "猫砂", "宠物", "红旗连锁订单-261948554408349"],
        '其他娱乐': [],
        '花鸟虫鱼': []
    },
    '人情费用': {
        '请客': [],
        '孝敬父母': ["崔丽"],
        '红包': ["支付宝红包"],
        '其他人情': []
    },
    '公司出差': {
        '交通费': [],
        '住宿费': [],
        '餐饮费': [],
        '其他消费': []
    },
    '金融保险': {
        '汽车首付': [],
        '投资亏损': [],
        '车贷': [],
        '按揭还款': [],
        '车贷手续': [],
        '房贷': [],
        '人身保险': ["众安在线", "相互宝", "保险"],
        '医疗保险': []
    },
    '医疗教育': {
        '门诊药品': [],
        '住院费': [],
        '体检': []
    },
    '装修费用': {
        '装修材料': [],
        '家电家具': [],
        '装修装饰': [],
        '装修人工': [],
        '装修其他': []
    },
    '其他杂项': {
        '意外丢失': [],
        '烂账损失': [],
        '其他支出': ["爱心捐赠"]
    },
    '旅游消费': {
        '住宿': ["102702238409", "马耀龙"],
        '证件': [],
        '餐饮': ["伊香阁餐厅", "郑立峰", "依然風流", "曾凡政", "新俊商店", "*金梅", "马奴海", "*君平", "赫伊尔牛肉面", "顺姐", "照林", "朱之胜",
               "泉记濑粉皇", "惠福东路分店", "陶陶居", "莲香楼", "潘瑞枝", "蔡澜抱抱", "广州盒马", "瓒记美食", "饵果生活超市", "陈在喜", "罗意安", "军校精品"],
        '交通': ["广州地铁", "广州羊城通", "华住酒店订单5102201210517231523139006X05R9DH", "去哪儿网"],
        '购物': ["格尔木梦幻盐湖", "大柴旦晶晶综合超市", "武威服务区", "西广场店", "建军"],
        '旅游其他': []
    }
}


def contain_keyword(keywords: list, pay_detail: str) -> bool:
    for keyword in keywords:
        if keyword in pay_detail:
            return True
    return False


class TemplateExcel(object):

    def __init__(self):
        # 交易类型
        self.exchange_type = ""
        # 日期
        self.date = ""
        # 分类
        self.category = ""
        # 子分类
        self.sub_category = ""
        # 账户1
        self.account1 = ""
        # 账户2
        self.account2 = ""
        # 金额
        self.amount = ""
        # 成员
        self.member = ""
        # 商家
        self.seller = ""
        # 项目
        self.project = ""
        # 备注
        self.comment = ""

    def __str__(self):
        result = ""
        for key, value in self.__dict__.items():
            result = f"{result} {key} = [{value}]"
        return result


class AbsOps(metaclass=ABCMeta):

    def __init__(self):
        self._utils = Utils()

    @abstractmethod
    def read(self, file: str) -> Dict[str, List[TemplateExcel]]:
        pass

    def write(self, date_dict: Dict[str, List[TemplateExcel]], file: str = "template.xls"):
        app = xw.App(visible=True, add_book=False)
        wb = app.books.open(file)
        out_list = date_dict[outcome]
        try:
            in_list = date_dict[income]
        except KeyError:
            in_list = []
        in_sheet = wb.sheets[income]
        out_sheet = wb.sheets[outcome]
        in_sheet.range("A2").value = self.__convert_contents(in_list)
        out_sheet.range("A2").value = self.__convert_contents(out_list)
        wb.save(f"result_{self._utils.get_time_as_string()}.xls")
        wb.close()
        app.quit()

    @staticmethod
    def __convert_contents(templates: List[TemplateExcel]) -> List:
        contents = []
        if len(templates) > 0:
            for template in templates:
                contents.append((
                    template.exchange_type,
                    template.date,
                    template.category,
                    template.sub_category,
                    template.account1,
                    template.account2,
                    template.amount,
                    template.member,
                    template.seller,
                    template.project,
                    template.comment
                ))
        return contents


def read_file(file: str, encoding: str = "utf-8") -> list:
    with open(file, "r", encoding=encoding) as f:
        return f.readlines()

# -*- coding:utf-8 -*- # -------------------------------------------------------- # Copyright (C), 2016-2021, lizhe, All rights reserved # -------------------------------------------------------- # @Name:        my_money.py # @Author:      lizhe # @Created:     2021/9/14 - 22:12 # -------------------------------------------------------- # 交易类型 # 日期 # 分类 # 子分类 # 账户1 # 账户2 # 金额 # 成员 # 商家 # 项目 # 备注