<template>
  <view class="loading-page">
    <view class="loading-spinner"></view>
    <text class="loading-text">{{ statusText }}</text>
  </view>
</template>

<script>
import config from '@/config/env.js';
import { gatewayGet, gatewayPost } from '@/utils/request.js';
import { detectPlatform, getAppNo } from '@/utils/env.js';

export default {
  data() {
    return {
      statusText: '正在登录...',
      deviceId: '',
    };
  },
  onLoad(options) {
    this.deviceId = options.device_id || '';

    // #ifdef H5
    // Mock 模式：跳过微信 OAuth，直接登录
    if (config.mockWechatLogin) {
      this.mockLogin();
      return;
    }

    // 优先从页面参数获取 code（App.vue 跳转时带过来）
    // 兜底从 URL search 参数获取（微信直接回调时）
    let code = options.code || '';
    if (!code) {
      const urlParams = new URLSearchParams(window.location.search);
      code = urlParams.get('code') || '';
    }

    if (code) {
      // 有 code → 调用后端登录
      this.handleCallback(code);
    } else {
      // 无 code → 发起 OAuth 授权
      this.startAuth();
    }
    // #endif

    // #ifndef H5
    // 小程序环境暂不支持，跳回扫码页
    uni.redirectTo({ url: '/pages/index/scan' });
    // #endif
  },
  methods: {
    /**
     * 发起 OAuth 授权（静默授权，只获取 openid）
     */
    async startAuth() {
      const platform = detectPlatform();
      const appNo = getAppNo(platform);

      if (!appNo) {
        // 非微信环境，跳转注册页（手机号注册）
        this.goToRegister();
        return;
      }

      try {
        this.statusText = '正在获取授权...';

        // 回调地址必须是 HTTPS，使用配置文件中的地址
        const redirectUri = config.authRedirectUri || (
          window.location.origin.replace(/^http:/, 'https:') + window.location.pathname
        );

        // 使用 snsapi_base 静默授权，不弹窗
        const res = await gatewayGet('/api/v1/user/auth/url', {
          app_no: appNo,
          scopes: 'snsapi_base',
          redirect_uri: redirectUri,
        });

        const data = res.data || {};
        if (data.code === 0 && data.data && data.data.auth_url) {
          // 跳转微信授权页（静默，不弹窗）
          window.location.href = data.data.auth_url;
        } else {
          uni.showToast({ title: data.message || '获取授权失败', icon: 'none' });
          setTimeout(() => this.goToScan(), 1500);
        }
      } catch (e) {
        console.error('[Auth] startAuth error:', e);
        uni.showToast({ title: '网络请求失败', icon: 'none' });
        setTimeout(() => this.goToScan(), 1500);
      }
    },

    /**
     * 处理授权回调（从 URL 中获取 code 后换取 openid，再用 openid 登录）
     */
    async handleCallback(code) {
      const appNo = uni.getStorageSync('app_no') || getAppNo(detectPlatform());

      if (!appNo) {
        uni.showToast({ title: '无法获取应用信息', icon: 'none' });
        this.goToScan();
        return;
      }

      try {
        this.statusText = '正在验证身份...';

        // 用 code 换取 openid（后端处理，前端只传 code）
        const res = await gatewayPost('/api/v1/user/login', {
          app_no: appNo,
          code: code,
        });

        const data = res.data || {};
        console.log('[loading] login response:', JSON.stringify(data, null, 2));

        if (data.code === 0 && data.data) {
          const result = data.data;
          console.log('[loading] login result:', JSON.stringify(result, null, 2));

          // 清除 URL 中的 code 参数，避免刷新重复处理
          const url = new URL(window.location.href);
          url.searchParams.delete('code');
          url.searchParams.delete('state');
          window.history.replaceState({}, '', url.toString());

          // 存储 openid
          uni.setStorageSync('openid', result.openid);

          if (result.register) {
            // 已注册 → 缓存 JWT → 跳转首页
            uni.setStorageSync('token', result.token);
            // 不再存储 user_info，点击"我的"时再获取
            this.goToHome();
          } else {
            // 未注册 → 缓存临时数据 → 跳转注册页
            uni.setStorageSync('temp_token', result.temp_token);
            this.goToRegister();
          }
        } else {
          uni.showToast({ title: data.message || '登录失败', icon: 'none' });
          setTimeout(() => this.goToScan(), 1500);
        }
      } catch (e) {
        console.error('[Auth] login error:', e);
        uni.showToast({ title: '网络请求失败', icon: 'none' });
        setTimeout(() => this.goToScan(), 1500);
      }
    },

    goToHome() {
      const url = this.deviceId
        ? `/pages/index/index?device_id=${this.deviceId}`
        : '/pages/index/index';
      uni.redirectTo({ url });
    },

    goToRegister() {
      // 记录扫码时的原始 URL，注册完成后跳回
      const scanUrl = this.deviceId
        ? `/pages/index/index?device_id=${this.deviceId}`
        : '';
      if (scanUrl) {
        uni.setStorageSync('__scan_redirect_url', scanUrl);
      }

      const url = this.deviceId
        ? `/pages/register/register?device_id=${this.deviceId}`
        : '/pages/register/register';
      uni.redirectTo({ url });
    },

    goToScan() {
      uni.redirectTo({ url: '/pages/index/scan' });
    },

    /**
     * Mock 登录（跳过微信授权，调用真实登录接口）
     */
    async mockLogin() {
      const mode = config.mockWechatLogin;
      const mock = config.mockUser;
      const mockOpenid = mock.user_info.open_id;

      // 'skip' 模式直接登录，不调接口
      if (mode === 'skip') {
        this.statusText = '模拟登录中...';
        uni.setStorageSync('token', mock.token);
        uni.setStorageSync('openid', mockOpenid);
        console.log('[Auth] Mock skip → home');
        setTimeout(() => this.goToHome(), 500);
        return;
      }

      // 'register' / 'login' 模式：调用真实登录接口，传 mock openid
      this.statusText = '模拟：调用登录接口...';
      const appNo = uni.getStorageSync('app_no') || config.mockAppNo;

      try {
        const res = await gatewayPost('/api/v1/user/login', {
          app_no: appNo,
          openid: mockOpenid,
        });

        const data = res.data || {};
        console.log('[Auth] Mock login response:', JSON.stringify(data, null, 2));

        if (data.code === 0 && data.data) {
          const result = data.data;

          // 存储 openid
          uni.setStorageSync('openid', result.openid || mockOpenid);

          if (result.register) {
            // 已注册 → 存 token → 跳首页
            uni.setStorageSync('token', result.token);
            console.log('[Auth] Mock: existing user → home');
            this.goToHome();
          } else {
            // 未注册 → 存 temp_token → 跳注册页
            uni.setStorageSync('temp_token', result.temp_token);
            console.log('[Auth] Mock: new user → register');
            this.goToRegister();
          }
        } else {
          uni.showToast({ title: data.message || '登录失败', icon: 'none' });
          console.error('[Auth] Mock login failed:', data);
        }
      } catch (e) {
        console.error('[Auth] Mock login error:', e);
        uni.showToast({ title: '网络请求失败', icon: 'none' });
      }
    },
  },
};
</script>

<style scoped>
page {
  height: 100%;
  background-color: #fff;
}

.loading-page {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  height: 100vh;
  background-color: #fff;
}

.loading-spinner {
  width: 64rpx;
  height: 64rpx;
  border: 6rpx solid #e5e5e5;
  border-top-color: #2979ff;
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
  margin-bottom: 32rpx;
}

@keyframes spin {
  to {
    transform: rotate(360deg);
  }
}

.loading-text {
  font-size: 28rpx;
  color: #999;
}
</style>
