<?php

namespace App\Http\Controllers\StoreAPI;

use App\Http\Requests\AddLicenseToDraftOrderRequest;
use App\Http\Requests\ExtensionProductCreateRequest;
use App\Http\Resources\LicenseResource;
use App\Models\Company;
use App\Models\Customer;
use App\Services\Navision\LicensesService;
use App\Services\Shopify\LicensesService as ShopifyLicensesService;
use App\Services\Shopify\OrdersService;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Log;

class LicensesController extends BaseController
{
    /**
     * Controller endpoint for frontend proxied requests to get a customers' licenses from NAV
     *
     * @param LicensesService $service
     * @param Request $request
     * @return array
     */
    public function getCompanyLicenses(LicensesService $service, Request $request)
    {
        $customerId = $request->get('logged_in_customer_id');
        if (!$customerId) {
            return [
                'success' => false,
                'error' => 'Customer not logged'
            ];
        }
        $customer = Customer::where('shopify_gid', "gid://shopify/Customer/$customerId")->first();
        if (!$customer) {
            return [
                'success' => false,
                'error' => 'Customer not found ' . $customerId
            ];
        }

        $company = $customer->company;
        $licenses = $service->getCompanyLicenses($company);

        return response()->json([
            'company' => $company->name,
            'licenses' => LicenseResource::collection($licenses)
        ]);
    }

    /**
     * Endpoint for frontend proxied requests to create a license extension product
     *
     * @param ShopifyLicensesService $shopifyService
     * @param LicensesService $service
     * @param ExtensionProductCreateRequest $request
     * @return array
     */
    public function createLicenseExtensionProduct(ShopifyLicensesService $shopifyService, LicensesService $service, ExtensionProductCreateRequest $request)
    {
        Log::info('[License extension] Product creation request');
        $data = $request->validated();

        $customerId = $request->get('logged_in_customer_id');
        if (!$customerId) {
            return response()->json([
                'success' => false,
                'error' => 'Customer not logged'
            ]);
        }
        $customer = Customer::where('shopify_gid', "gid://shopify/Customer/$customerId")->first();
        if (!$customer) {
            return response()->json([
                'success' => false,
                'error' => 'Customer not found ' . $customerId
            ]);
        }

        $company = $customer->company;

        Log::info('[License extension] Customer id: ' . $customer->id);

        $licenses = $service->getCompanyLicenses($company);

        $selectedLicense = array_values(array_filter($licenses, function ($license) use ($data) {
            return $license->HubSpot_ID == $data['licenseId'];
        }));

        if (empty($selectedLicense) || empty($selectedLicense[0]->extensions[$data['duration']])) {
            Log::warning('[License extension] License not found: ' . $data['licenseId']);
            return response()->json([
                'success' => false,
                'error' => 'License Extension not Found'
            ]);
        }
        $out = $shopifyService->createLicenseExtensionProduct($company, $selectedLicense[0], $data['duration']);

        Log::info('Extension created. Response: ' . json_encode($out));

        return response()->json(array_merge(['success' => true], $out));
    }

    /**
     * Controller endpoint for Shopify Admin Extension
     *
     * @param LicensesService $service
     * @param Request $request
     * @return array
     */
    public function getCompanyLicensesAdmin(LicensesService $service, Request $request)
    {
        $companyId = $request->input('companyId');

        if (empty($companyId)) {
            return response()->json([
                'success' => false,
                'error' => 'No company ID provided'
            ]);
        }

        $company = Company::where('shopify_gid', $companyId)->first();

        if (empty($company)) {
            return response()->json([
                'success' => false,
                'error' => 'Company not found - int'
            ]);
        }

        $licenses = $service->getCompanyLicenses($company);

        return response()->json([
            'success' => true,
            'company' => $company->name,
            'licenses' => LicenseResource::collection($licenses)
        ]);
    }

    /**
     * Endpoint for frontend proxied requests to create a license extension product
     *
     * @param OrdersService $ordersService
     * @param ShopifyLicensesService $shopifyLicensesService
     * @param LicensesService $service
     * @param ExtensionProductCreateRequest $request
     * @return array
     */
    public function createAndAddLicenseExtensionAdmin(LicensesService $service, ShopifyLicensesService $shopifyLicensesService, OrdersService $ordersService, AddLicenseToDraftOrderRequest $request)
    {
        Log::info('[License extension] Product creation and add to draft order request');
        $data = $request->validated();

        $company = Company::where('shopify_gid', $data['companyId'])->first();

        if (empty($company)) {
            return response()->json([
                'success' => false,
                'error' => 'Company not found - int'
            ]);
        }

        Log::info('[License extension] Company id: ' . $company->id);

        $licenses = $service->getCompanyLicenses($company);

        $selectedLicense = array_values(array_filter($licenses, function ($license) use ($data) {
            return $license->HubSpot_ID == $data['licenseId'];
        }));

        if (empty($selectedLicense) || empty($selectedLicense[0]->extensions[$data['duration']])) {
            Log::warning('[License extension] License not found: ' . $data['licenseId']);
            return response()->json([
                'success' => false,
                'error' => 'License Extension not Found'
            ]);
        }
        $out = $shopifyLicensesService->createLicenseExtensionProduct($company, $selectedLicense[0], $data['duration']);

        Log::info('Extension created. Response: ' . json_encode($out));

        $properties = [
            'Product' => $out['licenseProduct'],
            'License No' => $out['licenseNumber']
        ];

        $success = $ordersService->addProductToDraftOrder($data['draftOrderId'], $out['variantFullGid'], 1, $properties);

        return response()->json(['success' => $success]);
    }
}
