import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { CmsPage } from './entities/cms-page.entity';
import { ThemeSetting } from './entities/theme-setting.entity';
import { CreateCmsPageDto } from './dto/create-cms-page.dto';
import { UpdateCmsPageDto } from './dto/update-cms-page.dto';
import { UpdateThemeSettingDto } from './dto/update-theme-setting.dto';

@Injectable()
export class CmsService {
  constructor(
    @InjectRepository(CmsPage)
    private readonly cmsPageRepository: Repository<CmsPage>,

    @InjectRepository(ThemeSetting)
    private readonly themeSettingRepository: Repository<ThemeSetting>,
  ) {}

  createPage(data: CreateCmsPageDto) {
    const page = this.cmsPageRepository.create({
      ...data,
      language: data.language || 'fr',
    });

    return this.cmsPageRepository.save(page);
  }

  findAllPages() {
    return this.cmsPageRepository.find({
      order: { createdAt: 'DESC' },
    });
  }

  async findPageBySlug(slug: string, language = 'fr') {
    const page = await this.cmsPageRepository.findOne({
      where: {
        slug,
        language,
      },
    });

    if (!page) {
      throw new NotFoundException('CMS page not found');
    }

    return page;
  }

  async updatePage(id: number, data: UpdateCmsPageDto) {
    const page = await this.cmsPageRepository.findOne({ where: { id } });

    if (!page) {
      throw new NotFoundException('CMS page not found');
    }

    Object.assign(page, data);
    return this.cmsPageRepository.save(page);
  }

  async removePage(id: number) {
    const page = await this.cmsPageRepository.findOne({ where: { id } });

    if (!page) {
      throw new NotFoundException('CMS page not found');
    }

    return this.cmsPageRepository.softRemove(page);
  }

  async getTheme() {
    let theme = await this.themeSettingRepository.findOne({
      where: { isActive: true },
      order: { createdAt: 'DESC' },
    });

    if (!theme) {
      theme = this.themeSettingRepository.create({
        name: 'default',
      });

      theme = await this.themeSettingRepository.save(theme);
    }

    return theme;
  }

  async updateTheme(data: UpdateThemeSettingDto) {
    const theme = await this.getTheme();

    Object.assign(theme, data);

    return this.themeSettingRepository.save(theme);
  }
}
