import {
  Controller,
  Header,
  Get,
  HttpService,
  UseInterceptors,
  CacheInterceptor,
  Param,
  CacheTTL,
} from '@nestjs/common';
import { Observable } from 'rxjs';
import { AxiosResponse } from 'axios';
import { map, flatMap, catchError } from 'rxjs/operators';
import { DvoraPageService } from './dvora-page.service';
import { ConfigService } from '@nestjs/config';

@Controller('page')
@UseInterceptors(CacheInterceptor)
export class DvoraPageController {
  private readonly URL: string = this.configService.get<string>('URL');
  // URL: string = 'http://dvora.flycommunications.com/wp-json/wp/v2/';
  // url: string = 'https://cms.dvoralife.com/wp-json/wp/v2/';
  constructor(
    private readonly httpService: HttpService,
    private pageService: DvoraPageService,
    private readonly configService: ConfigService,
  ) {}

  @CacheTTL(3600)
  @Get('home')
  getHome(): Observable<AxiosResponse> {
    const url = `${this.URL}dvora_home_page/?_fields=title,acf`;
    const home = this.httpService.get(url).pipe(map(response => response.data));
    return home;
  }

  @CacheTTL(3600)
  @Get('neighborhood/:slug')
  getNeighborhoodBySlug(
    @Param('slug') slug: string,
  ): Observable<AxiosResponse> {
    const url = `${this.URL}neighborhood?slug=${slug}&_fields=title,acf,city`;
    const neighborhood = this.httpService.get(url).pipe(
      map(response => {
        const t = response.data.map(evt => {
          const { title, acf } = evt;
          const meta = this.pageService.getMeta(acf);
          const hero_image = this.pageService.imageInfo(acf.hero_image);
          acf.hero_image = hero_image;
          acf.meta = meta;
          acf.flexible_blocks = acf.flexible_blocks.map(evt => {
            if (evt.image_grid?.image_grid_item) {
              const stripped = evt.image_grid?.image_grid_item.map(rst => {
                rst.image_grid_item_image = this.pageService.imageInfo(
                  rst.image_grid_item_image,
                );
                return rst;
              });
              evt.image_grid.image_grid_item = stripped;

              return evt;
            } else {
              return evt;
            }
          });

          return { ...evt };
        });
        return t;
      }),
    );
    return neighborhood;
  }

  @CacheTTL(3600)
  @Get('careers')
  getCareers(): Observable<AxiosResponse> {
    const url = `${this.URL}career_page/?slug=careers&_fields=title,acf`;
    const career = this.httpService.get(url).pipe(
      map(response => {
        const t = response.data.map(evt => {
          const { title, acf } = evt;
          const meta = this.pageService.getMeta(acf);
          const hero_image = this.pageService.imageInfo(acf.hero_image);
          acf.hero_image = hero_image;
          acf.meta = meta;
          return { title: title.rendered, acf: acf };
        });
        return t;
      }),
    );
    return career;
  }

  @CacheTTL(3600)
  @Get('contact')
  getContactPage(): Observable<AxiosResponse> {
    const url = `${this.URL}contact_us?_fields=acf`;
    const career = this.httpService
      .get(url)
      .pipe(map(response => response.data));
    return career;
  }

  @CacheTTL(3600)
  @Get('team')
  getTeam(): Observable<AxiosResponse> {
    const url = `${this.URL}our_team?slug=our-team&_fields=title,acf`;
    const team = this.httpService.get(url).pipe(
      map(response => {
        const t = response.data.map(evt => {
          const { title, acf } = evt;
          const meta = this.pageService.getMeta(acf);
          const hero_image = this.pageService.imageInfo(acf.hero_image);
          acf.hero_image = hero_image;
          acf.meta = meta;
          return { title: title.rendered, acf: acf };
        });
        return t;
      }),
    );
    return team;
  }

  @CacheTTL(3600)
  @Get('partners')
  getLocalPartners(): Observable<AxiosResponse> {
    const url = `${this.URL}local_partners?_fields=title,acf`;
    const partners = this.httpService.get(url).pipe(
      map(response => {
        const t = response.data.map(evt => {
          const { title, acf } = evt;
          const meta = this.pageService.getMeta(acf);
          const hero_image = this.pageService.imageInfo(acf.hero_image);
          acf.hero_image = hero_image;
          acf.meta = meta;
          acf.partner.map(x => {
            x.image = this.pageService.imageInfo(x.image);
            return x;
          });
          return { title: title.rendered, acf: acf };
        });
        return t;
      }),
    );
    return partners;
  }

  @CacheTTL(3600)
  @Get('popup')
  getPopup(): Observable<AxiosResponse> {
    const url = `${this.URL}pop_up?status=publish&per_page=1&_fields=acf`;
    const announcement = this.httpService.get(url).pipe(
      map(response => {
        const t = response.data.map(evt => {
          return {
            ...evt.acf,
          };
        });
        return t;
      }),
    );
    return announcement;
  }

  @CacheTTL(3600)
  @Get('announcement')
  getAnnouncement(): Observable<AxiosResponse> {
    const url = `${this.URL}announcement?status=publish&per_page=1&_fields=acf`;
    const announcement = this.httpService.get(url).pipe(
      map(response => {
        const t = response.data.map(evt => {
          return {
            ...evt.acf.announcement,
          };
        });
        return t;
      }),
    );
    return announcement;
  }

  @CacheTTL(3600)
  @Get('cities')
  getCities(): Observable<AxiosResponse> {
    const url = `${this.URL}city?_fields=id,name,slug`;
    const city = this.httpService.get(url).pipe(map(response => response.data));
    return city;
  }

  @CacheTTL(3600)
  @Get('cities/:id')
  getCityById(@Param('id') id): Observable<AxiosResponse> {
    const url = `${this.URL}city/${id}?_fields=name,slug`;
    const city = this.httpService.get(url).pipe(map(response => response.data));
    return city;
  }
}
