<?php

use App\Models\Device;
use App\Models\LocationTransaction;
use App\Models\OwnerTransaction;
use App\Models\PurchasingInformation;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Route;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider and all of them will
| be assigned to the "api" middleware group. Make something great!
|
*/

Route::post('/login', function (Request $request) {
    $fields = $request->validate(
        [
            'user' => 'required',
            'password' => 'required'
        ]

    );
    $user = User::where('rz_username', $fields['user'])->first();
    if (!$user || !Hash::check($fields['password'], $user->hashed_password)) {
        return response([
            'message' => 'Bad login'
        ], 401);
    }
    $token = $user->createToken('token');
    return ['token' => $token->plainTextToken];
});

Route::middleware('auth:sanctum')->get('/export', function () {

    return response()->json([
        'Devices' => Device::all(),
        'PurchasingInformations' => PurchasingInformation::all(),
        'OwnerTransactions' => OwnerTransaction::all(),
        'LocationTransactions' => LocationTransaction::all()
    ]);
});

Route::middleware('auth:sanctum')->post('/import', function (Request $request) {
    $data = $request->json()->all();
    $devices = $data['devices'];
    $purchasingInformations = $data['purchasing_information'];
    $ownerTransactions = $data['owner_transactions'];
    $locationTransactions = $data['location_transactions'];
    //$response = {};
    foreach ($devices as $device) {
        $deviceInsert = DB::table('devices')->insertOrIgnore([
            'device_id' => $device['device_id'],
            'title' => $device['title'],
            'device_type' => $device['device_type'],
            'description' => $device['description'] ?? '',
            'accessories' => $device['accessories'] ?? '',
            'rz_username_buyer' => $device['rz_username_buyer'],
            'serial_number' => $device['serial_number'],
            'image_url' => $device['image_url']
        ]);
        // insertOrIgnore returns 0 if statement was ignored
        if ($deviceInsert != 0) {
            // save insert for later
        }
    }
    foreach ($purchasingInformations as $purchasing) {
        $purchasingInsert = DB::table('purchasing_information')->insertOrIgnore([
            'purchasing_information_id' => $purchasing['purchasing_information_id'],
            'price' => $purchasing['price'],
            'timestamp_warranty_end' => $purchasing['timestamp_warranty_end'],
            'timestamp_purchase' => $purchasing['timestamp_purchase'],
            'cost_centre' => $purchasing['cost_centre'],
            'seller' => $purchasing['seller'] ?? '',
            'device_id' => $purchasing['device_id']
        ]);
        // insertOrIgnore returns 0 if statement was ignored
        if ($purchasingInsert != 0) {
            // save insert for later
        }
    }
    foreach ($ownerTransactions as $owner) {
        $ownerInsert = DB::table('owner_transactions')->insertOrIgnore([
            'owner_transaction_id' => $owner['owner_transaction_id'],
            'rz_username' => $owner['rz_username'],
            'timestamp_owner_since' => $owner['timestamp_owner_since'],
            'device_id' => $owner['device_id']
        ]);
        // insertOrIgnore returns 0 if statement was ignored
        if ($ownerInsert != 0) {
            // save insert for later
        }
    }
    foreach ($locationTransactions as $location) {
        $locationInsert = DB::table('location_transactions')->insertOrIgnore([
            'location_transaction_id' => $location['location_transaction_id'],
            'room_code' => $location['room_code'],
            'timestamp_located_since' => $location['timestamp_located_since'],
            'device_id' => $location['device_id']
        ]);
        // insertOrIgnore returns 0 if statement was ignored
        if ($locationInsert != 0) {
            // save insert for later
        }
    }
    // ToDo: return only inserted 
    return $request->json()->all();
});

Route::middleware('auth:sanctum')->get('/user', function (Request $request) {
    return $request->user();
});