class UserManager(QObject):

    connected = pyqtSignal(str)
    openidGot = pyqtSignal(str)
    error     = pyqtSignal(str)
    info      = pyqtSignal(str)
    onUser    = pyqtSignal(User)
    progress  = pyqtSignal(int, int)

    def __init__(self):
        QObject.__init__(self)
        self.reset()
        self.statistic = Statistic(self.users)

    def reset(self):
        self.users = {}

    def connect(self, appid, secret):
        url = 'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s' %(appid, secret)
        try:
            r = requests.get(url)
            if r.status_code == 200:
                content = json.loads(r.content)
                if content.has_key('access_token'):
                    self.access_token = content['access_token']
                    self.connected.emit('Connected to server successfully')
                elif content.has_key('errmsg'):
                    errmsg = content['errmsg']
                else:
                    self.error.emit('Unknown error in connection')

            else:
                errmsg = 'Connection error with code %i' %(r.status_code)
                self.error.emit(errmsg)
        except:
            self.error.emit('Unhandling error in connection')
 
    def get_openids(self):
        url = 'https://api.weixin.qq.com/cgi-bin/user/get?access_token=%s&next_openid=' %(self.access_token)
        try:
            r = requests.get(url)
            if r.status_code == 200:
                content = json.loads(r.content)
                if content.has_key('data'):
                    self.openids = content['data']['openid']
                    self.openidGot.emit('Pull openids successfully')
                    
            else:
                errmsg = 'Connection error with code %i' %(r.status_code)
                self.error.emit(errmsg)
                
        except:
            self.error.emit('Unhandling error in show users')


    def get_user(self, openid):
        
        if openid not in self.users:
            self.load_user(openid)

        self.onUser.emit(self.users[openid])


    def dump_all_users(self):

        self.info.emit('Dumping all users information')
        t = threading.Thread(target = self.dump_execute)
        t.start()


    def dump_execute(self):
        for openid in self.openids:
            if openid not in self.users:
                t = threading.Thread(target = self.load_user, args = (openid,))
                t.start()


    def load_user(self, openid):
        url = 'https://api.weixin.qq.com/cgi-bin/user/info?access_token=%s&openid=%s' %(self.access_token, openid)
        msg = 'loading user %s' %(openid)
        self.info.emit(msg)
        try:
            r = requests.get(url)
            if r.status_code == 200:
                jobj = json.loads(r.content)
                if jobj.has_key('openid'):
                    self.users[openid] = User(jobj)
                    self.progress.emit(len(self.users), len(self.openids))
                else:
                    errmsg = 'User information error'
                    self.error.emit(errmsg)
            else:
                errmsg = 'Connection error with code %i' %(r.status_code)
                self.error.emit(errmsg)
        except:
            self.error.emit('Unhandling error in load user info')


    def do_statistic(self):
        self.statistic.doStatistic()

    def show_stat_sex(self):
        self.statistic.showPieChart('sex')

    def show_stat_language(self):
        self.statistic.showPieChart('language')

    def show_stat_city(self):
        self.statistic.showPieChart('city')

    def show_stat_province(self):
        self.statistic.showPieChart('province')

    def show_stat_country(self):
        self.statistic.showPieChart('country')