# -*- coding: utf-8 -*-
"""
@Author ： peng
@Time ： 2023-8-18 10:45:46
@File ：WeatherControl.py
"""
import datetime

from Ansjer.config import CONFIG_INFO, CONFIG_CN
from django.views import View
from Object.IPWeatherObject import WeatherInfo, OpenWeatherMap
from Model.models import UidSetModel, IPAddr
from Object.ResponseObject import ResponseObject
from Object.RedisObject import RedisObject
from Service.CommonService import CommonService


class WeatherView(View):
    def get(self, request, *args, **kwargs):
        request.encoding = 'utf-8'
        operation = kwargs.get('operation')
        return self.validation(request.GET, operation)

    def post(self, request, *args, **kwargs):
        request.encoding = 'utf-8'
        operation = kwargs.get('operation')
        return self.validation(request.POST, operation)

    def validation(self, request_dict, operation):
        lang = request_dict.get('lang', 'en')
        response = ResponseObject(lang)
        if operation == 'get':  # 获取天气
            return self.get_weather(request_dict, response)
        else:
            return response.json(414)

    @staticmethod
    def get_weather(request_dict, response):
        """
        获取天气
        @param request_dict: 请求参数
        @request_dict uid: 设备uid
        @param response: 响应对象
        @return: response
        """
        uid = request_dict.get('uid')
        if not uid:
            return response.json(444, 'uid')

        uid_set_qs = UidSetModel.objects.filter(uid=uid).values('tb_city_information_id', 'ip')
        if not uid_set_qs.exists():
            return response.json(173)

        try:
            # 根据服务器配置使用不同的服务, 国内:阿里云墨迹天气, 测试,国外:OpenWeatherMap
            if CONFIG_INFO == CONFIG_CN:
                city_id = uid_set_qs[0]['tb_city_information_id']
                if city_id == 0:
                    return response.json(10, '请更新设备影子地区信息')

                today = datetime.datetime.today()
                now_time = datetime.datetime(today.year, today.month, today.day, today.hour)
                time_stamp = CommonService.str_to_timestamp(now_time.strftime('%Y-%m-%d %H:%M:%S'))
                key = 'city_id_{}_{}_weather'.format(city_id, time_stamp)

                redis_obj = RedisObject()
                weather = redis_obj.get_data(key)
                if weather:
                    temp, humidity = weather.split('/')
                else:
                    city_obj = WeatherInfo(city_id)
                    temp, humidity = city_obj.get_city_weather()
                    if temp and humidity:
                        redis_obj.set_ex_data(key, '{}/{}'.format(temp, humidity), 3600)
            else:
                ip = uid_set_qs[0]['ip']
                ip_addr_qs = IPAddr.objects.filter(ip=ip, is_geoip2=True).values('lat', 'lon')
                if not ip_addr_qs.exists():
                    return response.json(173)
                lat, lon = ip_addr_qs[0]['lat'], ip_addr_qs[0]['lon']
                open_weather_map = OpenWeatherMap(lat, lon)
                temp, humidity = open_weather_map.get_weather()

            if temp is None and humidity is None:
                return response.json(10, '获取天气失败')
            return response.json(0, {'temp': temp, 'humidity': humidity})
        except Exception as e:
            print(e)
            return response.json(500)
