unit local_db;

interface

uses
  System.SysUtils, System.Classes, FireDAC.Stan.Intf, FireDAC.Stan.Option,
  FireDAC.Stan.Error, FireDAC.UI.Intf, FireDAC.Phys.Intf, FireDAC.Stan.Def,
  FireDAC.Stan.Pool, FireDAC.Stan.Async, FireDAC.Phys, FireDAC.Phys.SQLite,
  FireDAC.Phys.SQLiteDef, FireDAC.VCLUI.Wait, FireDAC.Comp.Client, Data.DB;

procedure InicializarBaseDatosLocal(const AFileName: string);

implementation

procedure InicializarBaseDatosLocal(const AFileName: string);
var
  LConn: TFDConnection;
begin
  LConn := TFDConnection.Create(nil);
  try
    LConn.Params.Clear;
    LConn.Params.Add('DriverID=SQLite');
    LConn.Params.Add('Database=' + AFileName);
    LConn.LoginPrompt := False;
    LConn.Connected := True;

    // 1. Tablas Locales de Transaccion Offline (Colas de subida)
    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS movimiento_mesas_local (' +
      'id INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'fecha TEXT NOT NULL,' +
      'mesa TEXT NOT NULL,' +
      'idt INTEGER NOT NULL,' +
      'TRABAJADOR TEXT NOT NULL,' +
      'ENTRADA_REAL TEXT,' +
      'SALIDA_REAL TEXT,' +
      'ENTRADA_AJUSTADA TEXT,' +
      'SALIDA_AJUSTADA TEXT,' +
      'HORASREALES TEXT,' +
      'HORASAJUSTADAS TEXT,' +
      'PUESTO TEXT NOT NULL,' +
      'TIPOTRABAJO TEXT NOT NULL,' +
      'ARTICULO TEXT NOT NULL,' +
      'PARCELA TEXT NOT NULL,' +
      'estado INTEGER NOT NULL DEFAULT 1,' +
      'num_limpiadora INTEGER)'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS produccion_local (' +
      'id INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'fecha TEXT NOT NULL,' +
      'hora TEXT NOT NULL,' +
      'mesa TEXT NOT NULL,' +
      'bascula TEXT NOT NULL,' +
      'idt INTEGER NOT NULL,' +
      'embasadora TEXT NOT NULL,' +
      'materia_prima TEXT NOT NULL,' +
      'producto TEXT NOT NULL,' +
      'tara REAL NOT NULL,' +
      'peso_teorico REAL NOT NULL,' +
      'peso_real REAL NOT NULL,' +
      'estado INTEGER NOT NULL DEFAULT 1)'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS rendimiento_local (' +
      'id INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'fecha TEXT NOT NULL,' +
      'hora TEXT NOT NULL,' +
      'idt INTEGER NOT NULL,' +
      'trabajador TEXT NOT NULL,' +
      'materia_prima TEXT NOT NULL,' +
      'peso_bruto REAL NOT NULL,' +
      'tara REAL,' +
      'pesoneto REAL,' +
      'estado INTEGER NOT NULL DEFAULT 1,' +
      'num_limpiadora INTEGER)'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS desbloqueos_local (' +
      'id INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'fecha TEXT NOT NULL,' +
      'hora TEXT NOT NULL,' +
      'envasadora TEXT,' +
      'mesa TEXT NOT NULL,' +
      'bascula TEXT NOT NULL,' +
      'estado INTEGER NOT NULL)'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS trabajo_diario_local (' +
      'id INTEGER PRIMARY KEY AUTOINCREMENT,' +
      'fecha TEXT,' +
      'parcela TEXT,' +
      'idt INTEGER,' +
      'trabajador TEXT,' +
      'typework TEXT,' +
      'articulo TEXT,' +
      'qhoras REAL,' +
      'precio REAL NOT NULL,' +
      'total REAL NOT NULL,' +
      'estadotrabajodiario TEXT NOT NULL DEFAULT ''S'',' +
      'estado INTEGER NOT NULL DEFAULT 1,' +
      'origen TEXT,' +
      'fechainsmod TEXT,' +
      'usuario INTEGER,' +
      'control INTEGER)'
    );

    // 2. Tablas Maestras locales (Espejo/Cache de lectura MySQL)
    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS trabajos_almacen (' +
      'id INTEGER PRIMARY KEY,' +
      'puesto TEXT NOT NULL,' +
      'tipo_trabajo TEXT NOT NULL,' +
      'articulo TEXT NOT NULL,' +
      'parcela TEXT NOT NULL,' +
      'mesas TEXT NOT NULL DEFAULT ''*'',' +
      'activo INTEGER NOT NULL DEFAULT 1)'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS almacen_sector (' +
      'ide INTEGER NOT NULL,' +
      'id INTEGER NOT NULL,' +
      'descripcion TEXT NOT NULL,' +
      'idalmacen INTEGER NOT NULL,' +
      'descalmacen TEXT NOT NULL,' +
      'PRIMARY KEY (ide, id))'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS empresa (' +
      'id INTEGER PRIMARY KEY,' +
      'cif TEXT,' +
      'nombre TEXT NOT NULL,' +
      'direccion TEXT,' +
      'poblacion TEXT,' +
      'provincia TEXT,' +
      'cp TEXT,' +
      'ajusteentrada INTEGER,' +
      'ajustesalida INTEGER,' +
      'porcbloqueo INTEGER,' +
      'active INTEGER)'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS productos (' +
      'ide INTEGER NOT NULL,' +
      'id INTEGER NOT NULL,' +
      'codigo TEXT NOT NULL,' +
      'descripcion TEXT NOT NULL,' +
      'tara REAL NOT NULL,' +
      'peso REAL NOT NULL,' +
      'errorpeso REAL NOT NULL,' +
      'pesadomanual INTEGER NOT NULL DEFAULT 0,' +
      'activo INTEGER NOT NULL DEFAULT 1,' +
      'mostrar_boton INTEGER NOT NULL DEFAULT 0,' +
      'PRIMARY KEY (ide, id, codigo))'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS materias_primas (' +
      'idempresa INTEGER NOT NULL,' +
      'id TEXT NOT NULL,' +
      'variedad TEXT NOT NULL,' +
      'descripcion TEXT NOT NULL,' +
      'activo INTEGER NOT NULL DEFAULT 1,' +
      'pesopieza REAL,' +
      'PRIMARY KEY (idempresa, id))'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS productos_sector (' +
      'ide INTEGER NOT NULL,' +
      'idsector INTEGER NOT NULL,' +
      'codigo TEXT NOT NULL,' +
      'descripcion TEXT,' +
      'PRIMARY KEY (ide, idsector, codigo))'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS materias_primas_sector (' +
      'ide INTEGER NOT NULL,' +
      'idsector INTEGER NOT NULL,' +
      'mprima TEXT NOT NULL,' +
      'PRIMARY KEY (ide, idsector, mprima))'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS sectores_mesas (' +
      'ide INTEGER NOT NULL,' +
      'idsector INTEGER NOT NULL,' +
      'id INTEGER NOT NULL,' +
      'descripcion TEXT NOT NULL,' +
      'descsector TEXT NOT NULL,' +
      'PRIMARY KEY (ide, idsector, id))'
    );

    LConn.ExecSQL(
      'CREATE TABLE IF NOT EXISTS calendario_laboral (' +
      'fecha TEXT PRIMARY KEY,' +
      'festivo INTEGER DEFAULT 0,' +
      'almuerzo INTEGER DEFAULT 0,' +
      'merienda INTEGER DEFAULT 0,' +
      'inicio_almuerzo TEXT,' +
      'fin_almuerzo TEXT,' +
      'inicio_merienda TEXT,' +
      'fin_merienda TEXT)'
    );

    // 3. Tablas transaccionales espejo (cache de solo lectura)
    LConn.ExecSQL('CREATE TABLE IF NOT EXISTS movimiento_mesas (id INTEGER PRIMARY KEY, fecha TEXT, mesa TEXT, idt INTEGER, TRABAJADOR TEXT, ENTRADA_REAL TEXT, SALIDA_REAL TEXT, puesto TEXT)');
    LConn.ExecSQL('CREATE TABLE IF NOT EXISTS produccion (id INTEGER PRIMARY KEY, fecha TEXT, hora TEXT, mesa TEXT, bascula TEXT, idt INTEGER, embasadora TEXT, materia_prima TEXT, producto TEXT, peso_real REAL)');
    LConn.ExecSQL('CREATE TABLE IF NOT EXISTS rendimiento (id INTEGER PRIMARY KEY, fecha TEXT, hora TEXT, idt INTEGER, trabajador TEXT, peso_bruto REAL)');
    LConn.ExecSQL('CREATE TABLE IF NOT EXISTS trabajo_diario (id INTEGER PRIMARY KEY, fecha TEXT, trabajador TEXT, qhoras REAL)');

    LConn.Connected := False;
  finally
    LConn.Free;
  end;
end;

end.
