import { Injectable } from '@nestjs/common';
import { TenantConnectionService } from '../../database/tenant-connection.service';
import { CooperativeSettings } from '../../database/tenant/entities/cooperative-settings.entity';

const DEFAULT_SETTINGS = [
  { key: 'coop_name',       label: 'Cooperative Name',      labelNe: 'सहकारीको नाम',       group: 'general',   dataType: 'text',   value: '' },
  { key: 'coop_name_ne',    label: 'Name (Nepali)',          labelNe: 'नेपालीमा नाम',        group: 'general',   dataType: 'text',   value: '' },
  { key: 'coop_address',    label: 'Address',               labelNe: 'ठेगाना',              group: 'general',   dataType: 'text',   value: '' },
  { key: 'coop_address_ne', label: 'Address (Nepali)',       labelNe: 'नेपालीमा ठेगाना',     group: 'general',   dataType: 'text',   value: '' },
  { key: 'coop_phone',      label: 'Phone',                 labelNe: 'फोन नम्बर',           group: 'general',   dataType: 'text',   value: '' },
  { key: 'coop_email',      label: 'Email',                 labelNe: 'इमेल',                group: 'general',   dataType: 'email',  value: '' },
  { key: 'coop_website',    label: 'Website',               labelNe: 'वेबसाइट',             group: 'general',   dataType: 'url',    value: '' },
  { key: 'coop_reg_no',     label: 'Registration Number',   labelNe: 'दर्ता नम्बर',         group: 'legal',     dataType: 'text',   value: '' },
  { key: 'coop_pan_vat',    label: 'PAN / VAT Number',      labelNe: 'प्यान / भ्याट नम्बर', group: 'legal',     dataType: 'text',   value: '' },
  { key: 'coop_est_date',   label: 'Established Date (AD)', labelNe: 'स्थापना मिति (ई.)',   group: 'legal',     dataType: 'date',   value: '' },
  { key: 'coop_est_date_bs',label: 'Established Date (BS)', labelNe: 'स्थापना मिति (वि.सं.)',group: 'legal',    dataType: 'text',   value: '' },
  { key: 'fiscal_year',     label: 'Current Fiscal Year',   labelNe: 'हालको आर्थिक वर्ष',  group: 'finance',   dataType: 'text',   value: '' },
  { key: 'bank_name',       label: 'Bank Name',             labelNe: 'बैंकको नाम',          group: 'finance',   dataType: 'text',   value: '' },
  { key: 'bank_account',    label: 'Bank Account Number',   labelNe: 'बैंक खाता नम्बर',     group: 'finance',   dataType: 'text',   value: '' },
  { key: 'share_value',     label: 'Share Value (NPR)',      labelNe: 'सेयर मूल्य (रु.)',    group: 'finance',   dataType: 'number', value: '100' },
  { key: 'min_share',       label: 'Minimum Shares',        labelNe: 'न्यूनतम सेयर',        group: 'finance',   dataType: 'number', value: '10' },
  { key: 'working_hours',   label: 'Working Hours',         labelNe: 'कार्यालय समय',        group: 'general',   dataType: 'text',   value: 'Sunday–Friday: 10:00 AM – 4:00 PM' },
  { key: 'logo_url',        label: 'Logo URL',              labelNe: 'लोगो URL',            group: 'branding',  dataType: 'url',    value: '' },
  { key: 'primary_color',   label: 'Primary Color',         labelNe: 'मुख्य रंग',           group: 'branding',  dataType: 'color',  value: '#2563eb' },
];

@Injectable()
export class SettingsService {
  constructor(private tenantConn: TenantConnectionService) {}
  private async repo(sub: string) {
    const ds = await this.tenantConn.getTenantDataSource(sub);
    return ds.getRepository(CooperativeSettings);
  }

  async getAll(sub: string) {
    const r = await this.repo(sub);
    await this.ensureDefaults(sub, r);
    const rows = await r.find({ order: { group: 'ASC', key: 'ASC' } });
    return rows;
  }

  async getByGroup(sub: string) {
    const rows = await this.getAll(sub);
    const grouped: Record<string, typeof rows> = {};
    for (const row of rows) {
      const g = row.group ?? 'general';
      if (!grouped[g]) grouped[g] = [];
      grouped[g].push(row);
    }
    return grouped;
  }

  async updateMany(sub: string, updates: { key: string; value: string }[]) {
    const r = await this.repo(sub);
    await this.ensureDefaults(sub, r);
    const results: CooperativeSettings[] = [];
    for (const { key, value } of updates) {
      let row = await r.findOne({ where: { key } });
      if (!row) {
        const def = DEFAULT_SETTINGS.find(d => d.key === key);
        row = r.create({ key, value, label: def?.label, labelNe: def?.labelNe, group: def?.group, dataType: def?.dataType });
      } else {
        row.value = value;
      }
      results.push(await r.save(row));
    }
    return results;
  }

  private async ensureDefaults(sub: string, r: any) {
    const count = await r.count();
    if (count === 0) {
      for (const d of DEFAULT_SETTINGS) {
        await r.save(r.create(d)).catch(() => null);
      }
    }
  }
}
