<?php
/**
 * Created by PhpStorm.
 * User: edz
 * Date: 2019-06-10
 * Time: 17:53
 */

namespace App\Repositories;


use App\Models\Behavior;
use App\Models\CommentRecord;
use App\Models\GeneralLedgerRecord;
use App\Models\RegisteredAccountsRecord;
use App\Models\ReleaseRecord;
use Illuminate\Database\QueryException;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;

class BehaviorRecordRepositories
{
    public function __construct(RegisteredAccountsRecord $registeredAccountsRecord,
                                GeneralLedgerRecord $generalLedgerRecord,
                                ReleaseRecord $releaseRecord,
                                CommentRecord $commentAccountRecord,
                                Behavior $behavior)
    {
        $this->registeredAccountsRecord = $registeredAccountsRecord;
        $this->generalLedgerRecord = $generalLedgerRecord;
        $this->releaseRecord = $releaseRecord;
        $this->commentAccountRecord = $commentAccountRecord;
        $this->behavior = $behavior;
    }

    /**
     * 根据行为标识获取行为记录表
     * @param $behavior
     */
    private function getBehaviorTable($behavior)
    {
        $tables = [
            'register' => 'registered_accounts_record',
            'publish' => 'release_record',
            'read' => 'general_ledger_record',
            'like' => 'general_ledger_record',
            'unlike' => 'general_ledger_record',
            'forward' => 'general_ledger_record',
            'collect' => 'general_ledger_record',
            'comment' => 'comment_account_record'
        ];
        return isset($tables[$behavior]) ? $tables[$behavior] : false;
    }

    /**
     * 记录账本
     * @param $info
     * @return bool
     */
    public function addRecord($info)
    {
        Log::debug('记录账本-请求参数:' . json_encode($info));
        $behavior = $info['behavior_flag'];
        $behaviorTable = $this->getBehaviorTable($behavior);
        Log::debug('记录账本-table:' . $behaviorTable);
        if ($behaviorTable) {
            if ($behaviorTable == 'registered_accounts_record') {
                return $this->addRegisterRecord($info);
            } elseif ($behaviorTable == 'release_record') {
                return $this->addReleaseRecord($info);
            } elseif ($behaviorTable == 'general_ledger_record') {
                return $this->addGeneralRecord($info);
            } elseif ($behaviorTable == 'comment_account_record') {
                return $this->addCommentRecord($info);
            }
        }
        return false;
    }

    /**
     * 记录账本-用户注册
     * @param $register
     * @return bool
     */
    private function addRegisterRecord($register)
    {
        DB::beginTransaction();
        try {
            $data['virus_behavior_id'] = $register['virus_behavior_id'];
            $data['uid'] = $register['uid'];
            $data['trigger_time'] = $register['trigger_time'];
            $data['physical_exertion'] = $register['physical_exertion'];
            $data['trigger_type'] = $register['trigger_type'];
            $data['generation_type'] = $register['generation_type'];
            $data['absolute_progression'] = $register['absolute_progression'];
            $data['superior_uid'] = $register['superior_uid'];
            $data['release_status'] = $register['release_status'];
            $data['generation_quantity'] = $register['generation_quantity'];
            $data['quantity_issued'] = $register['quantity_issued'];
            $this->registeredAccountsRecord->create($data);
            //修改行为统计数据
            $behavior = Behavior::where('virus_behavior_id',$register['virus_behavior_id'])->first();
            $behavior->physical_strength += intval($register['physical_exertion']);
            $behavior->grant_rainbow_beans += intval($register['quantity_issued']);
            $behavior->trigger_times += 1;
            $behavior->absolute_progression += intval($register['absolute_progression']);
            if($register['trigger_type']){
                $behavior->effective_trigger += 1;
            }
            $behavior->effective_trigger += 1;
            $behavior->save();
            DB::commit();
            return true;
        } catch (QueryException $exception) {
            Log::debug('记录账本-注册-exception:'.$exception->getMessage());
            DB::rollBack();
            return false;
        }
    }

    /**
     * 记录账本-内容发布
     * @param $release
     * @return bool
     */
    private function addReleaseRecord($release)
    {
        DB::beginTransaction();
        try {
            $data['virus_behavior_id'] = $release['virus_behavior_id'];
            $data['uid'] = $release['uid'];
            $data['trigger_time'] = $release['trigger_time'];
            $data['related_content_id'] = $release['related_content_id'];
            $data['physical_exertion'] = $release['physical_exertion'];
            $data['trigger_type'] = $release['trigger_type'];
            $data['generation_type'] = $release['generation_type'];
            $data['release_status'] = $release['release_status'];
            $data['generation_quantity'] = $release['generation_quantity'];
            $data['quantity_issued'] = $release['quantity_issued'];
            $this->releaseRecord->create($data);
            $behavior = Behavior::where('virus_behavior_id',$release['virus_behavior_id'])->first();
            $behavior->physical_strength += intval($release['physical_exertion']);
            $behavior->grant_rainbow_beans += intval($release['quantity_issued']);
            $behavior->trigger_times += 1;
            if($release['trigger_type']){
                $behavior->effective_trigger += 1;
            }
            $behavior->effective_trigger += 1;
            $behavior->save();
            DB::commit();
            return true;
        } catch (QueryException $exception) {
            Log::debug('记录账本-发布-exception:'.$exception->getMessage());
            DB::rollBack();
            return false;
        }
    }

    /**
     * 记录账本-阅读,转发,点赞,收藏,不喜欢
     * @param $general
     * @return bool
     */
    private function addGeneralRecord($general)
    {
        try {
            $data['virus_behavior_id'] = $general['virus_behavior_id'];
            $data['uid'] = $general['uid'];
            $data['trigger_time'] = $general['trigger_time'];
            $data['related_content_id'] = $general['related_content_id'];
            $data['content_author_id'] = $general['content_author_id'];
            $data['physical_exertion'] = $general['physical_exertion'];
            $data['trigger_type'] = $general['trigger_type'];
            $data['generation_type'] = $general['generation_type'];
            $data['release_status'] = $general['release_status'];
            $data['generation_quantity'] = $general['generation_quantity'];
            $data['quantity_issued'] = $general['quantity_issued'];
            $data['behavior_value'] = $general['behavior_value'];
            $this->generalLedgerRecord->create($data);
            $behavior = Behavior::where('virus_behavior_id',$general['virus_behavior_id'])->first();
            $behavior->physical_strength += intval($general['physical_exertion']);
            $behavior->grant_rainbow_beans += intval($general['quantity_issued']);
            $behavior->trigger_times += 1;
            if($general['trigger_type']){
                $behavior->effective_trigger += 1;
            }
            $behavior->effective_trigger += 1;
            $behavior->save();
            DB::commit();
            return true;
        } catch (QueryException $exception) {
            Log::debug('记录账本-普通行为-exception:'.$exception->getMessage());
            DB::rollBack();
            return false;
        }
    }

    /**
     * 记录账本-评论
     * @param $comment
     * @return bool
     */
    private function addCommentRecord($comment)
    {
        try {
            $data['virus_behavior_id'] = $comment['virus_behavior_id'];
            $data['uid'] = $comment['uid'];
            $data['upper_trigger_time'] = $comment['upper_trigger_time'];
            $data['related_content_id'] = $comment['related_content_id'];
            $data['content_author_id'] = $comment['content_author_id'];
            $data['superior_commentator_id'] = $comment['superior_commentator_id'];
            $data['physical_exertion'] = $comment['physical_exertion'];
            $data['trigger_type'] = $comment['trigger_type'];
            $data['generation_type'] = $comment['generation_type'];
            $data['release_status'] = $comment['release_status'];
            $data['generation_quantity'] = $comment['generation_quantity'];
            $data['quantity_issued'] = $comment['quantity_issued'];
            $data['current_comment_id'] = $comment['current_comment_id'];
            $data['superior_comment_id'] = $comment['superior_comment_id'];
            $this->commentAccountRecord->create($data);
            $behavior = Behavior::where('virus_behavior_id',$comment['virus_behavior_id'])->first();
            $behavior->physical_strength += intval($comment['physical_exertion']);
            $behavior->grant_rainbow_beans += intval($comment['quantity_issued']);
            $behavior->trigger_times += 1;
            if($comment['trigger_type']){
                $behavior->effective_trigger += 1;
            }
            $behavior->effective_trigger += 1;
            $behavior->save();
            DB::commit();
            return true;
        } catch (QueryException $exception) {
            Log::debug('记录账本-评论-exception:'.$exception->getMessage());
            DB::rollBack();
            return false;
        }
    }
}