<?php
/**
 * StoreService
 * Handles store onboarding, store branding, updates, and metrics
 */

require_once __DIR__ . '/../Models/Store.php';
require_once __DIR__ . '/../Models/User.php';
require_once __DIR__ . '/../Models/ActivityLog.php';
require_once __DIR__ . '/../Helpers/Upload.php';

class StoreService {
    private Store $storeModel;
    private User $userModel;
    private ActivityLog $activityLog;

    public function __construct() {
        $this->storeModel = new Store();
        $this->userModel = new User();
        $this->activityLog = new ActivityLog();
    }

    public function getStoreByUserId(int $userId): ?array {
        return $this->storeModel->findByUserId($userId);
    }

    public function registerStore(int $userId, array $data, ?array $logoFile = null, ?array $coverFile = null): array {
        // Check if user already owns a store
        $existing = $this->storeModel->findByUserId($userId);
        if ($existing) {
            return ['success' => false, 'message' => 'คุณมีร้านค้าในระบบอยู่แล้ว'];
        }

        $storeName = trim($data['store_name'] ?? '');
        $slug = trim($data['store_slug'] ?? '');
        $phone = trim($data['phone'] ?? '');
        $address = trim($data['address'] ?? '');
        $description = trim($data['description'] ?? '');

        if (empty($storeName) || mb_strlen($storeName) < 3) {
            return ['success' => false, 'message' => 'ชื่อร้านค้าต้องมีความยาวอย่างน้อย 3 ตัวอักษร'];
        }

        if (empty($slug)) {
            $slug = strtolower(preg_replace('/[^a-zA-Z0-9\x{0E00}-\x{0E7F}]+/u', '-', $storeName));
            $slug = trim($slug, '-');
            if (empty($slug)) {
                $slug = 'store-' . time();
            }
        }

        if ($this->storeModel->slugExists($slug)) {
            $slug .= '-' . time();
        }

        $logoFilename = null;
        $coverFilename = null;

        $storeId = $this->storeModel->insert([
            'user_id' => $userId,
            'store_name' => $storeName,
            'store_slug' => $slug,
            'phone' => $phone,
            'address' => $address,
            'description' => $description,
            'status' => 'active', // Auto-active for immediate testing / marketplace usability
            'commission_rate' => 5.00,
            'created_at' => date('Y-m-d H:i:s'),
            'updated_at' => date('Y-m-d H:i:s')
        ]);

        // Process Logo & Cover if provided
        if ($logoFile && !empty($logoFile['tmp_name'])) {
            [$upSuccess, $logoResult] = Upload::processStoreImage($logoFile, $storeId, 'logo');
            if ($upSuccess) {
                $logoFilename = $logoResult;
                $this->storeModel->update($storeId, ['logo' => $logoFilename]);
            }
        }

        if ($coverFile && !empty($coverFile['tmp_name'])) {
            [$upSuccess, $coverResult] = Upload::processStoreImage($coverFile, $storeId, 'cover');
            if ($upSuccess) {
                $coverFilename = $coverResult;
                $this->storeModel->update($storeId, ['cover_image' => $coverFilename]);
            }
        }

        // Assign Seller Role
        $this->userModel->assignRole($userId, 'seller');

        // Record Seller Agreement Acceptance
        require_once __DIR__ . '/../Models/UserAgreement.php';
        $agreementModel = new UserAgreement();
        $sellerAgreement = $agreementModel->getLatestActive('seller');
        if ($sellerAgreement) {
            $agreementModel->recordAcceptance($userId, (int)$sellerAgreement['id'], 'seller', $sellerAgreement['version']);
        }

        $this->activityLog->record($userId, 'store_created', 'store', $storeId, "Created store {$storeName}");

        return [
            'success' => true,
            'message' => 'เปิดร้านค้าสำเร็จ ยินดีต้อนรับสู่ศูนย์ผู้ขาย CARGOO',
            'store_id' => $storeId
        ];
    }

    public function updateStoreBranding(int $userId, array $data, ?array $logoFile = null, ?array $coverFile = null): array {
        $store = $this->storeModel->findByUserId($userId);
        if (!$store) {
            return ['success' => false, 'message' => 'ไม่พบข้อมูลร้านค้าของคุณ'];
        }

        $storeId = (int)$store['id'];
        $storeName = trim($data['store_name'] ?? $store['store_name']);
        $phone = trim($data['phone'] ?? $store['phone']);
        $address = trim($data['address'] ?? $store['address']);
        $description = trim($data['description'] ?? $store['description']);

        $updateData = [
            'store_name' => $storeName,
            'phone' => $phone,
            'address' => $address,
            'description' => $description,
            'updated_at' => date('Y-m-d H:i:s')
        ];

        // Process Logo
        if ($logoFile && !empty($logoFile['tmp_name'])) {
            [$upSuccess, $logoResult] = Upload::processStoreImage($logoFile, $storeId, 'logo');
            if ($upSuccess) {
                Upload::deleteStoreImage($store['logo']);
                $updateData['logo'] = $logoResult;
            } else {
                return ['success' => false, 'message' => $logoResult];
            }
        }

        // Process Cover Image
        if ($coverFile && !empty($coverFile['tmp_name'])) {
            [$upSuccess, $coverResult] = Upload::processStoreImage($coverFile, $storeId, 'cover');
            if ($upSuccess) {
                Upload::deleteStoreImage($store['cover_image']);
                $updateData['cover_image'] = $coverResult;
            } else {
                return ['success' => false, 'message' => $coverResult];
            }
        }

        $this->storeModel->update($storeId, $updateData);
        $this->activityLog->record($userId, 'store_updated', 'store', $storeId, "Updated store branding & details");

        return [
            'success' => true,
            'message' => 'บันทึกข้อมูลและภาพลักษณ์ร้านค้าเรียบร้อยแล้ว'
        ];
    }

    public function getStoreStats(int $userId): ?array {
        $store = $this->storeModel->findByUserId($userId);
        if (!$store) {
            return null;
        }

        return $this->storeModel->getStoreStats((int)$store['id']);
    }
}
