<?php

namespace App\Http\Controllers\Api;

use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\ProductActionRequest;
use App\Http\Requests\Admin\ProductsListRequest;
use App\Http\Resources\CategoryResource;
use App\Models\Product;
use App\SAP\SAPService;
use App\Shopify\ProductsService;
use App\Shopify\ShopifyService;
use Exception;

/**
 * Controller class that supports integration dashboard for order related features
 */
class ProductsController extends Controller
{
    /**
     * Available product actions
     */
    const PRODUCT_ACTIONS = ['sync-shopify', 'sync-sap'];

    /**
     * Logic for products
     *
     * @var ProductsService
     */
    private $productsService;

    /**
     * Constructor.
     *
     * @param ProductsService $productsService
     * @param SapService $sapService
     */
    public function __construct(ProductsService $productsService, SAPService $sapService, ShopifyService $shopifyService)
    {
        $this->productsService = $productsService;
        $this->sapService = $sapService;
        $this->shopifyService = $shopifyService;
    }

    public function listProducts(ProductsListRequest $request)
    {
        $data = $request->validated();

        $page = !empty($data['page']) ? $data['page'] : 1;
        $sortBy = !empty($data['sortBy']) ?  $data['sortBy'] : 'integrationId';
        $sortDesc = !empty($data['sortDesc']) ?  1 : 0;
        $categoryIds = !empty($data['categoryIds']) ?  $data['categoryIds'] : [];
        $sapIds = !empty($data['sapIds']) ?  $data['sapIds'] : [];

        $filters = [
            'categoryIds' => $categoryIds,
            'sapIds' => $sapIds
        ];

        $productResults = $this->productsService->listProducts(
            $page,
            $sortBy,
            $sortDesc,
            $filters
        );

        $productResults['success'] = true;

        return $productResults;
    }

    public function getCategories()
    {
        $categories = $this->productsService->getCategories();

        return CategoryResource::collection($categories);
    }

    public function doAction(String $action, ProductActionRequest $request)
    {
        $data = $request->validated();
        $productId = $data['id'];

        if (!in_array($action, self::PRODUCT_ACTIONS)) {
            return [
                'success' => false,
                'error' => 'Action not supported'
            ];
        }

        $product = Product::find($productId);

        if (!$product) {
            return [
                'success' => false,
                'error' => 'Product not found'
            ];
        }

        $output = [
            'success' => true
        ];

        try {
            switch ($action) {
                case 'sync-shopify':
                    $output['success'] = $this->shopifyService->productSyncForced($product);
                    $output['status'] = [
                        'toSync' => $product->to_sync,
                        'priceToSync' => $product->price->to_sync
                    ];
                    break;
                case 'sync-sap':
                    $output['success'] = $this->sapService->syncSingleProduct($product->sap_matnr);
                    $output['status'] = [
                        'toSync' => true,
                        'priceToSync' => true
                    ];
                    break;
            }
        } catch (Exception $e) {
            \Log::error($e);
            return [
                'success' => false,
                'error' => $e->getMessage()
            ];
        }

        return $output;
    }

    public function getProductSapInfo(ProductActionRequest $request)
    {
        $data = $request->validated();
        $sapId = $data['id'];

        $sapId = str_pad($sapId, 18, "0", STR_PAD_LEFT);

        $productData = $this->sapService->getSapProductData($sapId);

        return [
            'success' => true,
            'productData' => $productData
        ];
    }

    public function syncSapProduct(ProductActionRequest $request)
    {
        $data = $request->validated();
        $sapId = $data['id'];

        $sapId = str_pad($sapId, 18, "0", STR_PAD_LEFT);

        $output = [];
        try {
            $output['success'] = $this->sapService->syncSingleProduct($sapId);
        } catch (Exception $e) {
            $output['success'] = false;
            $output['message'] = $e->getMessage();
         }

        return $output;
    }
}
