import { Controller, Get, Render, Req, Res } from '@nestjs/common';
import { CommonService } from './common/common.service';
import { SkipAuth } from './utils/decorator';
import { SkipThrottle } from '@nestjs/throttler';
import { Request, Response } from 'express';
import { isDev } from './utils/common';

const EjsMap = {
  'www.chuntianxiaozhu.com': {
    assetsName: 'contentResource',
    templateName: 'index',
  },
  'design.chuntianxiaozhu.com': {
    assetsName: 'designResource',
    templateName: 'design',
  },
  'develop.chuntianxiaozhu.com': {
    assetsName: 'developResource',
    templateName: 'develop',
  },
  'waiter.chuntianxiaozhu.com': {
    assetsName: 'waiterResource',
    templateName: 'waiter',
  },
};

@Controller()
export class AppController {
  constructor(private commonService: CommonService) {}

  @Get()
  @SkipAuth()
  @SkipThrottle()
  async home(@Req() req: Request, @Res() res: Response) {
    const ejsInfo = EjsMap[req.hostname] || {
      assetsName: 'contentResource',
      templateName: 'index',
    };

    const asset = await this.commonService.findAssets(ejsInfo.assetsName);
    if (!asset) {
      return res.render(ejsInfo.templateName, {
        csrfToken: req.csrfToken && req.csrfToken(),
      });
    }
    let content: any = {};
    try {
      content = JSON.parse(asset.content);
    } catch {}
    if (!isDev()) {
      return res.render(ejsInfo.templateName, {
        ...content,
        csrfToken: req.csrfToken(),
      });
    }

    return res.render(ejsInfo.templateName, { ...content });
  }

  @Get('/miniprogram')
  @SkipAuth()
  @SkipThrottle()
  async miniProgram(@Req() req: Request) {
    return {
      csrfToken: req.csrfToken && req.csrfToken(),
    };
  }

  @Get('/admin/*')
  @Render('admin')
  @SkipAuth()
  async admin(@Req() req: Request): Promise<Object> {
    const asset = await this.commonService.findAssets('adminResource');
    if (!asset) {
      return {
        csrfToken: req.csrfToken && req.csrfToken(),
      };
    }
    let content: any = {};
    try {
      content = JSON.parse(asset.content);
    } catch {}
    if (!isDev()) {
      return {
        ...content,
        csrfToken: req.csrfToken(),
      };
    }
    return { ...content };
  }

  @Get('/pages/*')
  @Render('index')
  @SkipAuth()
  @SkipThrottle()
  async pages(@Req() req: Request): Promise<Object> {
    const asset = await this.commonService.findAssets('contentResource');
    if (!asset) {
      return {
        csrfToken: req.csrfToken(),
      };
    }
    let content: any = {};
    try {
      content = JSON.parse(asset.content);
    } catch {}
    if (!isDev()) {
      return {
        ...content,
        csrfToken: req.csrfToken(),
      };
    }
    return { ...content };
  }
}
