import sys

pas_file = r"c:\fuentes\proyectos delphi\AGRIGEST\GESTION\fentradas.pas"
dfm_file = r"c:\fuentes\proyectos delphi\AGRIGEST\GESTION\fentradas.dfm"

# 1. Modify PAS
with open(pas_file, 'r', encoding='latin1') as f:
    pas_lines = f.readlines()

new_pas = []
added_uses = False
added_method_decl = False
added_method_impl = False
added_components = False

for i, line in enumerate(pas_lines):
    new_pas.append(line)
    
    # Add to uses
    if "uses" in line.lower() and "Winapi.Windows" in line and not added_uses:
        new_pas[-1] = line.replace("uses", "uses uIAInvoiceExtractor,")
        added_uses = True
        
    # Add Components to form class
    if "Tentradas = class(TForm)" in line and not added_components:
        new_pas.append("    BtImportarDocumento: TButton;\n")
        new_pas.append("    OpenDialog1: TOpenDialog;\n")
        new_pas.append("    procedure BtImportarDocumentoClick(Sender: TObject);\n")
        added_components = True

    # Add implementation
    if "implementation" in line.lower() and not added_method_impl:
        added_method_impl = True
        # Read the rest, wait we can just insert the function right after {$R *.dfm}
        
pas_content = "".join(new_pas)

meth_text = """
procedure Tentradas.BtImportarDocumentoClick(Sender: TObject);
var
  Extractor: TIAInvoiceExtractor;
  Res: TIAInvoiceResult;
  idProveedor, idCabecera, I: Integer;
begin
  if not OpenDialog1.Execute then Exit;

  if dm.tempresa.State = dsInactive then dm.tempresa.Open;
  
  Screen.Cursor := crHourGlass;
  Extractor := TIAInvoiceExtractor.Create;
  try
    Application.ProcessMessages;
    Res := Extractor.Extraer(OpenDialog1.FileName, 
                             dm.tempresa.FieldByName('IAmodelo').AsString, 
                             dm.tempresa.FieldByName('apikey').AsString);
    Screen.Cursor := crDefault;
    
    if not Res.Exito then
    begin
      ShowMessage('Error de IA: ' + Res.MensajeError);
      Exit;
    end;
    
    if Res.Cabecera.ProveedorNIF = '' then
    begin
      ShowMessage('La Inteligencia Artificial no devolvio un NIF valido.');
      Exit;
    end;
    
    // Base de datos (Insert) - 1. Proveedor
    qaux.SQL.Clear;
    qaux.SQL.Add('SELECT id FROM proveedores WHERE cif = ' + QuotedStr(Res.Cabecera.ProveedorNIF) + ' AND idempresa = ' + dm.tempresaid.AsString);
    qaux.Open;
    if qaux.RecordCount > 0 then
      idProveedor := qaux.FieldByName('id').AsInteger
    else
    begin
      qaux.SQL.Clear;
      qaux.SQL.Add('SELECT MAX(id) + 1 FROM proveedores WHERE Idempresa = ' + dm.tempresaid.AsString);
      qaux.Open;
      idProveedor := qaux.Fields[0].AsInteger;
      if idProveedor = 0 then idProveedor := 1;
      
      qaux.SQL.Clear;
      qaux.SQL.Add('INSERT INTO proveedores (id, Idempresa, cif, nombre) VALUES (' +
                   IntToStr(idProveedor) + ', ' +
                   dm.tempresaid.AsString + ', ' +
                   QuotedStr(Res.Cabecera.ProveedorNIF) + ', ' +
                   QuotedStr(Copy(Res.Cabecera.ProveedorNombre, 1, 60)) + ')');
      qaux.ExecSQL;
      qproveedores.Refresh;
    end;
    
    // 2. Cabecera Entrada
    entradas.Append;
    entradas.FieldByName('idempresa').AsInteger := dm.tempresaid.AsInteger;
    entradas.FieldByName('idproveedor').AsInteger := idProveedor;
    
    try
      entradas.FieldByName('fecha').AsDateTime := EncodeDate(StrToInt(Copy(Res.Cabecera.Fecha,1,4)), StrToInt(Copy(Res.Cabecera.Fecha,6,2)), StrToInt(Copy(Res.Cabecera.Fecha,9,2)));
    except
      entradas.FieldByName('fecha').AsDateTime := Date; 
    end;
    
    entradas.FieldByName('documento').AsString := Res.Cabecera.NumDocumento;
    entradas.Post;
    
    idCabecera := entradas.FieldByName('id').AsInteger;
    
    // 3. Lineas
    for I := 0 to Length(Res.Lineas) - 1 do
    begin
      entradas_detalle.Append;
      entradas_detalle.FieldByName('idempresa').AsInteger := dm.tempresaid.AsInteger;
      entradas_detalle.FieldByName('identrada').AsInteger := idCabecera;
      
      qaux.SQL.Clear;
      qaux.SQL.Add('SELECT id_propio, descripcion FROM proveedores_articulos WHERE idproveedor = ' + IntToStr(idProveedor) + 
                   ' AND id = ' + QuotedStr(Res.Lineas[I].Codigo) + ' AND idempresa = ' + dm.tempresaid.AsString);
      qaux.Open;
      if qaux.RecordCount > 0 then
      begin
        entradas_detalle.FieldByName('id_propio').AsString := qaux.FieldByName('id_propio').AsString;
        entradas_detalle.FieldByName('descripcion').AsString := qaux.FieldByName('descripcion').AsString;
      end
      else
      begin
        entradas_detalle.FieldByName('descripcion').AsString := Res.Lineas[I].Descripcion;
      end;
      
      entradas_detalle.FieldByName('codigo').AsString := Res.Lineas[I].Codigo;
      entradas_detalle.FieldByName('cantidad').AsFloat := Res.Lineas[I].Cantidad;
      entradas_detalle.FieldByName('precio').AsFloat := Res.Lineas[I].Precio;
      // entradas_detalle.FieldByName('tipo_iva').AsFloat := Res.Lineas[I].TipoIVA;
      
      entradas_detalle.Post;
    end;
    
    qentradas.Refresh;
    entradas.Refresh;
    ShowMessage('Entrada importada exitosamente.');
    
  finally
    Extractor.Free;
    Screen.Cursor := crDefault;
  end;
end;
"""

pas_content = pas_content.replace("{$R *.dfm}", "{$R *.dfm}\n" + meth_text)

with open(pas_file, 'w', encoding='latin1') as f:
    f.write(pas_content)


# 2. Modify DFM
with open(dfm_file, 'r', encoding='latin1') as f:
    dfm_lines = f.readlines()

dfm_new = []
in_panel6 = False
added_btn = False
for line in dfm_lines:
    if "object Panel6: TPanel" in line:
        in_panel6 = True
    
    if in_panel6 and "object BtENuevo" in line and not added_btn:
        btn_dfm = """    object BtImportarDocumento: TButton
      Left = 330
      Top = 1
      Width = 100
      Height = 38
      Align = alLeft
      Caption = 'Importar Doc. (IA)'
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = [fsBold]
      ParentFont = False
      TabOrder = 6
      OnClick = BtImportarDocumentoClick
    end
"""
        dfm_new.append(btn_dfm)
        added_btn = True
        
    dfm_new.append(line)

dfm_new.append("""
  object OpenDialog1: TOpenDialog
    Filter = 'Todos (PDF, Imagen, XML)|*.*'
    Left = 400
    Top = 32
  end
""")

with open(dfm_file, 'w', encoding='latin1') as f:
    f.writelines(dfm_new)

print("Modificados fentradas.pas y fentradas.dfm con extio!")
