import { Wilaya, Daira, Commune, Language, BilingualName } from './types';
import wilayas from './data/wilayas.json';
import dairas from './data/dairas.json';
import communes from './data/communes.json';


class AlgerianWilayas {
      private wilayas: Wilaya[];
      private dairas: Daira[];
      private communes: Commune[];


      constructor() {
            this.wilayas = wilayas;
            this.dairas = dairas;
            this.communes = communes;
      }


      getAllWilayas(): Wilaya[] {
            return this.wilayas;
      }


      getWilayaByCode(code: string): Wilaya | undefined {
            return this.wilayas.find(w => w.code === code);
      }


      getDairasByWilaya(wilayaCode: string): Daira[] {
            return this.dairas.filter(d => d.wilaya_code === wilayaCode);
      }


      getDairaById(dairaId: string): Daira | undefined {
            return this.dairas.find(d => d.id === dairaId);
      }

      getCommunesByWilaya(wilayaCode: string): Commune[] {
            return this.communes.filter(c => c.wilaya_code === wilayaCode);
      }


      getCommunesByDaira(dairaId: string): Commune[] {
            const daira = this.getDairaById(dairaId);
            if (!daira) return [];

            return this.communes.filter(
                  c => c.daira_name_ascii === daira.name.ascii &&
                        c.wilaya_code === daira.wilaya_code
            );
      }

      getWilayaName(code: string, language: Language = 'ascii'): string | undefined {
            const wilaya = this.getWilayaByCode(code);
            return wilaya?.name[language];
      }

      getWilayaStats(wilayaCode: string) {
            const communes = this.getCommunesByWilaya(wilayaCode);
            const dairas = this.getDairasByWilaya(wilayaCode);

            return {
                  totalCommunes: communes.length,
                  totalDairas: dairas.length,
                  communesPerDaira: dairas.map(daira => ({
                        daira: daira.name,
                        communeCount: this.getCommunesByDaira(daira.id).length
                  }))
            };
      }

      /**
       * Convert wilaya code to formatted string (e.g., "01" -> "01", "1" -> "01")
       */
      formatWilayaCode(code: string | number): string {
            return code.toString().padStart(2, '0');
      }
}


// Export default instance
export default new AlgerianWilayas();

// Export types
export * from './types';