<?php
namespace App\Http\Controllers\API;

use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request;

use App\Lib\Lakuemas;
use App\Lib\Lakuemas_tx;
use App\Lib\FundTransferBCA;
use App\Libs\Average_sell_price_lib;
use App\Jobs\SendEmailRejectJualJob;
use DB;

class Notification_jualController extends Controller
{
    public function doAction(Request $request) 
    {
        $array_validate = [
            'id' => 'required',
            'pin' => 'required',
            'status' => 'required'
        ];
        $request->validate($array_validate);

        $id = request('id');
        $pin = request('pin');
        $status = request('status');
        $data_user = Auth::user();

        if($data_user->pin != $pin) {
            $return["message"] = "PIN tidak Sesuai";
            $return["errors"]["pin"][0] = "PIN tidak sesuai";
            return response()->json($return, 422);
        }
        else {
            /* 1.  Update Tx Status => 1 */

            $class_lakuemas_tx = new Lakuemas_tx;

            if($status == '1') {
                $detail_tx = $class_lakuemas_tx->get_detail($id);
                $data_rekening_tujuan = $this->get_rekening_tujuan($detail_tx->id_customer);

                $class_fund_transfer_bca = new FundTransferBCA;
                $res = $class_fund_transfer_bca->do_transfer($id, $detail_tx->tx_code, $detail_tx->jumlah_dana, $data_rekening_tujuan->nomor_rekening);

                if($res) {
                    $class_lakuemas_tx->update_tx_status_jual($data_user->id, $id, '1');
                    $return['success'] = '1';
                    return response()->json($return, 200);
                }
                else {
                    $return["message"] = "Transfer Gagal";
                    $return["errors"]["transfer"][0] = "Transfer Gagal";
                    return response()->json($return, 422);
                }
            }

            else if($status == '2') {
                $class_lakuemas_tx->update_tx_status_jual($data_user->id, $id, '1');
                
                /*
                    2.  Insert TX Retur
                    3.  Insert Tabungan Tx Retur
                    4.  Balikin Saldo
                    5.  Send email notification
                */

                $class_lakuemas = new Lakuemas;

                $txcode = $class_lakuemas_tx->generate_txcode();
                $data_kurs = get_kurs();

                $detail_tx = $class_lakuemas_tx->get_detail($id);
                $saldo_akhir = bcadd($detail_tx->saldo, $detail_tx->debet, 4);

                $id_tx = $class_lakuemas_tx->create_tx_lakuemas($txcode, $detail_tx->id_customer, $detail_tx->id_tabungan, '2', '1', NULL, $data_user->id);

                $class_lakuemas_tx->insert_tabungan_tx(
                    $id_tx, 
                    $detail_tx->id_tabungan, 
                    $detail_tx->debet,
                    '',
                    '', 
                    $data_kurs->harga_beli, 
                    $data_kurs->harga_jual, 
                    $detail_tx->jumlah_dana, 
                    '', 
                    '', 
                    '', 
                    'Retur Transaksi '.$detail_tx->tx_code, 
                    $saldo_akhir
                );

                $class_lakuemas->update_saldo($detail_tx->id_customer, $detail_tx->id_tabungan, $saldo_akhir);
                $this->update_average_sell_price($detail_tx->id_tabungan, $id_tx);

                dispatch(new SendEmailRejectJualJob($detail_tx->email, $detail_tx->name, $detail_tx->nomor_rekening, $detail_tx->tx_code, $detail_tx->debet, $detail_tx->created_at));
                
                $return['success'] = '1';
                return response()->json($return, 200);
            }
        }

        $return["message"] = "Unknown Error";
        $return["errors"]["error"][0] = "Unknown error";
        return response()->json($return, 422);
    }

    private function get_rekening_tujuan($id_customer)
    {
        return DB::table('customer_bank')
            ->where('id_customer', $id_customer)
            ->where('is_approved', '1')
            ->first();
    }

    private function update_average_sell_price($id_tabungan, $id_transaksi){
        (new Average_sell_price_lib)->update($id_tabungan, $id_transaksi);
    }
}