<?php

namespace App\Http\Controllers;

use App\Models\Item;
use App\Models\Plant;
use App\Models\StickerMaster;
use Illuminate\Http\Request;
use Str;

class StickerMasterController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(Request $request)
    {
        //
    }

    public function get_master_type(Request $request)
    {
        $expectedUser = env('API_AUTH_USER');
        $expectedPw = env('API_AUTH_PW');
        $header_auth = $request->header('Authorization');
        $expectedToken = $expectedUser.':'.$expectedPw;

        if ('Bearer '.$expectedToken != $header_auth) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid authorization token!',
            ], 403);
        }

        $plantCode = $request->header('plant-code');
        $itemCode = $request->header('item-code');

        if ($plantCode == null || $plantCode == '') {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Plant code can't be empty!",
            ], 400);
        } elseif (! is_numeric($plantCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant code should contain only numeric values!',
            ], 400);
        } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant code must be between 4 and 7 digits only!',
            ], 400);
        } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid plant code found!',
            ], 400);
        } elseif ($itemCode == null || $itemCode == '') {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code can't be empty!",
            ], 400);
        } elseif (Str::length($itemCode) < 6 || ! ctype_alnum($itemCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid item code found!',
            ], 400);
        }

        $plant = Plant::where('code', $plantCode)->first();

        if (! $plant) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant not found!',
            ], 400);
        }

        $plantId = $plant->id;

        $item = Item::where('code', $itemCode)->first();

        if (! $item) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Item Code not found in item table!',
            ], 404);
        }

        $item = Item::where('plant_id', $plantId)->where('code', $itemCode)->first();

        if (! $item) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code not found in item table for the plant : '$plant->name'!",
            ], 404);
        }

        $itemId = $item->id;

        $stickerMaster = StickerMaster::where('item_id', $itemId)->first();

        if (! $stickerMaster) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Item Code not found in sticker master table!',
            ], 404);
        }

        $stickerMaster = StickerMaster::where('plant_id', $plantId)->where('item_id', $itemId)->first();

        if (! $stickerMaster) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code not found in sticker master table for the plant : '$plant->name'!",
            ], 404);
        }

        $serial_number_motor = $stickerMaster->serial_number_motor ?? null;
        $serial_number_pump = $stickerMaster->serial_number_pump ?? null;

        if ($serial_number_motor != 1 && $serial_number_pump != 1) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "The Item Code '$itemCode' does not have serial pump or serial motor selected!",
            ], 400);
        }

        $serialInfo = [];

        if ($serial_number_motor == 1 && $serial_number_pump == 1) {
            $serialInfo[] = 'Serial Pump';
        } else {
            if ($serial_number_motor == 1) {
                $serialInfo[] = 'Serial Motor';
            }
            if ($serial_number_pump == 1) {
                $serialInfo[] = 'Serial Pump';
            }
        }

        $output = [
            'status_code' => 'SUCCESS',
            'status_description' => implode(', ', $serialInfo),
        ];

        return response()->json($output, 200);
    }

    /**
     * Display the specified resource.
     */
    public function get_master(Request $request)
    {
        $expectedUser = env('API_AUTH_USER');
        $expectedPw = env('API_AUTH_PW');
        $header_auth = $request->header('Authorization');
        $expectedToken = $expectedUser.':'.$expectedPw;

        if ('Bearer '.$expectedToken != $header_auth) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid authorization token!',
            ], 403);
        }

        $plantCode = $request->header('plant-code');
        $itemCode = $request->header('item-code');

        if ($plantCode == null || $plantCode == '') {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Plant code can't be empty!",
            ], 400);
        } elseif (! is_numeric($plantCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant code should contain only numeric values!',
            ], 400);
        } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant code must be between 4 and 7 digits only!',
            ], 400);
        } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid plant code found!',
            ], 400);
        } elseif ($itemCode == null || $itemCode == '') {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code can't be empty!",
            ], 400);
        } elseif (Str::length($itemCode) < 6 || ! ctype_alnum($itemCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid item code found!',
            ], 400);
        }

        $plant = Plant::where('code', $plantCode)->first();

        if (! $plant) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant Code not found!',
            ], 400);
        }

        $plantId = $plant->id;

        $item = Item::where('code', $itemCode)->first();

        if (! $item) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Item Code not found in item table!',
            ], 404);
        }

        $item = Item::where('plant_id', $plantId)->where('code', $itemCode)->first();

        if (! $item) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code not found for the plant : '$plant->name' in item table!",
            ], 404);
        }

        $itemId = $item->id;

        $description = $item ? $item->description : '';

        $uom = $item ? $item->uom : '';

        // $category = $item ? $item->category : '';

        $stickerMaster = StickerMaster::where('item_id', $itemId)->first();

        if (! $stickerMaster) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Item Code not found in sticker master table!',
            ], 404);
        }

        $stickerMaster = StickerMaster::where('plant_id', $plantId)->where('item_id', $itemId)->first();

        if (! $stickerMaster) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code not found for the plant : '$plant->name' in sticker master table!",
            ], 404);
        }

        $output = [
            'item_description' => $description ?? '',
            'uom' => $uom ?? '',
            'Part_Validation_1' => $stickerMaster?->laser_part_validation1 ?? '',
            'Part_Validation_2' => $stickerMaster?->laser_part_validation2 ?? '',
            'Part_Validation_3' => $stickerMaster?->laser_part_validation3 ?? '',
            'Part_Validation_4' => $stickerMaster?->laser_part_validation4 ?? '',
            'Part_Validation_5' => $stickerMaster?->laser_part_validation5 ?? '',
            'bundle_quantity' => (string) $stickerMaster?->bundle_quantity ?? '0',
        ];

        return response()->json($output, 200);
    }

    public function get_quality_master(Request $request)
    {
        $expectedUser = env('API_AUTH_USER');
        $expectedPw = env('API_AUTH_PW');
        $header_auth = $request->header('Authorization');
        $expectedToken = $expectedUser.':'.$expectedPw;

        if ('Bearer '.$expectedToken != $header_auth) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid authorization token!',
            ], 403);
        }

        $plantCode = $request->header('plant-code');
        $itemCode = $request->header('item-code');

        if ($plantCode == null || $plantCode == '') {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Plant code can't be empty!",
            ], 400);
        } elseif (! is_numeric($plantCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant code should contain only numeric values!',
            ], 400);
        } elseif (Str::length($plantCode) < 4 || Str::length($plantCode) > 7) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant code must be between 4 and 7 digits only!',
            ], 400);
        } elseif (! preg_match('/^[1-9]\d{3,6}$/', $plantCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid plant code found!',
            ], 400);
        } elseif ($itemCode == null || $itemCode == '') {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code can't be empty!",
            ], 400);
        } elseif (Str::length($itemCode) < 6 || ! ctype_alnum($itemCode)) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Invalid item code found!',
            ], 400);
        }

        $plant = Plant::where('code', $plantCode)->first();

        if (! $plant) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Plant Code not found!',
            ], 400);
        }

        $plantId = $plant->id;

        $item = Item::where('code', $itemCode)->first();

        if (! $item) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Item Code not found in item table!',
            ], 404);
        }

        $item = Item::where('plant_id', $plantId)->where('code', $itemCode)->first();

        if (! $item) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code not found for the plant : '$plant->name' in item table!",
            ], 404);
        }

        $itemId = $item->id;

        $description = $item ? $item->description : '';

        $uom = $item ? $item->uom : '';

        // $category = $item ? $item->category : '';

        $stickerMaster = StickerMaster::where('item_id', $itemId)->first();

        if (! $stickerMaster) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => 'Item Code not found in sticker master table!',
            ], 404);
        }

        $stickerMaster = StickerMaster::where('plant_id', $plantId)->where('item_id', $itemId)->first();

        if (! $stickerMaster) {
            return response()->json([
                'status_code' => 'ERROR',
                'status_description' => "Item Code not found for the plant : '$plant->name' in sticker master table!",
            ], 404);
        }

        $output = [
            'item_description' => $description ?? '',
            'uom' => $uom ?? '',
            'Part_Validation_1' => $stickerMaster?->part_validation1 ?? '',
            'Part_Validation_2' => $stickerMaster?->part_validation2 ?? '',
            'Part_Validation_3' => $stickerMaster?->part_validation3 ?? '',
            'Part_Validation_4' => $stickerMaster?->part_validation4 ?? '',
            'Part_Validation_5' => $stickerMaster?->part_validation5 ?? '',
        ];

        return response()->json($output, 200);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, string $id)
    {
        //
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(string $id)
    {
        //
    }
}
