import { CommonModule, NgOptimizedImage } from '@angular/common';
import { ChangeDetectorRef, Component } from '@angular/core';
import { FormsModule } from '@angular/forms';
import { ActivatedRoute, Router, RouterModule } from '@angular/router';
import { BusinessListing, User } from '../../../../../../bizmatch-server/src/models/db.model';
import { LISTINGS_PER_PAGE, ListingType, UserListingCriteria, emailToDirName } from '../../../../../../bizmatch-server/src/models/main.model';
import { environment } from '../../../../environments/environment';
import { PaginatorComponent } from '../../../components/paginator/paginator.component';
import { ImageService } from '../../../services/image.service';
import { ListingsService } from '../../../services/listings.service';
import { SearchService } from '../../../services/search.service';
import { SelectOptionsService } from '../../../services/select-options.service';
import { UserService } from '../../../services/user.service';
import { getCriteriaStateObject } from '../../../utils/utils';

@Component({
  selector: 'app-broker-listings',
  standalone: true,
  imports: [CommonModule, FormsModule, RouterModule, NgOptimizedImage, PaginatorComponent],
  templateUrl: './broker-listings.component.html',
  styleUrls: ['./broker-listings.component.scss', '../../pages.scss'],
})
export class BrokerListingsComponent {
  environment = environment;
  listings: Array<BusinessListing>;
  users: Array<User>;
  filteredListings: Array<ListingType>;
  criteria: UserListingCriteria;
  realEstateChecked: boolean;
  maxPrice: string;
  minPrice: string;
  type: string;
  states = [];
  statesSet = new Set();
  state: string;
  first: number = 0;
  rows: number = 12;
  totalRecords: number = 0;
  ts = new Date().getTime();
  env = environment;
  public category: 'business' | 'commercialProperty' | 'professionals_brokers' | undefined;
  emailToDirName = emailToDirName;
  page = 1;
  pageCount = 1;
  constructor(
    public selectOptions: SelectOptionsService,
    private listingsService: ListingsService,
    private userService: UserService,
    private activatedRoute: ActivatedRoute,
    private router: Router,
    private cdRef: ChangeDetectorRef,
    private imageService: ImageService,
    private route: ActivatedRoute,
    private searchService: SearchService,
  ) {
    this.criteria = getCriteriaStateObject('broker');
    this.init();
    this.searchService.currentCriteria.subscribe(criteria => {
      if (criteria && criteria.criteriaType === 'broker') {
        this.criteria = criteria as UserListingCriteria;
        this.search();
      }
    });
  }
  async ngOnInit() {
    const statesResult = await this.userService.getAllStates();
    this.states = statesResult.map(ls => ({ name: this.selectOptions.getState(ls.state as string), value: ls.state, count: ls.count }));
  }
  async init() {
    this.search();
  }
  async search() {
    const usersReponse = await this.userService.search(this.criteria);
    this.users = usersReponse.results;
    this.totalRecords = usersReponse.totalCount;
    this.pageCount = this.totalRecords % LISTINGS_PER_PAGE === 0 ? this.totalRecords / LISTINGS_PER_PAGE : Math.floor(this.totalRecords / LISTINGS_PER_PAGE) + 1;
    this.cdRef.markForCheck();
    this.cdRef.detectChanges();
  }
  onPageChange(page: any) {
    this.criteria.start = (page - 1) * LISTINGS_PER_PAGE;
    this.criteria.length = LISTINGS_PER_PAGE;
    this.criteria.page = page;
    this.search();
  }

  reset() {}
}
