<?php
namespace Base\Service;

use Base\Model\PromoteModel;
use Base\Model\UserPlayInfoModel;
use Base\Model\UserPlayModel;
use Base\Model\UserModel;
use Think\Model;

class PresidentDepositService
{
	const PAY_TYPE_CASH = 1;
	const PAY_TYPE_DIVIDE = 2;
	const PAY_TYPE_NONE = 3;

	public static $payWays = [
		1 => '银行转账',
		2 => '支付宝转账',
		3 => '微信转账',
		4 => '分成款扣除',
	];

	public static $payTypes = [
		self::PAY_TYPE_CASH => '线下转账',
		self::PAY_TYPE_DIVIDE => '分成款扣除',
		self::PAY_TYPE_NONE => '无需押金',
	];

	public static $statusList = [
		0 => '财务待确认',
		1 => '已收到',
		2 => '已退款',
	];
	
	public function checkBeforeSave($params, $record = null)
	{
		if ($params['pay_type'] == 0) {
			throw new \Exception('请选择押金付款方式');
		} elseif ($params['pay_type'] == 3) {
			return;
		}
		
        if ($params['pay_type'] != 2 && $params['pay_way'] == 0) {
			throw new \Exception('请选择押金支付方式');
		}
		
		if ($record && $params['amount'] === '') {
			throw new \Exception('请输入押金金额');
		}

		if ($params['amount'] !== '') {
			if (!is_numeric($params['amount'])) {
				throw new \Exception('请输入正确押金金额');
			}
			if ($params['amount'] <= 0) {
				throw new \Exception('押金金额必须大于0');
        	}
			
			if ($params['amount'] > 100000000) {
				throw new \Exception('押金金额过高');
			}
		}
	}

	public function save($params, $company = null)
	{
		if (empty($params)) {
			throw new \Exception('参数不能为空');
		}
		$companyId = $params['company_id'] ?? 0;
		$payWay = $params['pay_way'] ?? 0;
        $payType = $params['pay_type'] ?? 0;
        $payAccount = $params['pay_account'] ?? '';
        $amount = $params['amount'] ?? '';
        $payer = $params['payer'] ?? '';
        $payAcceptTime = $params['pay_accept_time'] ?? '';
		$refundTime = $params['refund_time'] ?? '';
		
		$payAcceptTime = $payAcceptTime ? strtotime($payAcceptTime) : 0;
		$refundTime = $refundTime ? strtotime($refundTime) : 0;

		if (is_null($company)) {
			$company = M('promote_company', 'tab_')->where(['id' => $companyId, 'company_belong' => ['in', [1, 2]]])->find();
			if (is_null($company)) {
				throw new \Exception('推广公司不存在');
			}
		}
		
        $record = M('president_deposit', 'tab_')->where(['company_id' => $company['id']])->find();
		$this->checkBeforeSave($params, $record);

		if ($params['pay_type'] == 3) {
            return $this->handleNoDeposit($company, $record);
		}
		
		if ($record) {
			$this->update($params, $company, $record);
			addOperationLog(['op_type'=>1,'key'=>$company['company_name'].'/'.$params['amount'],'op_name'=>'编辑会长押金','url'=>U('PresidentDeposit/edit',['id'=>$company['id']]),'menu'=>'推广员-结算单管理-会长押金管理-编辑会长押金']);
		} else {
			$this->add($params, $company);
			addOperationLog(['op_type'=>0,'key'=>$company['company_name'].'/'.$params['amount'],'op_name'=>'新增会长押金','url'=>U('PresidentDeposit/edit',['id'=>$company['id']]),'menu'=>'推广员-结算单管理-奖罚记录管理-新增会长押金']);
		}
	}

	private function add($params, $company)
	{
		$data = [];
		$data['pay_way'] = $params['pay_type'] == 2 ? 4 : $params['pay_way'];
		$data['pay_type'] = $params['pay_type'];
		$data['company_id'] = $company['id'];
		$data['pay_account'] = $params['pay_account'];
		$data['amount'] = floatval($params['amount']);
		$data['payer'] = $params['payer'];
		$data['create_time'] = time();
		$data['update_time'] = time();
		M('president_deposit', 'tab_')->add($data);
	}

	private function update($params, $company, $record)
	{	
		$payType = $params['pay_type'] ?? 0;
		$payAcceptTime = $params['pay_accept_time'] == '' ? 0 : strtotime($params['pay_accept_time']);
		$refundTime = $params['refund_time'] == '' ? 0 : strtotime($params['pay_accept_time']);

        $data = [];

		$status = null;
        if ($payType != $record['pay_type']) {
            $status = 0;
            $data['refund_time'] = $data['pay_accept_time'] = $data['pay_confirm_time'] = 0;
        } else {
            $data['pay_accept_time'] = $payAcceptTime;
            $data['refund_time'] = $refundTime;
        }


		$data['pay_way'] = $params['pay_type'] == 2 ? 4 : $params['pay_way'];
        $data['pay_type'] = $params['pay_type'];
        $data['pay_account'] = $params['pay_account'];
		$data['amount'] = floatval($params['amount']);
		$data['payer'] = $params['payer'];
        $data['status'] = $status ?? $record['status'];
        $data['update_time'] = time();
        M('president_deposit', 'tab_')->where(['id' => $record['id']])->save($data);
	}

	public function handleNoDeposit($company, $record = null)
    {   
        $data = [];
        $data['pay_way'] = 0;
        $data['pay_type'] = self::PAY_TYPE_NONE;
        $data['pay_account'] = '';
        $data['amount'] = 0;
        $data['payer'] = '';
        $data['status'] = 1;
        $data['pay_confirm_time'] = time();
        $data['create_time'] = time();
        $data['update_time'] = time();
        $data['status'] = 1;
        $data['pay_accept_time'] = $data['refund_time'] = 0;
        
        if (!$record) {
			$data['company_id'] = $company['id'];
            M('president_deposit', 'tab_')->add($data);
        } else {
            M('president_deposit', 'tab_')->where(['company_id' => $company['id']])->save($data);
		}
		addOperationLog(['op_type'=>1,'key'=>$company['company_name'],'op_name'=>'编辑无需押金','url'=>U('PresidentDeposit/records'),'menu'=>'推广员-结算单管理-会长押金管理-无需押金']);
	}
	
	public function batchRefund(array $companyIds)
    {
        if (isMarketAdmin()) {
			throw new \Exception('无法操作记录');
		}
		
        $companyIds = I('ids', []);
        if (count($companyIds) == 0) {
			throw new \Exception('无选中项');
        }

        $checkStatus = true;
        $records = M('president_deposit', 'tab_')->where(['company_id' => ['in', $companyIds]])->select();
        foreach ($records as $record) {
            if ($record['status'] != 1) {
                $checkStatus = false;
                break;
            }
        }
        if (!$checkStatus) {
			throw new \Exception('含有非已到账状态记录,不可批量操作');
		}
		
		M('president_deposit', 'tab_')->where(['company_id' => ['in', $companyIds]])->save([
            'status' => 2,
            'refund_time' => time(),
            'update_time' => time(),
            'pay_accept_time' => 0
		]);

		$companies = M('promote_company', 'tab_')->field(['company_name', 'id'])->where(['id' => ['in', $companyIds]])->select();
		$companies = index_by_column('id', $companies);
        foreach ($records as $record) {
			$company = $companies[$record['company_id']] ?? null;
            if ($record['amount']) {
                addOperationLog(['op_type'=>1,'key'=>$company['company_name'].'/'.$record['amount'],'op_name'=>'编辑押金已退款','url'=>U('PresidentDeposit/records'),'menu'=>'推广员-结算单管理-会长押金管理-押金已退款']);
            }
        }
	}
	
	public function batchPayConfirm(array $companyIds, $acceptTime)
    {
        if (isMarketAdmin()) {
			throw new \Exception('无法操作记录');
        }
        if (count($companyIds) == 0) {
			throw new \Exception('无选中项');
        }
        $checkStatus = true;
        $records = M('president_deposit', 'tab_')->where(['company_id' => ['in', $companyIds]])->select();
        foreach ($records as $record) {
            if ($record['status'] != 0) {
                $checkStatus = false;
                break;
            }
        }
        if (!$checkStatus) {
			throw new \Exception('含有非待确认状态记录,不可批量操作');
		}
		
        M('president_deposit', 'tab_')->where(['company_id' => ['in', $companyIds]])->save([
            'status' => 1,
            'pay_confirm_time' => time(),
            'update_time' => time(),
            'pay_accept_time' => strtotime($acceptTime)
		]);
		
        $companies = M('promote_company', 'tab_')->field(['company_name', 'id'])->where(['id' => ['in', $companyIds]])->select();
		$companies = index_by_column('id', $companies);
        foreach ($records as $record) {
			$company = $companies[$record['company_id']] ?? null;
            if ($record['amount']) {
                addOperationLog(['op_type'=>1,'key'=>$company['company_name'].'/'.$record['amount'],'op_name'=>'编辑确认押金到账','url'=>U('PresidentDeposit/records'),'menu'=>'推广员-结算单管理-会长押金管理-确认押金到账']);
            }
        }
    }
}