<?php

namespace App\Controllers\Admin;

use App\Controllers\BaseController;
use App\Models\BagSaleModel;
use App\Models\BagInventoryModel;
use App\Models\DesignatedShopModel;
use App\Models\CodeKindModel;
use App\Models\CodeDetailModel;
use App\Models\BagPriceModel;

class BagSale extends BaseController
{
    private BagSaleModel $saleModel;

    public function __construct()
    {
        $this->saleModel = model(BagSaleModel::class);
    }

    public function index()
    {
        helper('admin');
        $lgIdx = admin_effective_lg_idx();
        if (!$lgIdx) return redirect()->to(site_url('admin'))->with('error', '지자체를 선택해 주세요.');

        $builder = $this->saleModel->where('bs_lg_idx', $lgIdx);
        $startDate = $this->request->getGet('start_date');
        $endDate   = $this->request->getGet('end_date');
        $type      = $this->request->getGet('type');
        if ($startDate) $builder->where('bs_sale_date >=', $startDate);
        if ($endDate)   $builder->where('bs_sale_date <=', $endDate);
        if ($type)      $builder->where('bs_type', $type);

        $list = $builder->orderBy('bs_sale_date', 'DESC')->orderBy('bs_idx', 'DESC')->findAll();

        return view('admin/layout', [
            'title'   => '판매/반품 관리',
            'content' => view('admin/bag_sale/index', compact('list', 'startDate', 'endDate', 'type')),
        ]);
    }

    public function create()
    {
        helper('admin');
        $lgIdx = admin_effective_lg_idx();
        if (!$lgIdx) return redirect()->to(site_url('admin/bag-sales'))->with('error', '지자체를 선택해 주세요.');

        $shops = model(DesignatedShopModel::class)->where('ds_lg_idx', $lgIdx)->where('ds_state', 1)->findAll();
        $kind = model(CodeKindModel::class)->where('ck_code', 'O')->first();
        $bagCodes = $kind ? model(CodeDetailModel::class)->getByKind((int) $kind->ck_idx, true) : [];

        return view('admin/layout', [
            'title'   => '판매 등록',
            'content' => view('admin/bag_sale/create', compact('shops', 'bagCodes')),
        ]);
    }

    public function store()
    {
        helper('admin');
        $lgIdx = admin_effective_lg_idx();

        $rules = [
            'bs_ds_idx'    => 'required|is_natural_no_zero',
            'bs_bag_code'  => 'required|max_length[50]',
            'bs_qty'       => 'required|is_natural_no_zero',
            'bs_sale_date' => 'required|valid_date[Y-m-d]',
            'bs_type'      => 'required|in_list[sale,return]',
        ];
        if (! $this->validate($rules)) {
            return redirect()->back()->withInput()->with('errors', $this->validator->getErrors());
        }

        $dsIdx   = (int) $this->request->getPost('bs_ds_idx');
        $bagCode = $this->request->getPost('bs_bag_code');
        $qty     = (int) $this->request->getPost('bs_qty');
        $type    = $this->request->getPost('bs_type');

        $shop = model(DesignatedShopModel::class)->find($dsIdx);
        $kindO = model(CodeKindModel::class)->where('ck_code', 'O')->first();
        $detail = $kindO ? model(CodeDetailModel::class)->where('cd_ck_idx', $kindO->ck_idx)->where('cd_code', $bagCode)->first() : null;
        $price = model(BagPriceModel::class)->where('bp_lg_idx', $lgIdx)->where('bp_bag_code', $bagCode)->where('bp_state', 1)->first();
        $unitPrice = $price ? (float) $price->bp_consumer : 0;

        $actualQty = ($type === 'return') ? -$qty : $qty;

        $db = \Config\Database::connect();
        $db->transStart();

        $this->saleModel->insert([
            'bs_lg_idx'    => $lgIdx,
            'bs_ds_idx'    => $dsIdx,
            'bs_ds_name'   => $shop ? $shop->ds_name : '',
            'bs_sale_date' => $this->request->getPost('bs_sale_date'),
            'bs_bag_code'  => $bagCode,
            'bs_bag_name'  => $detail ? $detail->cd_name : '',
            'bs_qty'       => $actualQty,
            'bs_unit_price'=> $unitPrice,
            'bs_amount'    => $unitPrice * abs($actualQty),
            'bs_type'      => $type,
            'bs_regdate'   => date('Y-m-d H:i:s'),
        ]);

        // 재고 감산(판매) / 가산(반품)
        model(BagInventoryModel::class)->adjustQty($lgIdx, $bagCode, $detail ? $detail->cd_name : '', -$actualQty);

        $db->transComplete();

        $msg = ($type === 'sale') ? '판매 처리되었습니다.' : '반품 처리되었습니다.';
        return redirect()->to(site_url('admin/bag-sales'))->with('success', $msg);
    }
}
