/**
 * AnalyticsService — Centralised GA4 event tracking for Mould Detect.
 *
 * Architecture:
 *   All gtag() / dataLayer calls are made through this service.
 *   Business components call AnalyticsService.track*() methods only —
 *   they never reference gtag or dataLayer directly.
 *
 * Two-property GA4 strategy:
 *   - Promotional website: separate GA4 property (future)
 *   - This app:            G-63NPGJ2XZS  (app_type: 'web_app')
 *
 * SPA page view tracking:
 *   MemoryRouter does not trigger GA4 automatic page views.
 *   App.jsx calls AnalyticsService.pageView(path, title) on every route change.
 *
 * Safe by default:
 *   All methods guard against missing window.gtag — safe in test/SSR environments.
 *
 * Public API:
 *   AnalyticsService.init(config)                  — boot-time context push
 *   AnalyticsService.pageView(path, title)          — SPA virtual page view
 *   AnalyticsService.scanInitiated(params)          — user taps "Check for Mould"
 *   AnalyticsService.scanCompleted(params)          — results shown
 *   AnalyticsService.scanError(params)              — analysis failed
 *   AnalyticsService.scanSaved(params)              — scan persisted to store
 *   AnalyticsService.reportsViewed(params)          — reports page loaded
 *   AnalyticsService.findProfessionalViewed(params) — specialists page loaded
 *   AnalyticsService.specialistProfileViewed(params)— profile page loaded
 *   AnalyticsService.contactProfessionalInitiated(p)— contact form opened
 *   AnalyticsService.contactProfessionalSubmitted(p)— quote request sent
 *   AnalyticsService.signInInitiated(params)        — sign-in CTA tapped
 *   AnalyticsService.signUpInitiated(params)        — sign-up CTA tapped
 *   AnalyticsService.appError(params)               — ErrorBoundary / app-level error
 *   AnalyticsService.setUserType(type)              — update user_type dimension
 */
var AnalyticsService = (function () {

    var GA_MEASUREMENT_ID = 'G-63NPGJ2XZS';
    var APP_VERSION       = '2.5.0';

    // Internal: safe gtag wrapper — no-ops if gtag not loaded
    function _gtag() {
        if (typeof window.gtag !== 'function') return;
        window.gtag.apply(window, arguments);
    }

    // Internal: push to dataLayer directly (for GTM compatibility)
    function _push(obj) {
        window.dataLayer = window.dataLayer || [];
        window.dataLayer.push(obj);
    }

    // Internal: merge global app dimensions into every event
    function _event(eventName, params) {
        var merged = {
            app_type:    'web_app',
            app_version: APP_VERSION,
            app_domain:  window.location.hostname || 'unknown',
        };
        if (params) {
            for (var k in params) { merged[k] = params[k]; }
        }
        _gtag('event', eventName, merged);
    }

    /**
     * init() — Called once during App.jsx boot after FeatureFlags.init().
     * Pushes app context to dataLayer and configures GA4 with app dimensions.
     *
     * @param {object} config
     *   @param {string} config.aiEngine   — active engine: 'local_cnn' | 'cloud_ai' | 'nyckel' | 'none'
     *   @param {string} config.userType   — 'guest' | 'registered'
     */
    function init(config) {
        var aiEngine = (config && config.aiEngine) || 'unknown';
        var userType = (config && config.userType) || 'guest';

        // Push app context to dataLayer for GTM access
        _push({
            event:       'app_init',
            app_type:    'web_app',
            app_version: APP_VERSION,
            app_domain:  window.location.hostname || 'unknown',
            ai_engine:   aiEngine,
            user_type:   userType,
        });

        // Set GA4 user properties for segmentation in reports
        _gtag('config', GA_MEASUREMENT_ID, {
            app_type:           'web_app',
            app_version:        APP_VERSION,
            send_page_view:     false, // disable auto — we fire manually via pageView()
            custom_map: {
                dimension1: 'app_type',
                dimension2: 'ai_engine',
                dimension3: 'user_type',
            },
        });

        console.info('[Analytics] Initialised. app_type=web_app, ai_engine=' + aiEngine + ', user_type=' + userType);
    }

    /**
     * pageView() — Fire a virtual page view for SPA route changes.
     * Must be called from App.jsx on every MemoryRouter location change.
     *
     * @param {string} path  — e.g. '/analysis'
     * @param {string} title — e.g. 'Scan'
     */
    function pageView(path, title) {
        _gtag('event', 'page_view', {
            page_title:    title || path,
            page_location: window.location.origin + path,
            page_path:     path,
            app_type:      'web_app',
            app_domain:    window.location.hostname || 'unknown',
        });
    }

    // ── Scan Journey ──────────────────────────────────────────────────────────

    /**
     * scanInitiated — User taps "Check for Mould" with an image ready.
     * @param {{ ai_engine: string, image_source: string }} params
     *   image_source: 'camera' | 'gallery' | 'drag_drop'
     */
    function scanInitiated(params) {
        _event('scan_initiated', params);
    }

    /**
     * scanCompleted — Analysis results displayed to user.
     * @param {{ ai_engine, verdict, severity, confidence_pct, species, is_mould }} params
     */
    function scanCompleted(params) {
        _event('scan_completed', params);
    }

    /**
     * scanError — Analysis failed (all engines exhausted).
     * @param {{ ai_engine, error_type, error_message }} params
     */
    function scanError(params) {
        _event('scan_error', params);
    }

    /**
     * scanSaved — Scan record persisted to IndexedDB.
     * @param {{ severity, has_location, has_property }} params
     */
    function scanSaved(params) {
        _event('scan_saved', params);
    }

    // ── Reports ───────────────────────────────────────────────────────────────

    /**
     * reportsViewed — Reports page loaded.
     * @param {{ scan_count, property_count }} params
     */
    function reportsViewed(params) {
        _event('reports_viewed', params);
    }

    // ── Specialist Journey ────────────────────────────────────────────────────

    /**
     * findProfessionalViewed — Specialist directory page loaded.
     * @param {{ search_query, category_filter, result_count }} params
     */
    function findProfessionalViewed(params) {
        _event('find_professional_viewed', params);
    }

    /**
     * specialistProfileViewed — Individual specialist profile viewed.
     * @param {{ specialist_category, specialist_city }} params
     */
    function specialistProfileViewed(params) {
        _event('specialist_profile_viewed', params);
    }

    /**
     * contactProfessionalInitiated — Contact form page opened.
     * @param {{ specialist_category }} params
     */
    function contactProfessionalInitiated(params) {
        _event('contact_professional_initiated', params);
    }

    /**
     * contactProfessionalSubmitted — Quote request form submitted.
     * @param {{ specialist_category, has_scan_attached, contact_method }} params
     */
    function contactProfessionalSubmitted(params) {
        _event('contact_professional_submitted', params);
    }

    // ── Auth Journey ──────────────────────────────────────────────────────────

    /**
     * signInInitiated — Sign In CTA tapped.
     * @param {{ trigger_location: string }} params
     *   trigger_location: 'header' | 'home_panel' | 'menu' | 'upgrade_panel'
     */
    function signInInitiated(params) {
        _event('sign_in_initiated', params);
    }

    /**
     * signUpInitiated — Sign Up CTA tapped.
     * @param {{ trigger_location: string }} params
     */
    function signUpInitiated(params) {
        _event('sign_up_initiated', params);
    }

    // ── Errors ────────────────────────────────────────────────────────────────

    /**
     * appError — Application-level error (ErrorBoundary, boot failure).
     * @param {{ error_type, component, message }} params
     */
    function appError(params) {
        _event('app_error', params);
    }

    // ── User Properties ───────────────────────────────────────────────────────

    /**
     * setUserType — Update the user_type dimension (guest → registered on sign-in).
     * @param {string} type — 'guest' | 'registered'
     */
    function setUserType(type) {
        _gtag('set', 'user_properties', { user_type: type });
        _push({ user_type: type });
    }

    return {
        init:                          init,
        pageView:                      pageView,
        scanInitiated:                 scanInitiated,
        scanCompleted:                 scanCompleted,
        scanError:                     scanError,
        scanSaved:                     scanSaved,
        reportsViewed:                 reportsViewed,
        findProfessionalViewed:        findProfessionalViewed,
        specialistProfileViewed:       specialistProfileViewed,
        contactProfessionalInitiated:  contactProfessionalInitiated,
        contactProfessionalSubmitted:  contactProfessionalSubmitted,
        signInInitiated:               signInInitiated,
        signUpInitiated:               signUpInitiated,
        appError:                      appError,
        setUserType:                   setUserType,
    };
})();

window.AnalyticsService = AnalyticsService;
