{"ast":null,"code":"import { interval } from 'rxjs';\nimport { environment } from '../environments/environment';\nimport { devLog } from '../utils/dev-log'; // ajuste o caminho se necessário\nimport * as i0 from \"@angular/core\";\nimport * as i1 from \"../services/client.service\";\nimport * as i2 from \"../app.component\";\nimport * as i3 from \"@angular/common/http\";\nimport * as i4 from \"@angular/router\";\nimport * as i5 from \"../services/user.service\";\nimport * as i6 from \"@angular/common\";\nimport * as i7 from \"../clock/clock.component\";\nconst _c0 = () => [];\nfunction HomeComponent_tr_16_Template(rf, ctx) {\n  if (rf & 1) {\n    i0.ɵɵelementStart(0, \"tr\")(1, \"td\");\n    i0.ɵɵtext(2);\n    i0.ɵɵelementEnd();\n    i0.ɵɵelementStart(3, \"td\");\n    i0.ɵɵtext(4);\n    i0.ɵɵelementEnd();\n    i0.ɵɵelementStart(5, \"td\");\n    i0.ɵɵtext(6);\n    i0.ɵɵelementEnd();\n    i0.ɵɵelementStart(7, \"td\");\n    i0.ɵɵtext(8);\n    i0.ɵɵelementEnd()();\n  }\n  if (rf & 2) {\n    const ground_r1 = ctx.$implicit;\n    i0.ɵɵadvance(2);\n    i0.ɵɵtextInterpolate(ground_r1.name_ground);\n    i0.ɵɵadvance(2);\n    i0.ɵɵtextInterpolate(ground_r1.parking_ground_total);\n    i0.ɵɵadvance(2);\n    i0.ɵɵtextInterpolate(ground_r1.parking_ground_free);\n    i0.ɵɵadvance(2);\n    i0.ɵɵtextInterpolate(ground_r1.parking_ground_busy);\n  }\n}\nexport let HomeComponent = /*#__PURE__*/(() => {\n  class HomeComponent {\n    constructor(clientService, appComponent, http, router, userService) {\n      this.clientService = clientService;\n      this.appComponent = appComponent;\n      this.http = http;\n      this.router = router;\n      this.userService = userService;\n      this.userName = '';\n      this.userRole = '';\n      this.clients = [];\n      this.selectedClient = '';\n      this.clientLogo = 'assets/img/path-to-client-logo.png';\n      this.parkingData = [];\n      this.totalVagas = 0;\n      this.vagasLivres = 0;\n      this.vagasOcupadas = 0;\n    }\n    ngOnInit() {\n      this.startAutoUpdate(); // 🚀 dispara atualização automática\n      this.loadParkingData();\n      console.log('[ngOnInit] Componente Home inicializado.');\n      const userId = this.userService.getUserId();\n      console.log(`[ngOnInit] ID do usuário: ${userId}`);\n      this.appComponent.loadClients();\n      const storedClientId = localStorage.getItem('selectedClientId');\n      if (storedClientId) {\n        this.selectedClient = storedClientId;\n      }\n      const userAccessData = this.userService.getUserAccessData();\n      if (userAccessData?.parkingAccess?.length > 0) {\n        this.clients = userAccessData.parkingAccess.map(p => ({\n          id: p.id,\n          name: p.parkingName\n        }));\n        const selected = userAccessData.parkingAccess.find(p => p.id == +this.selectedClient) || userAccessData.parkingAccess[0];\n        this.selectedClient = selected.id.toString();\n        this.updateClientLogo(selected.id);\n        this.userName = `Nome do Usuário: ${selected.nome}`;\n        this.userRole = `Cargo do Usuário: ${selected.cargo}`;\n        this.clientService.setSelectedClient(selected.id);\n        this.getParkingData(selected.id);\n      }\n      this.clientSubscription = this.clientService.selectedClient$.subscribe(clientId => {\n        this.selectedClient = clientId;\n        localStorage.setItem('selectedClientId', clientId.toString());\n        this.updateClientLogo(+clientId);\n        this.getParkingData(+clientId);\n      });\n      this.startAutoUpdate();\n    }\n    onClientChange() {\n      const selectedClientObj = this.clients.find(client => client.id.toString() === this.selectedClient);\n      if (selectedClientObj) {\n        this.updateClientLogo(selectedClientObj.id);\n        localStorage.setItem('selectedClientId', selectedClientObj.id.toString());\n        const userAccessData = this.userService.getUserAccessData();\n        const selected = userAccessData?.parkingAccess?.find(p => p.id === selectedClientObj.id);\n        if (selected) {\n          this.userName = `Nome do Usuário: ${selected.nome}`;\n          this.userRole = `Cargo do Usuário: ${selected.cargo}`;\n        }\n        this.getParkingData(selectedClientObj.id);\n      }\n    }\n    updateClientLogo(clientId) {\n      this.clientLogo = `assets/img/cliente-${clientId}.png`;\n    }\n    getParkingData(id_customer) {\n      const url = `${environment.apiUrlBackEndExternaApiDB}/v1/spark-customers/ground/{\"id_customer\":${id_customer},\"id_park\":1}`;\n      const headers = {\n        device: 'manager'\n      };\n      devLog('[getParkingData] Iniciando requisição para:', url);\n      devLog('[getParkingData] Headers:', headers);\n      this.http.get(url, {\n        headers\n      }).subscribe(data => {\n        devLog('[getParkingData] Dados recebidos da API:', data);\n        if (Array.isArray(data)) {\n          this.parkingData = data;\n          devLog('[getParkingData] Dados atribuídos ao parkingData com sucesso.');\n        } else {\n          this.parkingData = [];\n          devLog('[getParkingData] Dados recebidos não são um array. parkingData setado como array vazio.');\n        }\n        this.calculateTotals();\n        devLog('[getParkingData] Totais calculados:', {\n          totalVagas: this.totalVagas,\n          vagasLivres: this.vagasLivres,\n          vagasOcupadas: this.vagasOcupadas\n        });\n      }, error => {\n        console.error('[getParkingData] Erro:', error);\n        devLog('[getParkingData] Erro na requisição:', error);\n        this.parkingData = []; // evita erro no template em caso de falha\n      });\n    }\n    calculateTotals() {\n      this.totalVagas = this.vagasLivres = this.vagasOcupadas = 0;\n      for (const ground of this.parkingData) {\n        this.totalVagas += ground.parking_ground_total;\n        this.vagasLivres += ground.parking_ground_free;\n        this.vagasOcupadas += ground.parking_ground_busy;\n      }\n    }\n    startAutoUpdate() {\n      devLog('[startAutoUpdate] Iniciando atualização automática a cada 10s.');\n      this.updateSubscription = interval(10000).subscribe(() => {\n        const userAccessData = this.userService.getUserAccessData();\n        const numericValue = +this.selectedClient;\n        devLog('[startAutoUpdate] Cliente selecionado:', numericValue);\n        devLog('[startAutoUpdate] Dados de acesso do usuário:', userAccessData);\n        const selected = userAccessData?.parkingAccess?.find(p => p.id === numericValue);\n        if (selected) {\n          this.userName = `Nome do Usuário: ${selected.nome}`;\n          this.userRole = `Cargo do Usuário: ${selected.cargo}`;\n          this.updateClientLogo(numericValue);\n          devLog('[startAutoUpdate] Nome e cargo atualizados:', {\n            nome: selected.nome,\n            cargo: selected.cargo\n          });\n        } else {\n          devLog('[startAutoUpdate] Nenhum acesso encontrado para o cliente:', numericValue);\n        }\n        devLog('[startAutoUpdate] acesso encontrado para o cliente:', numericValue);\n        this.getParkingData(numericValue);\n      });\n    }\n    stopAutoUpdate() {\n      if (this.updateSubscription) {\n        this.updateSubscription.unsubscribe();\n      }\n    }\n    loadParkingData() {\n      const clientId = localStorage.getItem('selectedClient') || '1';\n      const url = `${environment.apiUrlBackEndExternaApiDB}/v1/spark-customers/ground/{\"id_customer\":${clientId},\"id_park\":1}`;\n      const headers = {\n        device: 'manager'\n      };\n      this.http.get(url, {\n        headers\n      }).subscribe(data => {\n        // ✅ Garante que parkingData sempre seja um array\n        if (Array.isArray(data)) {\n          this.parkingData = data;\n        } else {\n          console.warn('[loadParkingData] Resposta inesperada:', data);\n          this.parkingData = [];\n        }\n        this.totalVagas = this.parkingData.reduce((sum, g) => sum + g.parking_ground_total, 0);\n        this.vagasLivres = this.parkingData.reduce((sum, g) => sum + g.parking_ground_free, 0);\n        this.vagasOcupadas = this.parkingData.reduce((sum, g) => sum + g.parking_ground_busy, 0);\n      }, error => {\n        console.error('[loadParkingData] Erro ao carregar dados de estacionamento:', error);\n        this.parkingData = []; // ❗ evita erro no template\n      });\n    }\n    ngOnDestroy() {\n      this.stopAutoUpdate();\n      this.clientSubscription?.unsubscribe();\n    }\n    logout() {\n      this.router.navigate(['/login']);\n    }\n    static #_ = this.ɵfac = function HomeComponent_Factory(t) {\n      return new (t || HomeComponent)(i0.ɵɵdirectiveInject(i1.ClientService), i0.ɵɵdirectiveInject(i2.AppComponent), i0.ɵɵdirectiveInject(i3.HttpClient), i0.ɵɵdirectiveInject(i4.Router), i0.ɵɵdirectiveInject(i5.UserService));\n    };\n    static #_2 = this.ɵcmp = /*@__PURE__*/i0.ɵɵdefineComponent({\n      type: HomeComponent,\n      selectors: [[\"app-home\"]],\n      decls: 35,\n      vars: 8,\n      consts: [[1, \"home-container\"], [1, \"parking-info\"], [1, \"parking-table\"], [4, \"ngFor\", \"ngForOf\"], [1, \"user-info\"], [1, \"user-details\"], [\"alt\", \"Client Logo\", 1, \"client-logo\", 3, \"src\"]],\n      template: function HomeComponent_Template(rf, ctx) {\n        if (rf & 1) {\n          i0.ɵɵelementStart(0, \"div\", 0)(1, \"div\", 1)(2, \"h1\");\n          i0.ɵɵtext(3, \"Informa\\u00E7\\u00F5es de Estacionamento\");\n          i0.ɵɵelementEnd();\n          i0.ɵɵelementStart(4, \"table\", 2)(5, \"thead\")(6, \"tr\")(7, \"th\");\n          i0.ɵɵtext(8, \"Andar\");\n          i0.ɵɵelementEnd();\n          i0.ɵɵelementStart(9, \"th\");\n          i0.ɵɵtext(10, \"Total de Vagas\");\n          i0.ɵɵelementEnd();\n          i0.ɵɵelementStart(11, \"th\");\n          i0.ɵɵtext(12, \"Vagas Livres\");\n          i0.ɵɵelementEnd();\n          i0.ɵɵelementStart(13, \"th\");\n          i0.ɵɵtext(14, \"Vagas Ocupadas\");\n          i0.ɵɵelementEnd()()();\n          i0.ɵɵelementStart(15, \"tbody\");\n          i0.ɵɵtemplate(16, HomeComponent_tr_16_Template, 9, 4, \"tr\", 3);\n          i0.ɵɵelementStart(17, \"tr\")(18, \"td\")(19, \"strong\");\n          i0.ɵɵtext(20, \"Total\");\n          i0.ɵɵelementEnd()();\n          i0.ɵɵelementStart(21, \"td\");\n          i0.ɵɵtext(22);\n          i0.ɵɵelementEnd();\n          i0.ɵɵelementStart(23, \"td\");\n          i0.ɵɵtext(24);\n          i0.ɵɵelementEnd();\n          i0.ɵɵelementStart(25, \"td\");\n          i0.ɵɵtext(26);\n          i0.ɵɵelementEnd()()()()();\n          i0.ɵɵelementStart(27, \"div\", 4);\n          i0.ɵɵelement(28, \"app-clock\");\n          i0.ɵɵelementStart(29, \"div\", 5)(30, \"div\");\n          i0.ɵɵtext(31);\n          i0.ɵɵelementEnd();\n          i0.ɵɵelementStart(32, \"div\");\n          i0.ɵɵtext(33);\n          i0.ɵɵelementEnd();\n          i0.ɵɵelement(34, \"img\", 6);\n          i0.ɵɵelementEnd()()();\n        }\n        if (rf & 2) {\n          i0.ɵɵadvance(16);\n          i0.ɵɵproperty(\"ngForOf\", ctx.parkingData || i0.ɵɵpureFunction0(7, _c0));\n          i0.ɵɵadvance(6);\n          i0.ɵɵtextInterpolate(ctx.totalVagas);\n          i0.ɵɵadvance(2);\n          i0.ɵɵtextInterpolate(ctx.vagasLivres);\n          i0.ɵɵadvance(2);\n          i0.ɵɵtextInterpolate(ctx.vagasOcupadas);\n          i0.ɵɵadvance(5);\n          i0.ɵɵtextInterpolate(ctx.userName);\n          i0.ɵɵadvance(2);\n          i0.ɵɵtextInterpolate(ctx.userRole);\n          i0.ɵɵadvance();\n          i0.ɵɵproperty(\"src\", ctx.clientLogo, i0.ɵɵsanitizeUrl);\n        }\n      },\n      dependencies: [i6.NgForOf, i7.ClockComponent],\n      styles: [\".home-container[_ngcontent-%COMP%]{display:flex;justify-content:space-between;padding:20px;background-color:#f7f7f7;color:#333;flex-wrap:wrap}.parking-info[_ngcontent-%COMP%]{flex:1;margin-right:20px}.parking-table[_ngcontent-%COMP%]{width:100%;border-collapse:collapse;background-color:#fff}.parking-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%], .parking-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{border:1px solid #ccc;padding:10px;text-align:center}.parking-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%]{background-color:#4caf50;color:#fff}.parking-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{background-color:#f2f2f2}.user-info[_ngcontent-%COMP%]{flex-basis:300px;text-align:right;background-color:#fff;padding:20px;border-radius:10px;box-shadow:0 0 10px #0000001a;margin-top:20px}.user-details[_ngcontent-%COMP%]{margin-top:20px}.client-logo[_ngcontent-%COMP%]{margin-top:20px;max-width:100%;height:auto}select[_ngcontent-%COMP%]{margin-top:10px;padding:5px;border-radius:5px;border:1px solid #ccc}app-clock[_ngcontent-%COMP%]{display:block;font-size:18px;color:#333;margin-bottom:20px}@media screen and (max-width: 768px){.home-container[_ngcontent-%COMP%]{flex-direction:column;padding:10px}.parking-info[_ngcontent-%COMP%]{margin-right:0;margin-bottom:20px}.user-info[_ngcontent-%COMP%]{text-align:left;padding:15px;box-shadow:none}.parking-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%], .parking-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{font-size:14px;padding:8px}}@media screen and (max-width: 480px){.home-container[_ngcontent-%COMP%]{padding:5px}.parking-info[_ngcontent-%COMP%]{margin-bottom:15px}.user-info[_ngcontent-%COMP%]{text-align:left;padding:10px}.parking-table[_ngcontent-%COMP%]   th[_ngcontent-%COMP%], .parking-table[_ngcontent-%COMP%]   td[_ngcontent-%COMP%]{font-size:12px;padding:6px}.user-info[_ngcontent-%COMP%], .parking-info[_ngcontent-%COMP%]{width:100%}select[_ngcontent-%COMP%]{font-size:14px}app-clock[_ngcontent-%COMP%]{font-size:16px}.client-logo[_ngcontent-%COMP%]{max-width:80%}}\\n\\n/*# sourceMappingURL=home.component.css.map*/\"]\n    });\n  }\n  return HomeComponent;\n})();","map":{"version":3,"names":["interval","environment","devLog","i0","ɵɵelementStart","ɵɵtext","ɵɵelementEnd","ɵɵadvance","ɵɵtextInterpolate","ground_r1","name_ground","parking_ground_total","parking_ground_free","parking_ground_busy","HomeComponent","constructor","clientService","appComponent","http","router","userService","userName","userRole","clients","selectedClient","clientLogo","parkingData","totalVagas","vagasLivres","vagasOcupadas","ngOnInit","startAutoUpdate","loadParkingData","console","log","userId","getUserId","loadClients","storedClientId","localStorage","getItem","userAccessData","getUserAccessData","parkingAccess","length","map","p","id","name","parkingName","selected","find","toString","updateClientLogo","nome","cargo","setSelectedClient","getParkingData","clientSubscription","selectedClient$","subscribe","clientId","setItem","onClientChange","selectedClientObj","client","id_customer","url","apiUrlBackEndExternaApiDB","headers","device","get","data","Array","isArray","calculateTotals","error","ground","updateSubscription","numericValue","stopAutoUpdate","unsubscribe","warn","reduce","sum","g","ngOnDestroy","logout","navigate","_","ɵɵdirectiveInject","i1","ClientService","i2","AppComponent","i3","HttpClient","i4","Router","i5","UserService","_2","selectors","decls","vars","consts","template","HomeComponent_Template","rf","ctx","ɵɵtemplate","HomeComponent_tr_16_Template","ɵɵelement","ɵɵproperty","ɵɵpureFunction0","_c0","ɵɵsanitizeUrl"],"sources":["/root/rfcontavagas_hom/12.-Servidor-local-Docker/Front-Parking-Angular/src/app/home/home.component.ts","/root/rfcontavagas_hom/12.-Servidor-local-Docker/Front-Parking-Angular/src/app/home/home.component.html"],"sourcesContent":["import { Component, OnInit, OnDestroy } from '@angular/core';\nimport { ClientService } from '../services/client.service';\nimport { HttpClient } from '@angular/common/http';\nimport { Router } from '@angular/router';\nimport { Subscription, interval } from 'rxjs';\nimport { UserService } from '../services/user.service';\nimport { environment } from '../environments/environment';\nimport { AppComponent } from '../app.component';\nimport { devLog } from '../utils/dev-log'; // ajuste o caminho se necessário\n\nimport { HttpClientTestingModule } from '@angular/common/http/testing';\n\n@Component({\n  selector: 'app-home',\n  templateUrl: './home.component.html',\n  styleUrls: ['./home.component.css']\n})\nexport class HomeComponent implements OnInit, OnDestroy {\n  userName = '';\n  userRole = '';\n  clients: any[] = [];\n  selectedClient = '';\n  clientLogo = 'assets/img/path-to-client-logo.png';\n\n  parkingData: any[] = [];\n  totalVagas = 0;\n  vagasLivres = 0;\n  vagasOcupadas = 0;\n\n  private clientSubscription?: Subscription;\n  private updateSubscription?: Subscription;\n  constructor(\n    private clientService: ClientService,\n    private appComponent: AppComponent,\n    private http: HttpClient,\n    private router: Router,\n    private userService: UserService\n  ) {}\n\n  ngOnInit(): void {\n    this.startAutoUpdate(); // 🚀 dispara atualização automática\n    this.loadParkingData();\n\n    console.log('[ngOnInit] Componente Home inicializado.');\n    const userId = this.userService.getUserId();\n    console.log(`[ngOnInit] ID do usuário: ${userId}`);\n\n    this.appComponent.loadClients();\n\n    const storedClientId = localStorage.getItem('selectedClientId');\n    if (storedClientId) {\n      this.selectedClient = storedClientId;\n    }\n\n    const userAccessData = this.userService.getUserAccessData();\n    if (userAccessData?.parkingAccess?.length > 0) {\n      this.clients = userAccessData.parkingAccess.map((p: any) => ({\n        id: p.id,\n        name: p.parkingName\n      }));\n\n      const selected = userAccessData.parkingAccess.find((p: any) => p.id == +this.selectedClient) || userAccessData.parkingAccess[0];\n      this.selectedClient = selected.id.toString();\n      this.updateClientLogo(selected.id);\n      this.userName = `Nome do Usuário: ${selected.nome}`;\n      this.userRole = `Cargo do Usuário: ${selected.cargo}`;\n      this.clientService.setSelectedClient(selected.id);\n      this.getParkingData(selected.id);\n    }\n\n    this.clientSubscription = this.clientService.selectedClient$.subscribe(clientId => {\n      this.selectedClient = clientId;\n      localStorage.setItem('selectedClientId', clientId.toString());\n      this.updateClientLogo(+clientId);\n      this.getParkingData(+clientId);\n    });\n\n    this.startAutoUpdate();\n  }\n\n  onClientChange(): void {\n    const selectedClientObj = this.clients.find(client => client.id.toString() === this.selectedClient);\n    if (selectedClientObj) {\n      this.updateClientLogo(selectedClientObj.id);\n      localStorage.setItem('selectedClientId', selectedClientObj.id.toString());\n\n      const userAccessData = this.userService.getUserAccessData();\n      const selected = userAccessData?.parkingAccess?.find((p: any) => p.id === selectedClientObj.id);\n      if (selected) {\n        this.userName = `Nome do Usuário: ${selected.nome}`;\n        this.userRole = `Cargo do Usuário: ${selected.cargo}`;\n      }\n\n      this.getParkingData(selectedClientObj.id);\n    }\n  }\n\n  updateClientLogo(clientId: number): void {\n    this.clientLogo = `assets/img/cliente-${clientId}.png`;\n  }\n\n\n  getParkingData(id_customer: number): void {\n    const url = `${environment.apiUrlBackEndExternaApiDB}/v1/spark-customers/ground/{\"id_customer\":${id_customer},\"id_park\":1}`;\n    const headers = { device: 'manager' };\n  \n    devLog('[getParkingData] Iniciando requisição para:', url);\n    devLog('[getParkingData] Headers:', headers);\n  \n    this.http.get<any>(url, { headers }).subscribe(\n      (data: any) => {\n        devLog('[getParkingData] Dados recebidos da API:', data);\n  \n        if (Array.isArray(data)) {\n          this.parkingData = data;\n          devLog('[getParkingData] Dados atribuídos ao parkingData com sucesso.');\n        } else {\n          this.parkingData = [];\n          devLog('[getParkingData] Dados recebidos não são um array. parkingData setado como array vazio.');\n        }\n  \n        this.calculateTotals();\n        devLog('[getParkingData] Totais calculados:', {\n          totalVagas: this.totalVagas,\n          vagasLivres: this.vagasLivres,\n          vagasOcupadas: this.vagasOcupadas\n        });\n      },\n      error => {\n        console.error('[getParkingData] Erro:', error);\n        devLog('[getParkingData] Erro na requisição:', error);\n        this.parkingData = []; // evita erro no template em caso de falha\n      }\n    );\n  }\n  \n\n  calculateTotals(): void {\n    this.totalVagas = this.vagasLivres = this.vagasOcupadas = 0;\n    for (const ground of this.parkingData) {\n      this.totalVagas += ground.parking_ground_total;\n      this.vagasLivres += ground.parking_ground_free;\n      this.vagasOcupadas += ground.parking_ground_busy;\n    }\n  }\n\n\n  startAutoUpdate(): void {\n    devLog('[startAutoUpdate] Iniciando atualização automática a cada 10s.');\n  \n    this.updateSubscription = interval(10000).subscribe(() => {\n      const userAccessData = this.userService.getUserAccessData();\n      const numericValue = +this.selectedClient;\n  \n      devLog('[startAutoUpdate] Cliente selecionado:', numericValue);\n      devLog('[startAutoUpdate] Dados de acesso do usuário:', userAccessData);\n  \n      const selected = userAccessData?.parkingAccess?.find((p: any) => p.id === numericValue);\n  \n      if (selected) {\n        this.userName = `Nome do Usuário: ${selected.nome}`;\n        this.userRole = `Cargo do Usuário: ${selected.cargo}`;\n        this.updateClientLogo(numericValue);\n  \n        devLog('[startAutoUpdate] Nome e cargo atualizados:', {\n          nome: selected.nome,\n          cargo: selected.cargo\n        });\n      } else {\n        devLog('[startAutoUpdate] Nenhum acesso encontrado para o cliente:', numericValue);\n      }\n      devLog('[startAutoUpdate] acesso encontrado para o cliente:', numericValue);\n\n      this.getParkingData(numericValue);\n    });\n  }\n  \n\n  stopAutoUpdate(): void {\n    if (this.updateSubscription) {\n      this.updateSubscription.unsubscribe();\n    }\n  }\n  loadParkingData(): void {\n    const clientId = localStorage.getItem('selectedClient') || '1';\n    const url = `${environment.apiUrlBackEndExternaApiDB}/v1/spark-customers/ground/{\"id_customer\":${clientId},\"id_park\":1}`;\n    const headers = { device: 'manager' };\n  \n    this.http.get<any>(url, { headers }).subscribe(\n      data => {\n        // ✅ Garante que parkingData sempre seja um array\n        if (Array.isArray(data)) {\n          this.parkingData = data;\n        } else {\n          console.warn('[loadParkingData] Resposta inesperada:', data);\n          this.parkingData = [];\n        }\n  \n        this.totalVagas = this.parkingData.reduce((sum, g) => sum + g.parking_ground_total, 0);\n        this.vagasLivres = this.parkingData.reduce((sum, g) => sum + g.parking_ground_free, 0);\n        this.vagasOcupadas = this.parkingData.reduce((sum, g) => sum + g.parking_ground_busy, 0);\n      },\n      error => {\n        console.error('[loadParkingData] Erro ao carregar dados de estacionamento:', error);\n        this.parkingData = []; // ❗ evita erro no template\n      }\n    );\n  }\n  \n\n  ngOnDestroy(): void {\n    this.stopAutoUpdate();\n    this.clientSubscription?.unsubscribe();\n  }\n\n  logout(): void {\n    this.router.navigate(['/login']);\n  }\n}\n","<div class=\"home-container\">\r\n  <!-- Informações de Estacionamento -->\r\n  <div class=\"parking-info\">\r\n    <h1>Informações de Estacionamento</h1>\r\n    <table class=\"parking-table\">\r\n      <thead>\r\n        <tr>\r\n          <th>Andar</th>\r\n          <th>Total de Vagas</th>\r\n          <th>Vagas Livres</th>\r\n          <th>Vagas Ocupadas</th>\r\n        </tr>\r\n      </thead>\r\n      <tbody>\r\n        <tr *ngFor=\"let ground of parkingData || []\">\r\n          <td>{{ ground.name_ground }}</td>\r\n          <td>{{ ground.parking_ground_total }}</td>\r\n          <td>{{ ground.parking_ground_free }}</td>\r\n          <td>{{ ground.parking_ground_busy }}</td>\r\n        </tr>\r\n        <tr>\r\n          <td><strong>Total</strong></td>\r\n          <td>{{ totalVagas }}</td>\r\n          <td>{{ vagasLivres }}</td>\r\n          <td>{{ vagasOcupadas }}</td>\r\n        </tr>\r\n      </tbody>\r\n    </table>\r\n  </div>\r\n\r\n  <!-- Informações do Usuário -->\r\n  <div class=\"user-info\">\r\n    <app-clock></app-clock>\r\n\r\n    <div class=\"user-details\">\r\n      <div>{{ userName }}</div> <!-- Nome do Usuário -->\r\n      <div>{{ userRole }}</div> <!-- Cargo do Usuário -->\r\n      <img [src]=\"clientLogo\" alt=\"Client Logo\" class=\"client-logo\">\r\n    </div>\r\n  </div>\r\n</div>\r\n"],"mappings":"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","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}