<?php

namespace app\app\controller;

use think\Controller;
use think\Db;
use app\bj\controller\Common;
use think\Log;
use \think\Validate;
use app\app\controller\Calculatebody;

class Card extends Base{
    
    protected $color = ['#FF5656','#FFAB00','#5AD06D','#6492F6','#3967D6'];
    protected $age_limit = 16;
    protected $unit_symbol = ['score'=>'分','height'=>'CM','weight'=>'公斤','fat_r'=>'%','fat_w'=>'kg','muscle'=>'%','muscleval'=>'kg','water'=>'kg','bone'=>'kg','protein'=>'%','proteinval'=>'kg','kcal'=>'kcal','sfr'=>'%',];
    protected $unit_name = ['score'=>'身体得分','height'=>'身高','weight'=>'体重','bmi'=>'BMI','fat_r'=>'脂肪率','fat_w'=>'脂肪量','muscle'=>'肌肉率','muscleval'=>'肌肉量','water'=>'水分','bone'=>'骨重','protein'=>'蛋白率','proteinval'=>'蛋白量','kcal'=>'基础代谢','visceral'=>'内脏指数','sfr'=>'皮下脂肪','body_level'=>'肥胖等级','body_type'=>'身体类型'];
    protected $bhw_list = [
        'bmi'=>[
            ['min_val'=>'0','max_val'=>'','text'=>'消瘦','color'=>'#ffda69'],
            ['min_val'=>'','max_val'=>'','text'=>'正常','color'=>'#5ad06d'],
            ['min_val'=>'','max_val'=>'','text'=>'偏重','color'=>'#ffab00'],
            ['min_val'=>'','max_val'=>'50','text'=>'肥胖','color'=>'#ff5656'],
        ],
        'height'=>[
            ['min_val'=>'0','max_val'=>'','text'=>'矮','color'=>'#ff5656'],
            ['min_val'=>'','max_val'=>'','text'=>'偏矮','color'=>'#ffab00'],
            ['min_val'=>'','max_val'=>'','text'=>'标准','color'=>'#5ad06d'],
            ['min_val'=>'','max_val'=>'','text'=>'偏高','color'=>'#6492f6'],
            ['min_val'=>'','max_val'=>'','text'=>'高','color'=>'#3967d6'],
        ],
        'weight'=>[
            ['min_val'=>'0','max_val'=>'','text'=>'低','color'=>'#ff5656'],
            ['min_val'=>'','max_val'=>'','text'=>'偏低','color'=>'#ffab00'],
            ['min_val'=>'','max_val'=>'','text'=>'标准','color'=>'#5ad06d'],
            ['min_val'=>'','max_val'=>'','text'=>'偏高','color'=>'#ffab00'],
            ['min_val'=>'','max_val'=>'','text'=>'高','color'=>'#ff5656'],
        ]
    ];
    protected $standard_color = [
        'fat_r'=>['偏低'=>'#FFAB00','标准'=>'#5AD06D','偏高'=>'#6492F6','高'=>'#3967D6'],
        'fat_w'=>['偏低'=>'#FFAB00','标准'=>'#5AD06D','偏高'=>'#6492F6','高'=>'#3967D6'],
        'muscle'=>['不足'=>'#FF5656','标准'=>'#5AD06D','优'=>'#3967D6'],
        'muscleval'=>['不足'=>'#FF5656','标准'=>'#5AD06D','优'=>'#3967D6'],
        'water'=>['不足'=>'#FF5656','标准'=>'#5AD06D','优'=>'#3967D6'],
        'proteinval'=>['不足'=>'#FF5656','标准'=>'#5AD06D','优'=>'#3967D6'],
        'bone'=>['不足'=>'#FF5656','标准'=>'#5AD06D','优'=>'#3967D6'],
        'protein'=>['不足'=>'#FF5656','标准'=>'#5AD06D','优'=>'#3967D6'],
        'kcal'=>['偏低'=>'#FF5656','优'=>'#3967D6'],
        'visceral'=>['标准'=>'#5AD06D','警惕'=>'#FFAB00','危险'=>'#FF5656'],
        'sfr'=>['不足'=>'#FF5656','标准'=>'#5AD06D','偏高'=>'#6492F6'],
    ];
    protected $result_end_data_mould = [
        'name'=>'',
        'value'=>'',
        'unit'=>'',
        'standard'=>'',
        'color'=>'',
        'list'=>[]
    ];

    ################################################################接口################################################################
    ################################################################接口################################################################
    ################################################################接口################################################################

    // 存储卡片顺序
    // $data = ['aud_id'=>'xxxxxxxxxxxxxxx','order_list'=>[1,2,3,4,5]]
    public function save_card_order(){
        $data = input();
        if(!array_key_exists('order_list', $data) || !array_key_exists('user_token', $data)){ 
            return $this->msg(10001,'数据格式错误');
        }
        if(!$this->isNumericArray($data['order_list'])){
            return $this->msg(10002,'数据内参数格式或值错误');
        }
        $data['order_list'] = json_encode($data['order_list']);
        $result = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->update(['card_order'=>$data['order_list']]);
        if($result){
            return $this->msg(0,'success');
        }else{
            return $this->msg(10003,'修改失败');
        }
    }

    // 获取卡片列表
    // $data = ['id'=>'2','time'=>'1991-04-20',content=>'15个']
    public function get_card_list(){
        $data = input();
        if(!array_key_exists('ann_id', $data) || !array_key_exists('time', $data) || !array_key_exists('content', $data)){
            return $this->msg(10001,'数据格式错误');
        }
        
        $result = Db::table('app_card_data_log')->insert(['aud_id'=>$data['id'],'log_time'=>$data['time'],'content'=>$data['content'],'create_time'=>date('Y-m-d H:i:s')]);
        if($result){
            return $this->msg(0,'success');
        }else{
            return $this->msg(10003,'添加失败');
        }
    }

    // 获取基础卡片信息
    // $data = ['id'=>'2']
    public function card_data_base(){
        $data = input();
        if(!array_key_exists('id', $data)){
            return $this->msg(10001,'数据格式错误');
        }
        $result = Db::table('app_card_body_data')->where(['aud_id'=>$data['id']])->order('record_time desc')->field('record_time,height,weight,bmi')->find();
        if(!$result){
            return $this->msg(10002,'未找到数据');
        }else{
            return $this->msg(0,'success',$result);
        }
    }

    // 详细卡片信息
    // $data = ['id'=>'2']
    public function card_data_detailed($data=['id'=>'7','acd_id'=>'2']){
    // public function body_data_detailed($data=['id'=>'9','acd_id'=>'2']){
        // $data = input();
        
        if(!array_key_exists('id', $data) || !array_key_exists('acd_id', $data)){
            return $this->msg(10001,'关键参数缺失');
        }
        if($data['acd_id'] == '2'){
            // 基础身体信息卡片
            
            return $this->get_user_body_data($data);
        }
        
    }

    // 手动记录
    // $data = ['id'=>'2','time'=>'1991-04-20 10:10:10','height'=>'15.1','weight'=>'75.1']
    public function card_manual_recording($data = ['acd_id'=>'2','aud_id'=>'11','time'=>'2024-04-11 10:10:10','data'=>['height'=>'175.1','weight'=>'77.1']]){
        if(!array_key_exists('acd_id', $data) || !array_key_exists('aud_id', $data)){
            return $this->msg(10001,'关键参数缺失');
        }
        
        $afferent_data = [];

        foreach ($data as $key => $value) {
            if(is_array($value)){
                foreach ($value as $k => $v) {
                    $afferent_data[$k] = $v;
                }
            }else{
                $afferent_data[$key] = $value;
            }
        }

        if($data['acd_id'] == '2'){
            return $this->set_user_body_data($data);
        }else if($data['acd_id'] == '6'){

        }
    }

    // 获取记录信息列表
    function get_card_record_data($data = ['acd_id'=>'2','aud_id'=>'11','s_time'=>'2024-04-01 10:10:10','e_time'=>'2024-04-12 10:10:10']){
        if(!array_key_exists('acd_id', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){
            return $this->msg(10001,'关键参数缺失');
        }

        if($data['acd_id'] == '2'){
            return $this->get_body_record_data($data);
        }else if($data['acd_id'] == '6'){

        }
    }

    // 数据对比
    function card_data_contrast($data = ['acd_id'=>'2','aud_id'=>'11','s_time'=>'2024-04-01 10:10:10','e_time'=>'2024-04-12 10:10:10']){
        if(!array_key_exists('acd_id', $data) || !array_key_exists('aud_id', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){
            return $this->msg(10001,'关键参数缺失');
        }

        if($data['acd_id'] == '2'){
            return $this->body_data_contrast($data);
        }else if($data['acd_id'] == '6'){

        }
    }
    ################################################################身体数据卡片接口################################################################
    ################################################################身体数据卡片接口################################################################

    

    // weight height muscle fat
    // 查询曲线数据
    public function body_curve_data($data=['aud_id'=>'11','acd_id'=>'2','type'=>'weight','s_time'=>'2024-04-01 10:10:10','e_time'=>'2024-04-11 10:10:10']){
        if(!array_key_exists('aud_id', $data) || !array_key_exists('acd_id', $data) || !array_key_exists('type', $data) || !array_key_exists('s_time', $data) || !array_key_exists('e_time', $data)){
            return $this->msg(10001,'关键参数缺失');
        }
        $user_data = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->field('target_weight,initial_weight,initial_date')->find();
        // dump($user_data);
        if($user_data){
            if($user_data['initial_date']){
                $result_data['target_weight'] = $user_data['target_weight'].'kg';
                $result_data['initial_weight'] = $user_data['initial_weight'].'kg';
                $result_data['initial_date'] = $this->daysSince($user_data['initial_date']).'天';
            }else{
                $result_data['target_weight'] = '';
                $result_data['initial_weight'] = '';
                $result_data['initial_date'] = '';
            }
        }else{
            return $this->msg(10002,'未找到用户数据');
        }
        $user_data_list = Db::query("select record_time,weight,bmi,muscleval,fat_w from app_card_body_data where aud_id='".$data['aud_id']."'and record_time between '".$data['s_time']."' and '".$data['e_time']."' order by record_time desc");
        
        if(in_array($data['type'], ['weight','muscleval','fat_w','bmi'])){
            $data_arr = [];
            foreach ($user_data_list as $key => $value) {
                $data_arr[] = [$value[$data['type']],$value['record_time']];
            }
        }
        // dump($result_data['target_weight']);
        // dump($result_data['initial_weight']);
        // die;
        $cumulative_weight = $user_data['target_weight']-$user_data['initial_weight'];
        
        if($cumulative_weight >= 0){
            $result_data['cumulative_weight'] = [$cumulative_weight.'kg','累计减重'];
        }else {
            $result_data['cumulative_weight'] = [abs($cumulative_weight).'kg','累计增重'];
        }
        // if($user_data){

        // }
        $result_data['list'] = $data_arr;
        return $this->msg(0,'success',$result_data);
    }

    // 获取身体数据记录信息列表
    function get_body_record_data($data){
        $result = Db::query("
        select 
        id,
        CONVERT(varchar(10), record_time, 120) AS r_t,
        CONVERT(varchar(19), record_time, 120) AS record_time,
        height,
        weight,
        bmi
        from app_card_body_data 
        where aud_id='".$data['aud_id']."'
        and record_time between '".$data['s_time']."' and '".$data['e_time']."' 
        order by record_time desc");
        $return_result = [];
        foreach ($result as $key => $value) {
            if(array_key_exists($value['r_t'], $return_result)){
                array_push($return_result[$value['r_t']], ['id'=>$value['id'],'height'=>$value['height'],'weight'=>$value['weight'],'bmi'=>$value['bmi']]);
            }else{
                $return_result[$value['r_t']] = [['id'=>$value['id'],'height'=>$value['height'],'weight'=>$value['weight'],'bmi'=>$value['bmi']]];
            }
        }
        dump(['original'=>$result,'optimization'=>$return_result]);
        die;
        return ['original'=>$result,'optimization'=>$return_result];
    }

    
    // 身体数据对比
    function body_data_contrast($data = ['acd_id'=>'2','data'=>[1,10]]){
        $between_num = implode(',',$data['data']);
        $calculate_arr = [];
        $result = Db::query("
        select 
        acbd.id,
        acbd.height,
        acbd.weight,
        acbd.bmi,
        acbd.fat_w,
        acbd.record_time,
        REPLACE(CONVERT(varchar(10), acbd.record_time, 23), '-', '/') AS b_time,
        aud.nickname,
        aud.gender,
        aud.birthday
        from app_card_body_data as acbd
        left join app_user_data as aud on acbd.aud_id=aud.id  
        where acbd.id in (".$between_num.")
        ");
        if(!$result || count($result)<2){
            return $this->msg(10001,'数据查询错误');
        }
        foreach ($data['data'] as $key => $value) {
            foreach ($result as $k => $v) {
                if($value == $v['id']){
                    array_push($calculate_arr, $v);
                }
            }
        }

        $return_data['nickname'] = $calculate_arr[0]['nickname'];
        if($calculate_arr[0]['gender']==1){
            $return_data['gender'] = '男';
        }else if ($calculate_arr[0]['gender']==2) {
            $return_data['gender'] = '女';
        }else{
            $return_data['gender'] = '保密';
        }
        // bcsub(,,20)
        $return_data['age'] = $this->calculate_age($calculate_arr[0]['birthday']);
        $return_data['time'] = $this->daysSince($calculate_arr[0]['record_time'],$calculate_arr[1]['record_time']);
        $return_data['weight_loss'] = bcsub($calculate_arr[1]['weight'],$calculate_arr[0]['weight'],1);
        $return_data['reduce_fat'] = bcsub(explode(',',$calculate_arr[1]['fat_w'])[0],explode(',',$calculate_arr[0]['fat_w'])[0],2);
        $return_data['between_time'] = $calculate_arr[0]['b_time'].'-'.$calculate_arr[1]['b_time'];
        $return_data['execl_data']['height'] = ['身高',bcsub($calculate_arr[1]['height'],$calculate_arr[0]['height'],1),$calculate_arr[0]['height'],$calculate_arr[1]['height']];
        $return_data['execl_data']['weight'] = ['体重',bcsub($calculate_arr[1]['weight'],$calculate_arr[0]['weight'],1),$calculate_arr[0]['weight'],$calculate_arr[1]['weight']];
        $return_data['execl_data']['bmi'] = ['BMI',bcsub($calculate_arr[1]['bmi'],$calculate_arr[0]['bmi'],1),$calculate_arr[0]['bmi'],$calculate_arr[1]['bmi']];
        // dump($return_data);
        // die;
        return $this->msg(0,'success',$return_data);
    }

    
    ################################################################身体数据卡片业务
    // 用户身体数据卡片记录
    function set_user_body_data($data){
        if(!array_key_exists('time', $data) || !array_key_exists('height', $data) || !array_key_exists('weight', $data)){
            return $this->msg(10001,'数据格式错误');
        }
        $user_data = Db::table('app_user_data')->where(['id'=>$data['aud_id']])->field('birthday,gender')->find();
        $result_data['height'] = $data['height'];
        $result_data['weight'] = $data['weight'];
        $result_data['age'] = $this->calculate_age($user_data['birthday']);
        $result_data['gender'] = $user_data['gender'];
        $result_data['adc'] = array_key_exists('impedance', $data)?$data['impedance']:550;
        $calculate_body_formula = new Calculatebody();
        $get_body_value = $calculate_body_formula->calculate_body_data_result($result_data);
        $set_user_data = Db::table('app_card_body_data')->insert([
            'acd_id'=>$data['acd_id'],
            'aud_id'=>$data['aud_id'],
            'record_time'=>$data['time'],
            'create_time'=>date('Y-m-d H:i:s'),
            'last_update_time'=>date('Y-m-d H:i:s'),
            'age'=>$get_body_value['age'],
            'height'=>$get_body_value['身高'],
            'weight'=>$get_body_value['体重'],
            'bmi'=>$get_body_value['BMI'],
            'score'=>$get_body_value['身体得分'],
            'fat_r'=> implode(',',$get_body_value['脂肪率']),
            'fat_w'=>implode(',',$get_body_value['脂肪量']),
            'muscle'=>implode(',',$get_body_value['肌肉率']),
            'muscleval'=>implode(',',$get_body_value['肌肉量']),
            'water'=>implode(',',$get_body_value['水分']),
            'proteinval'=>implode(',',$get_body_value['蛋白量']),
            'bone'=>implode(',',$get_body_value['骨重']),
            'protein'=>implode(',',$get_body_value['蛋白率']),
            'kcal'=>implode(',',$get_body_value['基础代谢']),
            'visceral'=>implode(',',$get_body_value['内脏指数']),
            'sfr'=>implode(',',$get_body_value['皮下脂肪']),
            'body_level'=>$get_body_value['肥胖等级'],
            'body_type'=>$get_body_value['身体类型']
        ]);
        if($set_user_data){
            // 返回简要数据
            if($data['type'] == 1){
                return $this->msg(0,'success',['acd_id'=>2,'height'=>$get_body_value['身高'].'CM','weight'=>$get_body_value['体重'].'公斤','bmi'=>$get_body_value['BMI']]);
            }
            
        }else{
            return $this->msg(10002,'数据存储失败');
        }
     }


     // 用户身体数据卡片获取
    function get_user_body_data($data){
        $result = Db::table('app_card_body_data')
        ->alias('acbd')
        ->join('app_user_data aud','acbd.aud_id = aud.id','LEFT')
        ->where(['acbd.id'=>$data['id']])
        ->field('acbd.*,aud.birthday,aud.gender')
        ->find();
        
        
        if(!$result){
            return $this->msg(10002,'未找到数据');
        }else{
            $result_end = $this->processing_return_data($result);
            // dump($result_end);
            // die;
            return $this->msg(0,'success',$result_end);
        }
    }


    // 返回数据处理
    function processing_return_data($data){
        $result_end_data = [];
        $month_num = $this->calculateAgeInMonthsWithPrecision($data['birthday'])*100;
        $gender_val = $data['gender'];
        foreach ($data as $key => $value) {
            if($key != 'aud_id' && $key != 'id' && $key != 'create_time' && $key != 'last_update_time' && $key != 'acd_id' && $key != 'ROW_NUMBER' && $key != 'record_time' && $key != 'gender' && $key != 'birthday'){
                // 如果大于16岁（成人）
                if($data['age'] >= $this->age_limit){
                    $result_end_data[$key] = $this->result_end_data_mould;
                    if(array_key_exists($key, $this->unit_name)){
                        $result_end_data[$key]['name'] = $this->unit_name[$key];
                    }
                    if(array_key_exists($key, $this->unit_symbol)){
                        $result_end_data[$key]['unit'] = $this->unit_symbol[$key];
                    }
                    $result_end_data[$key]['value'] = explode(',',$value)[0];
                    if(strpos($value, ',')){
                        $result_end_data[$key]['standard'] = explode(',',$value)[1];
                    }
                    if(array_key_exists($key, $this->standard_color)){
                        $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']];
                    }
                }else{
                    if(array_key_exists($key, $this->bhw_list)){
                        $result_end_data[$key] = $this->result_end_data_mould;
                        $result_end_data[$key]['list'] = $this->bhw_list[$key];
                        if(array_key_exists($key, $this->unit_name)){
                            $result_end_data[$key]['name'] = $this->unit_name[$key];
                        }
                        if(array_key_exists($key, $this->unit_symbol)){
                            $result_end_data[$key]['unit'] = $this->unit_symbol[$key];
                        }
                        $result_end_data[$key]['value'] = explode(',',$value)[0];
                        if(strpos($value, ',')){
                            $result_end_data[$key]['standard'] = explode(',',$value)[1];
                        }
                        if(array_key_exists($key, $this->standard_color)){
                            $result_end_data[$key]['color'] = $this->standard_color[$key][$result_end_data[$key]['standard']];
                        }
                        if($key == 'bmi'){
                            // dump($month_num);
                            $bhw_date = Db::table('pc_bmistand2')->where("month >= $month_num and sex = '$gender_val'")->order('month')->limit(1)->select();
                            if($bhw_date){
                                $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f1sd'];
                                $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f1sd'];
                                $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['z1sd'];
                                $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['z1sd'];
                                $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z2sd'];
                                $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z2sd'];
                            }
                        }else if($key == 'height'){
                            $bhw_date = Db::table('pc_heightstand2')->where("month >= $month_num")->order('month')->limit(1)->select();
                            if($bhw_date){
                                $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f2sd'];
                                $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f2sd'];
                                $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['f1sd'];
                                $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['f1sd'];
                                $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z1sd'];
                                $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z1sd'];
                                $result_end_data[$key]['list'][3]['max_val'] = $bhw_date[0]['z2sd'];
                                $result_end_data[$key]['list'][4]['min_val'] = $bhw_date[0]['z2sd'];
                                $result_end_data[$key]['list'][4]['max_val'] = $bhw_date[0]['z3sd'];
                            }
                        }else if($key == 'weight'){
                            $bhw_date = Db::table('pc_weightstand2')->where("month >= $month_num")->order('month')->limit(1)->select();
                            // dump($value);
                            // dump($bhw_date);/
                            if($bhw_date){
                                $result_end_data[$key]['list'][0]['max_val'] = $bhw_date[0]['f2sd'];
                                $result_end_data[$key]['list'][1]['min_val'] = $bhw_date[0]['f2sd'];
                                $result_end_data[$key]['list'][1]['max_val'] = $bhw_date[0]['f1sd'];
                                $result_end_data[$key]['list'][2]['min_val'] = $bhw_date[0]['f1sd'];
                                $result_end_data[$key]['list'][2]['max_val'] = $bhw_date[0]['z1sd'];
                                $result_end_data[$key]['list'][3]['min_val'] = $bhw_date[0]['z1sd'];
                                $result_end_data[$key]['list'][3]['max_val'] = $bhw_date[0]['z2sd'];
                                $result_end_data[$key]['list'][4]['min_val'] = $bhw_date[0]['z2sd'];
                                $result_end_data[$key]['list'][4]['max_val'] = $bhw_date[0]['z3sd'];
                            }
                        }
                    }
                }
            }
        }
        return $result_end_data;
    }

    ################################################################跳绳数据卡片接口################################################################
    ################################################################跳绳数据卡片接口################################################################


    ################################################################other################################################################
    ################################################################other################################################################
    ################################################################other################################################################

    



}