import 'package:flutter/material.dart';
import 'package:sqflite/sqflite.dart';

import '../data/api_response.dart';
import '../services/base_service.dart';
import '../models/models.dart';
import '../services/services.dart';
import '../services/repo_service.dart';

class SucursalViewModel<T> extends ChangeNotifier {
  List<Sucursal> _sucursales = [];
  bool _isLoading = false;

  List<Sucursal> get sucursales => _sucursales;
  bool get isLoading => _isLoading;

  Future<void> fetchLocalSucursales() async {
    var db = await RepoService().db;
    var query = await db!
        .query('Sucursal', where: 'eliminado IS NULL', orderBy: 'id asc');
    _sucursales = query.map((element) => Sucursal.fromJson(element)).toList();
    notifyListeners();
  }

  Future<void> setSelectedSucursal(Sucursal sucursal) async {
    var db = await RepoService().db;

    await db!.update(
      'Sucursal',
      {'seleccionado': 0},
    );

    sucursal.seleccionado = 1;
    await RepoService().guardar(sucursal);

    await fetchLocalSucursales();
  }

  Future<bool> sincronizarSucursales() async {
    try {
      final response = ApiResponse(await BaseService().get('/pos/sucursal'));

      if (response.isOk && response.resultados != null) {
        List<Sucursal> sucursalesApi =
            response.resultados!.map((json) => Sucursal.fromApi(json)).toList();

        if (sucursalesApi.isNotEmpty) {
          await RepoService().sincronizarSucursales(sucursalesApi);
          notifyListeners();
          return true;
        }
      }
      return false;
    } catch (e) {
      print('Error al sincronizar sucursales: $e');
      return false;
    }
  }

  Future<void> sincronizarSucursalesDesdeApi() async {
    setIsLoading(true);
    try {
      bool sucursalesSincronizadas = await sincronizarSucursales();
      if (sucursalesSincronizadas) {
        await fetchLocalSucursales();
      }
      print('Sucursales sincronizadas: $sucursalesSincronizadas');
    } catch (e, stackTrace) {
      print("Error al sincronizar sucursales: $e\n$stackTrace");
    } finally {
      setIsLoading(false);
    }
  }

  void setIsLoading(bool loading) {
    _isLoading = loading;
    notifyListeners();
  }
}
