import { createRoute, OpenAPIHono } from '@hono/zod-openapi'
import { ErrorSchema } from '@/server/utils/errorHandler'
import { dashService } from '@/server/modules/dash/dash.service'
import { z } from 'zod'

// 财务数据响应Schema
const FinancialDataResponseSchema = z.object({
  code: z.literal(200),
  msg: z.literal('查询成功'),
  rows: z.array(z.object({
    assetTotalNet: z.array(z.object({
      id: z.number(),
      year: z.number(),
      assetTotal: z.number(), // 资产总额（单位：元）
      assetNet: z.number(),   // 资产净额（单位：元）
      dataDeadline: z.string(),
      createTime: z.string(),
      updateTime: z.string(),
    })),
    profitTotalNet: z.array(z.object({
      id: z.number(),
      year: z.number(),
      profitTotal: z.number(), // 利润总额（单位：元）
      profitNet: z.number(),   // 净利润（单位：元）
      dataDeadline: z.string(),
      createTime: z.string(),
      updateTime: z.string(),
    })),
    incomeStatement: z.array(z.object({
      id: z.number(),
      year: z.number(),
      income: z.number(),      // 收入（单位：元）
      dataDeadline: z.string(),
      createTime: z.string(),
      updateTime: z.string(),
    })),
    assetLiabilityRatio: z.array(z.object({
      id: z.number(),
      year: z.number(),
      assetLiabilityRatio: z.number(), // 资产负债率（单位：%）
      dataDeadline: z.string(),
      createTime: z.string(),
      updateTime: z.string(),
    })),
  }))
})

const routeDef = createRoute({
  method: 'get',
  path: '/outlook',
  // 注意：这是一个公开API，不需要认证中间件
  responses: {
    200: {
      description: '获取财务数据成功',
      content: {
        'application/json': {
          schema: FinancialDataResponseSchema
        }
      }
    },
    500: {
      description: '服务器内部错误',
      content: {
        'application/json': {
          schema: ErrorSchema
        }
      }
    }
  }
})

const app = new OpenAPIHono().openapi(routeDef, async (c) => {
  try {
    const financialData = await dashService.getFinancialData()
    return c.json(financialData, 200)
  } catch (_error) {
    // 在生产环境中应该使用日志服务
    // console.error('获取财务数据失败:', _error)
    return c.json({
      code: 500,
      message: '服务器内部错误'
    }, 500)
  }
})

export default app