import { Hono } from 'hono'
import { logger } from 'hono/logger'
import type { AuthPayload } from './db/repo/auth.repo'
import { authRouter } from './routes/auth.route'
import { jwt } from 'hono/jwt'
import env from './env'
import { prettyJSON } from 'hono/pretty-json'
import { cors } from 'hono/cors'
import { bodyLimit } from 'hono/body-limit'
import { HttpStatus, createApexError } from './services/error.service'
import { userStatsRouter } from './routes/user-stats.route'
import { publicResourceRouter, resourceRouter } from './routes/resource.route'
import { publicResourceStatsRouter, resourceStatsRouter } from './routes/resource-stats.route'
import { collectionsRouter, getCollections } from './routes/collections.route'
import { userRouter } from './routes/user.route'
import { uploaderRouter } from './routes/uploader.route'
import { collectionsStatsRouter, getCollectionsStats } from './routes/collection-stats.route'
import { publicSubjectsRouter, subjectsRouter } from './routes/subjects.route'
import { submissionRouter } from './routes/submission.route'
import { licenseRouter, publicLicenseRouter } from './routes/license.route'
import { languageRouter, publicLanguageRouter } from './routes/language.route'
import { educationalStageRouter, publicEducationalStageRouter } from './routes/educational-stage.route'
import { objectTypeRouter, publicObjectTypeRouter } from './routes/object-type.route'
import { roleRouter } from './routes/role.route'
import { complaintsRouter } from './routes/complaints.route'
import { publicResourceLanguageRouter, resourceLanguageRouter } from './routes/resource-language.route'
import { userRoleRouter } from './routes/user-role.route'
import { collectionLikesRoutes, publicCollectionLikesRoutes } from './routes/collection-likes.route'
import { institutionRouter } from './routes/institution.route'
import { collectionResourcesRoutes, publicCollectionResourcesRoutes } from './routes/collection-resources.route'
import { publicResourceSubjectsRouter, resourceSubjectsRouter } from './routes/resource-subjects.route'
import { userInstitutionRouter } from './routes/user-institution.route'
import { publicResourceLikesRoutes, resourceLikesRoutes } from './routes/resource-likes.route'
import { publicResourceEducationalStagesRouter, resourceEducationalStagesRouter } from './routes/resource-educational-stages.route'
import { achievementRouter, publicAchievementRouter } from './routes/achievement.route'
import { itemsRouter, publicItemsRouter } from './routes/items.route'
import { publicUserAchievementsRoute, userAchievementsRouter } from './routes/user-achievements.route'
import { actionRouter } from './routes/action.route'
import { notificationRouter } from './routes/notification.route'
import { userItemRouter } from './routes/user-item.route'
import { swaggerUI } from '@hono/swagger-ui'
import { OpenAPIHono } from "@hono/zod-openapi";
import { commentsRouter, publicCommentsRoute } from './routes/comments.route'
import { publicCommentsReplyRoute, commentReplyRouter } from './routes/comment-reply.route'
import { publicUserCollectionsRoutes, userCollectionsRoute } from './routes/user-collection.route'
import { s3Routes } from './routes/s3.route'



const app = new OpenAPIHono();

app.use('*', logger())
app.use('*', prettyJSON())
app.use('*', cors())
app.use(
  '/api/*',
  jwt({
    secret: env.APP_SECRET,
  })
)

// The openapi.json will be available at /doc
app.doc("/doc", {
  openapi: "3.0.0",
  info: {
      version: "1.0.0",
      title: "My API",
  },
});

// swagger ui doc will be available at {server url}/ui
// fell free to change the url
// swaggerUI url must have same path as openapi.json
app.get("/ui", swaggerUI({ url: "/doc" }));

app.use(
  '/api/upload',
  bodyLimit({
    maxSize: 50 * 1024 * 1024, // 50mb
    onError(c) {
      return c.json(
        createApexError({
          status: 'error',
          message: 'File is too big. Current limit is 50mb',
          code: HttpStatus.PAYLOAD_TOO_LARGE,
          path: c.req.routePath,
          suggestion: 'Reduce the size of your file and try again',
        }),
        413
      )
    },
  })
)

app.get('/', (c) => c.json({ message: 'sv running on /api' }))


//rotas que não precisam de token
app
  .basePath('/public')
  .route('/auth', authRouter)
  .route('/resource', publicResourceRouter)
  .route('/statsResource', publicResourceStatsRouter)
  .route('/subjects', publicSubjectsRouter)
  .route('/get-collections', getCollections)
  .route('/get-collection-stats', getCollectionsStats)
  .route('/license', publicLicenseRouter)
  .route('/language', publicLanguageRouter)
  .route('/educationalStage', publicEducationalStageRouter)
  .route('/objectType', publicObjectTypeRouter)
  .route('/resourceLanguage', publicResourceLanguageRouter)
  .route('/collectionLikes', publicCollectionLikesRoutes)
  .route('/collectionResources', publicCollectionResourcesRoutes)
  .route('/resourceSubjects', publicResourceSubjectsRouter)
  .route('/resourceEducationalStages', publicResourceEducationalStagesRouter)
  .route('/items', publicItemsRouter)
  .route('/resourceLikes', publicResourceLikesRoutes)
  .route('/achievements', publicAchievementRouter)
  .route('/userAchievements', publicUserAchievementsRoute)
  .route('/comments', publicCommentsRoute)
  .route('/replyComment', publicCommentsReplyRoute)
  .route('/userCollections', publicUserCollectionsRoutes)
//rotas que precisam de token
app
  .basePath('/api')
  .route('/user', userRouter)
  .route('/upload', uploaderRouter)
  .route('/user-stats', userStatsRouter)
  .route('/resource', resourceRouter)
  .route('/statsResource', resourceStatsRouter)
  .route('/subjects', subjectsRouter)
  .route('/collection', collectionsRouter)
  .route('/collection-stats', collectionsStatsRouter)
  .route('/submission', submissionRouter)
  .route('/license', licenseRouter)
  .route('/language', languageRouter)
  .route('/educationalStage', educationalStageRouter)
  .route('/objectType', objectTypeRouter)
  .route('/roles', roleRouter)
  .route('/user-roles', userRoleRouter)
  .route('/complaint', complaintsRouter)
  .route('/resourceLanguage', resourceLanguageRouter)
  .route('/collectionLikes', collectionLikesRoutes)
  .route('/institution', institutionRouter)
  .route('/collectionResources', collectionResourcesRoutes)
  .route('/resourceSubjects', resourceSubjectsRouter)
  .route('/user-institutions', userInstitutionRouter)
  .route('/resourceEducationalStages', resourceEducationalStagesRouter)
  .route('/items', itemsRouter)
  .route('/actions', actionRouter)
  .route('/achievements', achievementRouter)
  .route('/resourceLikes', resourceLikesRoutes)
  .route('/userAchievements', userAchievementsRouter)
  .route('/notifications', notificationRouter)
  .route('/user-item', userItemRouter)
  .route('/comments', commentsRouter)
  .route('/replyComment', commentReplyRouter)
  .route('/userCollections', userCollectionsRoute)
  .route('/s3', s3Routes)

export default app
export type AppType = typeof app

export function honoWithJwt() {
  return new Hono<{
    Variables: {
      jwtPayload: AuthPayload
    }
  }>()
}