<?php
namespace App\Lib;

use App\Lib\Lakuemas_tx;
use App\Libs\Average_sell_price_lib;
use DB;

class Bonus_register {
    /**
     * kasih bonus per register      
     * @param  [string] $id_customer [description]
     */
    public function give_bonus($id_customer) 
    {
        $bonus = $this->get_bonus_val();
        $this->kasi_bonus_ke_customer($id_customer, $bonus);
    }

    private function get_bonus_val() 
    {
        $data_setting = DB::table('setting')->where('type', 'bonus_register')->first();
        return $data_setting->value;
    }

    private function kasi_bonus_ke_customer($id_customer, $bonus)
    {
        $data_tabungan = $this->get_tabungan_default($id_customer);
        $data_kurs = get_kurs();

        $new_saldo = bcadd($data_tabungan->saldo, $bonus, 4);
        
        $id_tx = $this->create_tx($id_customer, $data_tabungan->id);
        $this->create_tabungan_tx(
            $data_tabungan->id, 
            $id_tx, 
            $bonus, 
            $data_kurs->harga_jual, 
            $data_kurs->harga_beli, 
            $new_saldo
        );
        $this->update_saldo($data_tabungan->id, $new_saldo);
        $this->update_average_sell_price($data_tabungan->id, $id_tx)
    }

    private function get_tabungan_default($id_customer) 
    {
        return DB::table('tabungan')
            ->where('id_customer', $id_customer)
            ->where('is_closed', '0')
            ->where('is_default', '1')
            ->first();
    }

    private function create_tx($id_customer, $id_tabungan) 
    {
        $class_lakuemas_tx = new Lakuemas_tx;
        $tx_code = $class_lakuemas_tx->generate_txcode();

        $data = [
            'code' => $tx_code,
            'id_customer' => $id_customer,
            'id_tabungan' => $id_tabungan,
            'type' => '11',
            'status' => '1',
            'id_user' => '0',
            'date_approved' => now(),
            'created_at' => now()
        ];
        $id_tx = DB::table('transaksi')->insertGetId($data);

        $data_log = [
            'act' => 'insert',
            'id_transaksi' => $id_tx,
            'content' => json_encode($data),
            'id_users' => '0',
            'created_at' => now()
        ];
        DB::table('transaksi_log')->insertGetId($data_log);

        return $id_tx;
    }

    private function create_tabungan_tx($id_tabungan, $id_tx, $bonus, $harga_jual, $harga_beli, $new_saldo)
    {
        $data = [
            'id_transaksi' => $id_tx,
            'id_tabungan' => $id_tabungan,
            'credit' => $bonus,
            'keterangan' => 'Bonus Registrasi',
            'saldo_akhir' => $new_saldo,
            'harga_jual' => $harga_jual,
            'harga_beli' => $harga_beli,
            'created_at' => now()
        ];
        $id_tabungan_tx = DB::table('tabungan_transaksi')->insertGetId($data);

        $data_log = [
            'act' => 'insert',
            'id_tabungan_transaksi' => $id_tabungan_tx,
            'content' => json_encode($data),
            'id_users' => '0',
            'created_at' => now()
        ];
        DB::table('tabungan_transaksi_log')->insertGetId($data_log);
    }

    private function update_saldo($id_tabungan, $new_saldo) 
    {
        $data = [
            'saldo' => $new_saldo,
            'updated_at' => now()
        ];
        DB::table('tabungan')->where('id', $id_tabungan)->update($data);

        $data_log = [
            'act' => 'update',
            'id_tabungan' => $id_tabungan,
            'content' => json_encode($data),
            'id_users' => '0',
            'created_at' => now()
        ];
        DB::table('tabungan_log')->insertGetId($data_log);
    }

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