<?php

namespace App\Http\Controllers\Admin;

use App\Http\Models\Agent;
use App\Http\Models\Invoice;
use App\Http\Models\LadingBill;
use App\Http\Models\User;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;

/**
 * 财务 之前提的需求 基本没啥用了
 * Class FinanceController
 * @package App\Http\Controllers\Admin
 */
class FinanceController extends Controller
{
    public function index(Request $request)
    {
        if (!$request->ajax()) {
            return view('admin/finance/index');
        }

        $inputs = $request->input();
        !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']];
        !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']];
        $filters[] = ['is_settle', '=', 0];

        $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(amount) as total_amount,GROUP_CONCAT(id) as ids')
            ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
        $items = $records->items();

        $userIds = array_column($items, 'user_id');
        $invoices = Agent::query()->whereIn('user_id', $userIds)
            ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray();

        $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray();


        array_walk($items, function ($item) use ($invoices, $userMaps) {
            $item->settle_amount = bcadd($item->total_amount, ($invoices[$item->user_id]['discount']??0), 2);
            $item->settle_amount = bcmul($item->total_amount, ($invoices[$item->user_id]['discount'] ?? 100) / 100, 2);
            $item->username = $userMaps[$item->user_id] ?? '';
            $item->ids = explode(',', ($item->ids??''));
        });

        return response()->json([
            'rows' => $items,
            'total' => $records->total()
        ]);
    }

    /**
     * 结算
     * @param Request $request
     * @return \Illuminate\Http\JsonResponse
     */
    public function settle(Request $request)
    {
        $ids = $request->input('ids');
        $records = LadingBill::query()->with('agent')->whereIn('id', $ids)->get();
        foreach ($records as $record) {
            if (!empty($record->agent)) {
                $settleAmount = bcmul($record->amount, ($record->agent->discount ?? 100) / 100, 2);
                $record->update([
                    'settle_amount' => $settleAmount,
                    'is_settle' => 1,
                    'settle_at' => date('Y-m-d H:i:s')
                ]);
            }

        }
        return response()->json(['message' => '操作成功']);
    }

    /**
     * 结算历史
     * @param Request $request
     * @return \Illuminate\Contracts\View\Factory|\Illuminate\Http\JsonResponse|\Illuminate\View\View
     */
    public function history(Request $request)
    {
        if (!$request->ajax()) {

            $settleTotal = LadingBill::query()->where(['is_settle' => 1])->sum('settle_amount');
            return view('admin/finance/history', [
                'settleTotal' => $settleTotal
            ]);
        }

        $inputs = $request->input();
        !empty($inputs['start_at']) && $filters[] = ['created_at', '>=', $inputs['start_at']];
        !empty($inputs['end_at']) && $filters[] = ['created_at', '<=', $inputs['end_at']];
        $filters[] = ['is_settle', '=', 1];

        $records = LadingBill::query()->where($filters)->selectRaw('user_id,sum(settle_amount) as settle_total_amount,GROUP_CONCAT(id) as ids')
            ->groupBy('user_id')->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
        $items = $records->items();

        $userIds = array_column($items, 'user_id');
        $invoices = Agent::query()->whereIn('user_id', $userIds)
            ->select(['user_id', 'discount', 'cash_deposit'])->get()->keyBy('user_id')->toArray();

        $userMaps = User::query()->whereIn('id', $userIds)->pluck('username', 'id')->toArray();

        array_walk($items, function ($item) use ($invoices, $userMaps) {
            $item->username = $userMaps[$item->user_id] ?? '';
            $item->ids = explode(',', $item->ids);
        });

        return response()->json([
            'rows' => $items,
            'total' => $records->total(),
            'settle_total' => time()
        ]);
    }

    public function detail(Request $request)
    {
        $isSettle = $request->input('isSettle');
        $ladingBillIds = $request->input('ladingBillIds') ?? [];
        if (!$request->ajax()) {
            return view('admin/finance/detail', [
                'ladingBillIds' => array_map(function ($item) {
                    return intval($item);
                }, $ladingBillIds)
            ]);
        }
        $records = LadingBill::query()->with(['agent', 'site'])->whereIn('id', $ladingBillIds)
            ->paginate($request->input('pageSize') ?? TABLE_PAGE_SIZE);
        $items = $records->items();

        array_walk($items, function ($item) use ($isSettle) {
            if (!$isSettle) {
                $item->settle_amount = bcmul($item->amount, ($item->agent->discount ?? 100) / 100, 2);
            }
            $item->relate_site = $item->site->cn_title ?? '';
        });

        return response()->json([
            'rows' => $items,
            'total' => $records->total()
        ]);
    }
}