<?php
namespace Base\Service;

use Base\Facade\Request;

class PaymentRuleService
{
    /**
     * @var 永久默认时间(为方便查询,设为 2100-01-01 00:00:00 )
     */
    const FOREVER_TIME = 4102444800;

    public function getRulesByIds(array $ids = null, $fields = '*')
    {
        $map = [];
        if (is_null($ids)) {
            $map['_string'] = '1=1';
        } elseif (count($ids) == 0) {
            return [];
        } else {
            $map['id'] = ['in', $ids];
        }
        $rules = M('payment_rule', 'tab_')->field($fields)->where($map)->select();
        return index_by_column('id', $rules);
    }

    public function getEffectiveTimeDisplay($rule)
    {
        $startTime = $rule['start_time'] == 0 ? null : date('Y-m-d', $rule['start_time']);
        $endTime = $rule['end_time'] == self::FOREVER_TIME ? null : date('Y-m-d', $rule['end_time']);
        if ($startTime == null &&  $endTime == null) {
            return '永久';
        }
        if ($startTime != null &&  $endTime != null) {
            return $startTime . ' 至 ' . $endTime;
        }
        if ($startTime == null &&  $endTime != null) {
            return '从前 至 ' . $endTime;
        }
        if ($startTime != null &&  $endTime == null) {
            return $startTime . ' 至 永久';
        }
    }

    public function getTimeRepeatCondition($startTime, $endTime)
    {
        return ' ((start_time >= ' . $startTime . ' AND start_time <= ' . $endTime . ') OR (start_time <= ' . $startTime . ' AND end_time >= ' . $endTime 
        . ') OR (end_time >= ' . $startTime . ' AND end_time <= ' . $endTime . '))';
    }

    public function getTimeRepeatRules($record)
    {
        $conditions = [
            'company_belong' => $record['company_belong'],
            'company_id' => $record['company_id'] ?? 0,
            'game_time_id' => $record['game_time_id'],
            'game_id' => $record['game_id'] ?? 0,
        ];
        $startTime = $record['start_time'] == '' ? 0 : strtotime($record['start_time'] . ' 00:00:00');
        $endTime = $record['end_time'] == '' ? PaymentRuleService::FOREVER_TIME : strtotime($record['end_time'] . ' 23:59:59');
        $conditions['_string'] = $this->getTimeRepeatCondition($startTime, $endTime);
        return M('payment_rule', 'tab_')->where($conditions)->order('start_time asc')->select();
    }

    public function resetTimeRules($repeatRules, $startTime, $endTime)
    {
        $length = count($repeatRules);
        if ($length == 0) {
            return;
        }
        if ($length == 1) {
            $first = $repeatRules[0];
            if ($startTime <= $first['start_time'] && $endTime >= $first['end_time']) {
                M('payment_rule', 'tab_')->where(['id' => $first['id']])->delete();
            } elseif ($endTime < $first['end_time'] && $startTime <= $first['start_time']) {
                M('payment_rule', 'tab_')->where(['id' => $first['id']])->save(['start_time' => $endTime + 1, 'update_time' => time()]);
            } elseif ($endTime >= $first['end_time'] && $startTime > $first['start_time']) {
                M('payment_rule', 'tab_')->where(['id' => $first['id']])->save(['end_time' => $startTime - 1, 'update_time' => time()]);
            } else {
                $newRule = $first;
                M('payment_rule', 'tab_')->where(['id' => $first['id']])->save(['end_time' => $startTime - 1, 'update_time' => time()]);
                unset($newRule['id']);
                unset($newRule['create_time']);
                $newRule['start_time'] = $endTime + 1;
                $newRule['update_time'] = time();
                M('payment_rule', 'tab_')->add($newRule);
            }
        } else {
            $first = $repeatRules[0];
            $last = $repeatRules[$length - 1];
            $exceptIds = [];
            if ($startTime <= $first['start_time'] && $endTime >= $last['end_time']) {

            } elseif ($startTime <= $first['start_time'] && $endTime < $last['end_time']) {
                M('payment_rule', 'tab_')->where(['id' => $last['id']])->save(['start_time' => $endTime + 1, 'update_time' => time()]);
                $exceptIds = [$last['id']];
            } elseif ($startTime > $first['start_time'] && $endTime >= $last['end_time']) {
                M('payment_rule', 'tab_')->where(['id' => $first['id']])->save(['end_time' => $startTime - 1, 'update_time' => time()]);
                $exceptIds = [$first['id']];
            } else {
                M('payment_rule', 'tab_')->where(['id' => $first['id']])->save(['end_time' => $startTime - 1, 'update_time' => time()]);
                M('payment_rule', 'tab_')->where(['id' => $last['id']])->save(['start_time' => $endTime + 1, 'update_time' => time()]);
                $exceptIds = [$first['id'], $last['id']];
            }
            foreach ($repeatRules as $rule) {
                if (!in_array($rule['id'], $exceptIds)) {
                    M('payment_rule', 'tab_')->where(['id' => $rule['id']])->delete();
                }
            }
        }
    }

    public function filterRecords($records)
    {
        foreach ($records as $key => $record) {
            $records[$key]['company_belong'] = $record['company_id'] > 0 ? -1 : $record['company_belong'];
            $records[$key]['game_type_id'] = $record['game_id'] > 0 ? 0 :$record['game_type_id'];
        }
        return $records;
    }
}