import { Injectable, Inject, forwardRef } from '@nestjs/common';
import { UsersService } from '../users/users.service';
import { ReservationsService } from '../reservations/reservations.service';
import { ReviewsService } from '../reviews/reviews.service';
import {
  CatalogItemShortDto,
  CatalogItemLongDto,
} from './dto/catalog-item.dto';
import { CatalogParamsDto } from './dto/catalog-params.dto';
import { CatalogResponseDto } from './dto/catalog-response.dto';
import { MainPageCatalogResponseDto } from './dto/main-page-catalog-response.dto';
import { CatalogFiltersDto } from './dto/catalog-filters.dto';
import { CreateYachtDto } from './dto/create-yacht.dto';

@Injectable()
export class CatalogService {
  constructor(
    private readonly usersService: UsersService,
    @Inject(forwardRef(() => ReservationsService))
    private readonly reservationsService: ReservationsService,
    private readonly reviewsService: ReviewsService,
  ) {}

  private catalogItems: CatalogItemLongDto[] = [
    {
      id: 1,
      name: 'Азимут 55',
      length: 16.7,
      speed: 32,
      minCost: 85000,
      mainImageUrl: 'uploads/1st.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: true,
      year: 2022,
      comfortCapacity: 8,
      maxCapacity: 12,
      width: 4.8,
      cabinsCount: 3,
      matherial: 'Стеклопластик',
      power: 1200,
      description:
        'Роскошная моторная яхта Азимут 55 - это воплощение итальянского стиля и российского качества. Идеально подходит для прогулок по Финскому заливу, корпоративных мероприятий и романтических свиданий. На борту: три комфортабельные каюты, просторный салон с панорамным остеклением, полностью оборудованная кухня и две ванные комнаты. Максимальная скорость 32 узла позволяет быстро добраться до самых живописных мест Карельского перешейка.',
      owner: { userId: 1 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 2,
      name: 'Сансикер Манхэттен 52',
      length: 15.8,
      speed: 34,
      minCost: 92000,
      mainImageUrl: 'uploads/2nd.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: false,
      isFeatured: false,
      topText: '🔥 Лучшее предложение',
      year: 2023,
      comfortCapacity: 6,
      maxCapacity: 10,
      width: 4.5,
      cabinsCount: 3,
      matherial: 'Стеклопластик',
      power: 1400,
      description:
        'Британский шик и русская душа в одной яхте! Сансикер Манхэттен 52 - выбор настоящих ценителей морских путешествий. Просторный кокпит с мягкими диванами, бар на 8 персон, система мультимедиа премиум-класса. Идеальна для празднования дня рождения на воде или деловой встречи с партнерами. Отличная маневренность позволяет заходить в марины Санкт-Петербурга и Кронштадта.',
      owner: { userId: 2 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 3,
      name: 'Принцесс V55',
      length: 16.7,
      speed: 33,
      minCost: 78000,
      mainImageUrl: 'uploads/3rd.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: false,
      topText: '🍷 Идеальна для заката с бокалом вина',
      year: 2021,
      comfortCapacity: 8,
      maxCapacity: 12,
      width: 4.7,
      cabinsCount: 4,
      matherial: 'Стеклопластик',
      power: 1100,
      description:
        'Принцесс V55 - королева российских вод! Эта яхта создана для тех, кто ценит комфорт и элегантность. Четыре уютные каюты с кондиционером, гальюн с душем, полностью оборудованная камбузная зона. Особенность - огромный платц с гидравлическим трапом для купания в Ладожском озере. Отличный выбор для семейного отдыха или рыбалки с друзьями.',
      owner: { userId: 1 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 4,
      name: 'Ферретти 500',
      length: 15.2,
      speed: 31,
      minCost: 68000,
      mainImageUrl: 'uploads/4th.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: false,
      topText: '⏳ Часто бронируется - успей',
      year: 2020,
      comfortCapacity: 6,
      maxCapacity: 8,
      width: 4.3,
      cabinsCount: 3,
      matherial: 'Стеклопластик',
      power: 900,
      description:
        'Итальянская страсть в русской стихии! Ферретти 500 сочетает в себе средиземноморский шарм и надежность для суровых условий Балтики. Просторный салон с панорамными окнами, обеденная зона на 6 человек, современная навигационная система. Идеально подходит для фотосессий на фоне разводных мостов Петербурга или романтического ужина под звуки волн.',
      owner: { userId: 2 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 5,
      name: 'Си Рей 510 Сандансер',
      length: 15.5,
      speed: 35,
      minCost: 72000,
      mainImageUrl: 'uploads/5th.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: false,
      isFeatured: false,
      year: 2023,
      comfortCapacity: 8,
      maxCapacity: 10,
      width: 4.6,
      cabinsCount: 3,
      matherial: 'Стеклопластик',
      power: 1300,
      description:
        'Американская мощь для русского моря! Си Рей 510 Сандансер - самая быстрая яхта в нашем флоте. Развивает скорость до 35 узлов, что позволяет за день обогнуть весь Финский залив. Три комфортабельные каюты, система стабилизации на стоянке, мощная аудиосистема с сабвуфером. Отличный выбор для любителей острых ощущений и скоростных прогулок.',
      owner: { userId: 1 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 6,
      name: 'Бавария SR41',
      length: 12.5,
      speed: 28,
      minCost: 45000,
      mainImageUrl: 'uploads/6th.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: false,
      year: 2019,
      comfortCapacity: 6,
      maxCapacity: 8,
      width: 3.9,
      cabinsCount: 2,
      matherial: 'Стеклопластик',
      power: 320,
      description:
        'Немецкое качество для русского характера! Бавария SR41 - надежная и экономичная яхта для спокойных прогулок по Ладоге. Две уютные каюты, просторный кокпит с тентом от дождя, лебедка для подъема парусов. Идеальный выбор для начинающих яхтсменов или семейного отдыха с детьми. Расход топлива всего 15 литров в час!',
      owner: { userId: 2 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 7,
      name: 'Жанно Мери Фишер 895',
      length: 8.9,
      speed: 25,
      minCost: 32000,
      mainImageUrl: 'uploads/1st.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: false,
      year: 2022,
      comfortCapacity: 4,
      maxCapacity: 6,
      width: 3.0,
      cabinsCount: 1,
      matherial: 'Стеклопластик',
      power: 250,
      description:
        'Французская элегантность для русского простора! Жанно Мери Фишер 895 - компактная, но вместительная яхта для рыбалки и пикников. Одна просторная каюта, открытый кокпит, столик для барбекю. Отлично подходит для выездов на природу, ночевки в бухтах или обучения детей управлению яхтой. Самый экономичный вариант в нашем флоте!',
      owner: { userId: 1 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 8,
      name: 'Бенето Свифт Троулер 41',
      length: 12.5,
      speed: 22,
      minCost: 55000,
      mainImageUrl: 'uploads/2nd.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: false,
      isFeatured: false,
      year: 2021,
      comfortCapacity: 6,
      maxCapacity: 8,
      width: 4.2,
      cabinsCount: 2,
      matherial: 'Стеклопластик',
      power: 425,
      description:
        'Французский траулер для русского севера! Бенето Свифт Троулер 41 создан для длительных путешествий по Белому морю. Экономичный дизельный двигатель, большой запас топлива, система опреснения воды. Две комфортабельные каюты с подогревом пола. Идеальный выбор для экспедиций или многодневных круизов по северным островам.',
      owner: { userId: 2 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 9,
      name: 'Лагун 450',
      length: 13.5,
      speed: 20,
      minCost: 65000,
      mainImageUrl: 'uploads/3rd.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: false,
      year: 2020,
      comfortCapacity: 8,
      maxCapacity: 10,
      width: 7.8,
      cabinsCount: 4,
      matherial: 'Стеклопластик',
      power: 90,
      description:
        'Французский катамаран для русского размаха! Лагун 450 - невероятно устойчивая и просторная яхта. Четыре отдельные каюты с санузлами, огромный салон-трансформер, две кухни. Идеально подходит для больших компаний, свадебных церемоний на воде или длительных круизов всей семьей. Не кренится даже в шторм!',
      owner: { userId: 1 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 10,
      name: 'Фонтен Пажо Люсия 40',
      length: 11.7,
      speed: 18,
      minCost: 58000,
      mainImageUrl: 'uploads/4th.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: false,
      year: 2023,
      comfortCapacity: 8,
      maxCapacity: 10,
      width: 7.1,
      cabinsCount: 4,
      matherial: 'Стеклопластик',
      power: 80,
      description:
        'Французский катамаран класса люкс! Фонтен Пажо Люсия 40 - это плавающий пятизвездочный отель. Четыре каюты-люкс с джакузи, салон с камином, профессиональная кухня с шеф-поваром. Система стабилизации на якоре, гидромассажный бассейн на палубе. Выбор настоящих ценителей роскоши и комфорта на воде.',
      owner: { userId: 2 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 11,
      name: 'Дюфур 460',
      length: 14.1,
      speed: 26,
      minCost: 62000,
      mainImageUrl: 'uploads/5th.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: false,
      isFeatured: false,
      year: 2022,
      comfortCapacity: 8,
      maxCapacity: 10,
      width: 4.5,
      cabinsCount: 3,
      matherial: 'Стеклопластик',
      power: 380,
      description:
        'Французская парусная яхта для русского ветра! Дюфур 460 - мечта любого яхтсмена. Три просторные каюты, кокпит с мягкими сиденьями, современное парусное вооружение. Идеально сбалансированная, легко управляется даже новичками. Отличный выбор для регат, обучения парусному спорту или романтических круизов под парусами.',
      owner: { userId: 1 } as any,
      reviews: [],
      reservations: [],
    },
    {
      id: 12,
      name: 'Гранд Бэнкс 60',
      length: 18.3,
      speed: 24,
      minCost: 125000,
      mainImageUrl: 'uploads/6th.jpg',
      galleryUrls: [
        'uploads/gal1.jpg',
        'uploads/gal2.jpg',
        'uploads/gal3.jpg',
        'uploads/gal4.jpg',
        'uploads/gal5.jpg',
        'uploads/gal6.jpg',
        'uploads/gal7.jpg',
        'uploads/gal8.jpg',
        'uploads/gal9.jpg',
        'uploads/gal10.jpg',
      ],
      hasQuickRent: true,
      isFeatured: false,
      year: 2023,
      comfortCapacity: 6,
      maxCapacity: 8,
      width: 5.2,
      cabinsCount: 3,
      matherial: 'Стеклопластик',
      power: 1600,
      description:
        'Американская легенда для русского океана! Гранд Бэнкс 60 - экспедиционная яхта для самых смелых путешествий. Три каюты-люкс, салон с библиотекой, зимний сад, сауна. Автономность плавания - 30 дней! Способна пересечь Баренцево море и дойти до Шпицбергена. Выбор для настоящих морских волков и исследователей Арктики.',
      owner: { userId: 2 } as any,
      reviews: [],
      reservations: [],
    },
  ];

  private toShortDto(item: CatalogItemLongDto): CatalogItemShortDto {
    const {
      id,
      name,
      length,
      speed,
      minCost,
      mainImageUrl,
      galleryUrls,
      hasQuickRent,
      isFeatured,
      topText,
    } = item;
    return {
      id,
      name,
      length,
      speed,
      minCost,
      mainImageUrl,
      galleryUrls,
      hasQuickRent,
      isFeatured,
      topText,
    };
  }

  async getCatalogItemById(id: number): Promise<CatalogItemLongDto | null> {
    const item = this.catalogItems.find((item) => item.id === id);
    if (!item) return null;

    const ownerId = [1, 2][(id - 1) % 2];
    const owner = await this.usersService.findById(ownerId);

    if (owner) {
      item.owner = owner;
    }

    item.reviews = this.reviewsService.getReviewsByYachtId(id);
    item.reservations = this.reservationsService.getReservationsByYachtId(id);

    return item;
  }

  async getMainPageCatalog(): Promise<MainPageCatalogResponseDto | null> {
    const clonedCatalog = [...this.catalogItems];
    const filteredCatalog = clonedCatalog.filter(
      ({ isFeatured }) => !isFeatured,
    );

    const featuredYachtIndex = clonedCatalog.findIndex(
      (item) => item.isFeatured === true,
    );

    if (featuredYachtIndex !== -1) {
      const minCost = Math.min(
        ...filteredCatalog.map((item) => item.minCost || Infinity),
      );

      const mappedRestYachts = filteredCatalog.slice(0, 6).map((item) => ({
        ...this.toShortDto(item),
        isBestOffer: item.minCost === minCost,
      }));

      return {
        featuredYacht: this.toShortDto(clonedCatalog[featuredYachtIndex]),
        restYachts: mappedRestYachts,
      };
    }

    return null;
  }

  async getCatalog(filters?: CatalogFiltersDto): Promise<CatalogResponseDto> {
    // Start with all items converted to short DTO
    let filteredItems = this.catalogItems.map((item) => this.toShortDto(item));

    // Get the full items for filtering by properties not in short DTO
    const fullItems = this.catalogItems;

    // Search filter
    if (filters?.search) {
      const searchTerm = filters.search.toLowerCase();
      filteredItems = filteredItems.filter((item) => {
        const fullItem = fullItems.find((fi) => fi.id === item.id);
        return (
          item.name.toLowerCase().includes(searchTerm) ||
          (fullItem && fullItem.description.toLowerCase().includes(searchTerm))
        );
      });
    }

    // Length filter
    if (filters?.minLength !== undefined) {
      filteredItems = filteredItems.filter(
        (item) => item.length >= filters.minLength!,
      );
    }
    if (filters?.maxLength !== undefined) {
      filteredItems = filteredItems.filter(
        (item) => item.length <= filters.maxLength!,
      );
    }

    // Price filter
    if (filters?.minPrice !== undefined) {
      filteredItems = filteredItems.filter(
        (item) => item.minCost >= filters.minPrice!,
      );
    }
    if (filters?.maxPrice !== undefined) {
      filteredItems = filteredItems.filter(
        (item) => item.minCost <= filters.maxPrice!,
      );
    }

    // Year filter
    if (filters?.minYear !== undefined || filters?.maxYear !== undefined) {
      filteredItems = filteredItems.filter((item) => {
        const fullItem = fullItems.find((fi) => fi.id === item.id);
        if (!fullItem) return false;

        if (filters.minYear !== undefined && fullItem.year < filters.minYear)
          return false;
        if (filters.maxYear !== undefined && fullItem.year > filters.maxYear)
          return false;
        return true;
      });
    }

    if (filters?.guests !== undefined) {
      const totalPeople = filters?.guests!;
      filteredItems = filteredItems.filter((item) => {
        const fullItem = fullItems.find((fi) => fi.id === item.id);
        return fullItem && fullItem.maxCapacity >= totalPeople;
      });
    }

    // Quick booking filter
    if (filters?.quickBooking !== undefined) {
      filteredItems = filteredItems.filter(
        (item) => item.hasQuickRent === filters.quickBooking,
      );
    }

    // Has toilet filter (check if cabinsCount > 0)
    if (filters?.hasToilet !== undefined) {
      filteredItems = filteredItems.filter((item) => {
        const fullItem = fullItems.find((fi) => fi.id === item.id);
        if (!fullItem) return false;
        return filters.hasToilet
          ? fullItem.cabinsCount > 0
          : fullItem.cabinsCount === 0;
      });
    }

    // Payment type filter (assuming all accept card payments)
    if (filters?.paymentType) {
      // For now, all yachts accept card payments
      // You could add a paymentTypes array to CatalogItemLongDto if needed
      console.log('Payment type filtering:', filters.paymentType);
    }

    // Date/time filter (check reservations)
    if (filters?.date || filters?.departureTime || filters?.arrivalTime) {
      // This is more complex - would need to check reservations
      // For now, we'll return all items
      console.log('Date/time filtering available for future implementation');
    }

    if (filters?.sortByPrice === 'asc') {
      filteredItems.sort((a, b) => a.minCost - b.minCost);
    } else if (filters?.sortByPrice === 'desc') {
      filteredItems.sort((a, b) => b.minCost - a.minCost);
    } else {
      filteredItems.sort((a, b) => a.name.localeCompare(b.name));
    }

    return {
      items: filteredItems,
      total: filteredItems.length,
      filters,
      search: filters?.search,
    };
  }

  async getAllCatalogItems(): Promise<CatalogItemShortDto[]> {
    return this.catalogItems.map((item) => this.toShortDto(item));
  }

  async getCatalogByUserId(userId: number): Promise<CatalogItemShortDto[]> {
    // Логика определения ownerId: нечетные id -> ownerId=1, четные id -> ownerId=2
    const filteredItems = this.catalogItems.filter((item) => {
      return item.owner?.userId === userId;
    });
    return filteredItems.map((item) => this.toShortDto(item));
  }

  async createYacht(createYachtDto: CreateYachtDto): Promise<CatalogItemLongDto> {
    const newId = Math.max(...this.catalogItems.map((item) => item.id || 0), 0) + 1;
    const owner = await this.usersService.findById(createYachtDto.userId);

    const newYacht: CatalogItemLongDto = {
      id: newId,
      name: createYachtDto.name,
      length: createYachtDto.length,
      speed: createYachtDto.speed,
      minCost: createYachtDto.minCost,
      mainImageUrl: createYachtDto.mainImageUrl,
      galleryUrls: createYachtDto.galleryUrls,
      hasQuickRent: createYachtDto.hasQuickRent,
      isFeatured: createYachtDto.isFeatured,
      year: createYachtDto.year,
      comfortCapacity: createYachtDto.comfortCapacity,
      maxCapacity: createYachtDto.maxCapacity,
      width: createYachtDto.width,
      cabinsCount: createYachtDto.cabinsCount,
      matherial: createYachtDto.matherial,
      power: createYachtDto.power,
      description: createYachtDto.description,
      owner: owner || ({ userId: createYachtDto.userId } as any),
      reviews: [],
      reservations: [],
      topText: createYachtDto.topText,
    };

    this.catalogItems.push(newYacht);
    return newYacht;
  }
}
